8000 Merge pull request #5101 from sjrd/desugaring-separate-phase · scala-js/scala-js@76f7be7 · GitHub
[go: up one dir, main page]

Skip to content

Commit 76f7be7

Browse files
authored
Merge pull request #5101 from sjrd/desugaring-separate-phase
Add a desugaring pass between the base linker and the optimizer.
2 parents 48ddd57 + 1987d87 commit 76f7be7

File tree

20 files changed

+343
-61
lines changed

20 files changed

+343
-61
lines changed

ir/shared/src/main/scala/org/scalajs/ir/ScalaJSVersions.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import java.util.concurrent.ConcurrentHashMap
1717
import scala.util.matching.Regex
1818

1919
object ScalaJSVersions extends VersionChecks(
20-
current = "1.18.3-SNAPSHOT",
20+
current = "1.19.0-SNAPSHOT",
2121
binaryEmitted = "1.18"
2222
)
2323

ir/shared/src/main/scala/org/scalajs/ir/Transformers.scala

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -234,14 +234,8 @@ object Transformers {
234234
case jsMethodDef: JSMethodDef =>
235235
transformJSMethodDef(jsMethodDef)
236236

237-
case JSPropertyDef(flags, name, getterBody, setterArgAndBody) =>
238-
JSPropertyDef(
239-
flags,
240-
transform(name),
241-
transformTreeOpt(getterBody),
242-
setterArgAndBody.map { case (arg, body) =>
243-
(arg, transform(body))
244-
})(Unversioned)(jsMethodPropDef.pos)
237+
case jsPropertyDef: JSPropertyDef =>
238+
transformJSPropertyDef(jsPropertyDef)
245239
}
246240
}
247241

@@ -251,6 +245,18 @@ object Transformers {
251245
jsMethodDef.optimizerHints, Unversioned)(jsMethodDef.pos)
252246
}
253247

248+
def transformJSPropertyDef(jsPropertyDef: JSPropertyDef): JSPropertyDef = {
249+
val JSPropertyDef(flags, name, getterBody, setterArgAndBody) = jsPropertyDef
250+
JSPropertyDef(
251+
flags,
252+
transform(name),
253+
transformTreeOpt(getterBody),
254+
setterArgAndBody.map { case (arg, body) =>
255+
(arg, transform(body))
256+
}
257+
)(Unversioned)(jsPropertyDef.pos)
258+
}
259+
254260
def transformJSConstructorBody(body: JSConstructorBody): JSConstructorBody = {
255261
implicit val pos = body.pos
256262

linker/shared/src/main/scala/org/scalajs/linker/analyzer/Analysis.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ object Analysis {
8484
def methodInfos(
8585
namespace: MemberNamespace): scala.collection.Map[MethodName, MethodInfo]
8686

87+
def anyJSMemberNeedsDesugaring: Boolean
88+
8789
def displayName: String = className.nameString
8890
}
8991

@@ -103,6 +105,7 @@ object Analysis {
103105
def instantiatedSubclasses: scala.collection.Seq[ClassInfo]
104106
def nonExistent: Boolean
105107
def syntheticKind: MethodSyntheticKind
108+
def needsDesugaring: Boolean
106109

107110
def displayName: String = methodName.displayName
108111

@@ -161,6 +164,7 @@ object Analysis {
161164
def owningClass: ClassName
162165
def staticDependencies: scala.collection.Set[ClassName]
163166
def externalDependencies: scala.collection.Set[String]
167+
def needsDesugaring: Boolean
164168
}
165169

166170
sealed trait Error {

linker/shared/src/main/scala/org/scalajs/linker/analyzer/Analyzer.scala

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,9 @@ private class AnalyzerRun(config: CommonPhaseConfig, initial: Boolean,
686686
val publicMethodInfos: mutable.Map[MethodName, MethodInfo] =
687687
methodInfos(MemberNamespace.Public)
688688

689+
def anyJSMemberNeedsDesugaring: Boolean =
690+
data.jsMethodProps.exists(info => (info.globalFlags & ReachabilityInfo.FlagNeedsDesugaring) != 0)
691+
689692
def lookupAbstractMethod(methodName: MethodName): MethodInfo = {
690693
val candidatesIterator = for {
691694
ancestor <- ancestors.iterator
@@ -1285,6 +1288,9 @@ private class AnalyzerRun(config: CommonPhaseConfig, initial: Boolean,
12851288
def isDefaultBridge: Boolean =
12861289
syntheticKind.isInstanceOf[MethodSyntheticKind.DefaultBridge]
12871290

1291+
def needsDesugaring: Boolean =
1292+
(data.globalFlags & ReachabilityInfo.FlagNeedsDesugaring) != 0
1293+
12881294
/** Throws MatchError if `!isDefaultBridge`. */
12891295
def defaultBridgeTarget: ClassName = (syntheticKind: @unchecked) match {
12901296
case MethodSyntheticKind.DefaultBridge(target) => target
@@ -1367,6 +1373,9 @@ private class AnalyzerRun(config: CommonPhaseConfig, initial: Boolean,
13671373
def staticDependencies: scala.collection.Set[ClassName] = _staticDependencies.keySet
13681374
def externalDependencies: scala.collection.Set[String] = _externalDependencies.keySet
13691375

1376+
def needsDesugaring: Boolean =
1377+
(data.reachability.globalFlags & ReachabilityInfo.FlagNeedsDesugaring) != 0
1378+
13701379
def reach(): Unit = followReachabilityInfo(data.reachability, this)(FromExports)
13711380
}
13721381

@@ -1441,7 +1450,7 @@ private class AnalyzerRun(config: CommonPhaseConfig, initial: Boolean,
14411450
}
14421451
}
14431452

1444-
val globalFlags = data.globalFlags
1453+
val globalFlags = data.globalFlags & ~ReachabilityInfo.FlagNeedsDesugaring
14451454

14461455
if (globalFlags != 0) {
14471456
if ((globalFlags & ReachabilityInfo.FlagAccessedClassClass) != 0) {

linker/shared/src/main/scala/org/scalajs/linker/analyzer/Infos.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ object Infos {
115115
final val FlagAccessedImportMeta = 1 << 2
116116
final val FlagUsedExponentOperator = 1 << 3
117117
final val FlagUsedClassSuperClass = 1 << 4
118+
final val FlagNeedsDesugaring = 1 << 5
118119
}
119120

120121
/** Things from a given class that are reached by one method. */
@@ -395,6 +396,7 @@ object Infos {
395396
setFlag(ReachabilityInfo.FlagUsedClassSuperClass)
396397

397398
def addReferencedLinkTimeProperty(linkTimeProperty: LinkTimeProperty): this.type = {
399+
setFlag(ReachabilityInfo.FlagNeedsDesugaring)
398400
linkTimeProperties.append((linkTimeProperty.name, linkTimeProperty.tpe))
399401
this
400402
}

linker/shared/src/main/scala/org/scalajs/linker/backend/emitter/FunctionEmitter.scala

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,9 +1260,8 @@ private[emitter] class FunctionEmitter(sjsGen: SJSGen) {
12601260

12611261
def test(tree: Tree): Boolean = tree match {
12621262
// Atomic expressions
1263-
case _: Literal => true
1264-
case _: JSNewTarget => true
1265-
case _: LinkTimeProperty => true
1263+
case _: Literal => true
1264+
case _: JSNewTarget => true
12661265

12671266
// Vars (side-effect free, pure if immutable)
12681267
case VarRef(name) =>
@@ -2811,11 +2810,6 @@ private[emitter] class FunctionEmitter(sjsGen: SJSGen) {
28112810
case AsInstanceOf(expr, tpe) =>
28122811
extractWithGlobals(genAsInstanceOf(transformExprNoChar(expr), tpe))
28132812

2814-
case prop: LinkTimeProperty =>
2815-
transformExpr(
2816-
config.coreSpec.linkTimeProperties.transformLinkTimeProperty(prop),
2817-
preserveChar)
2818-
28192813
// Transients
28202814

28212815
case Transient(Cast(expr, tpe)) =>

linker/shared/src/main/scala/org/scalajs/linker/backend/wasmemitter/DerivedClasses.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ object DerivedClasses {
146146
staticDependencies = Set.empty,
147147
externalDependencies = Set.empty,
148148
dynamicDependencies = Set.empty,
149+
desugaringRequirements = LinkedClass.DesugaringRequirements.Empty,
149150
clazz.version
150151
)
151152
}

linker/shared/src/main/scala/org/scalajs/linker/backend/wasmemitter/FunctionEmitter.scala

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,6 @@ private class FunctionEmitter private (
550550
case t: Match => genMatch(t, expectedType)
551551
case t: Debugger => VoidType // ignore
552552
case t: Skip => VoidType
553-
case t: LinkTimeProperty => genLinkTimeProperty(t)
554553

555554
// JavaScript expressions
556555
case t: JSNew => genJSNew(t)
@@ -590,7 +589,7 @@ private class FunctionEmitter private (
590589
// Transients (only generated by the optimizer)
591590
case t: Transient => genTransient(t)
592591

593-
case _: JSSuperConstructorCall =>
592+
case _:JSSuperConstructorCall | _:LinkTimeProperty =>
594593
throw new AssertionError(s"Invalid tree: $tree")
595594
}
596595

@@ -2649,12 +2648,6 @@ private class FunctionEmitter private (
26492648
ClassType(boxClassName, nullable = false)
26502649
}
26512650

2652-
private def genLinkTimeProperty(tree: LinkTimeProperty): Type = {
2653-
val lit = ctx.coreSpec.linkTimeProperties.transformLinkTimeProperty(tree)
2654-
genLiteral(lit, lit.tpe)
2655-
lit.tpe
2656-
}
2657-
26582651
private def genJSNew(tree: JSNew): Type = {
26592652
val JSNew(ctor, args) = tree
26602653

linker/shared/src/main/scala/org/scalajs/linker/checker/CheckingPhase.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,6 @@ sealed abstract class CheckingPhase
2424
object CheckingPhase {
2525
case object Compiler extends CheckingPhase
2626
case object BaseLinker extends CheckingPhase
27+
case object Desugarer extends CheckingPhase
2728
case object Optimizer extends CheckingPhase
2829
}

linker/shared/src/main/scala/org/scalajs/linker/checker/ClassDefChecker.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,8 @@ private final class ClassDefChecker(classDef: ClassDef,
855855
}
856856

857857
case LinkTimeProperty(name) =>
858+
if (!featureSet.supports(FeatureSet.LinkTimeProperty))
859+
reportError(i"Illegal link-time property '$name' after desugaring")
858860

859861
// JavaScript expressions
860862

0 commit comments

Comments
 (0)
0