8000 Reorganize LinkTimeProperties. · scala-js/scala-js@55ff3cf · GitHub
[go: up one dir, main page]

Skip to content

Commit 55ff3cf

Browse files
committed
Reorganize LinkTimeProperties.
* Move it to `frontend`. * Make it public. * Move the logic of `validate` and `transformLinkTimeProperty` to their respective call sites. * Construct them from a CoreSpec, rather than being contained by CoreSpec. These changes better isolate the data (`LinkTimeProperties`) from the transformations we apply to that data (the logic in `Analyzer` and `Desugarer`).
1 parent 619202c commit 55ff3cf

File tree

5 files changed

+52
-37
lines changed

5 files changed

+52
-37
lines changed

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import org.scalajs.ir.WellKnownNames._
3131

3232
import org.scalajs.linker._
3333
import org.scalajs.linker.checker.CheckingPhase
34-
import org.scalajs.linker.frontend.{IRLoader, LambdaSynthesizer, SyntheticClassKind}
34+
import org.scalajs.linker.frontend.{IRLoader, LambdaSynthesizer, LinkTimeProperties, SyntheticClassKind}
3535
import org.scalajs.linker.interface._
3636
import org.scalajs.linker.interface.unstable.ModuleInitializerImpl
3737
import org.scalajs.linker.standard._
@@ -47,6 +47,8 @@ import Infos.{NamespacedMethodName, ReachabilityInfo, ReachabilityInfoInClass}
4747
final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
4848
checkIRFor: Option[CheckingPhase], failOnError: Boolean, irLoader: IRLoader) {
4949

50+
private val linkTimeProperties = LinkTimeProperties.fromCoreSpec(config.coreSpec)
51+
5052
private val infoLoader: InfoLoader =
5153
new InfoLoader(irLoader, checkIRFor)
5254

@@ -55,7 +57,7 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
5557

5658
infoLoader.update(logger)
5759

58-
val run = new AnalyzerRun(config, initial, infoLoader)(
60+
val run = new AnalyzerRun(config, initial, infoLoader, linkTimeProperties)(
5961
adjustExecutionContextForParallelism(ec, config.parallel))
6062

6163
run
@@ -99,7 +101,10 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
99101
}
100102

101103
private class AnalyzerRun(config: CommonPhaseConfig, initial: Boolean,
102-
infoLoader: InfoLoader)(implicit ec: ExecutionContext) extends Analysis {
104+
infoLoader: InfoLoader, linkTimeProperties: LinkTimeProperties)(
105+
implicit ec: ExecutionContext)
106+
extends Analysis {
107+
103108
import AnalyzerRun._
104109

105110
private val allowAddingSyntheticMethods = initial
@@ -1539,7 +1544,7 @@ private class AnalyzerRun(config: CommonPhaseConfig, initial: Boolean,
15391544

15401545
if (data.referencedLinkTimeProperties.nonEmpty) {
15411546
for ((name, tpe) <- data.referencedLinkTimeProperties) {
1542-
if (!config.coreSpec.linkTimeProperties.validate(name, tpe)) {
1547+
if (!linkTimeProperties.get(name).exists(_.tpe == tpe)) {
15431548
_errors ::= InvalidLinkTimeProperty(name, tpe, from)
15441549
}
15451550
}

linker/shared/src/main/scala/org/scalajs/linker/frontend/Desugarer.scala

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ import org.scalajs.ir.{Position, Version}
2828
final class Desugarer(config: CommonPhaseConfig, checkIR: Boolean) {
2929
import Desugarer._
3030

31-
private val desugarTransformer = new DesugarTransformer(config.coreSpec)
31+
private val linkTimeProperties = LinkTimeProperties.fromCoreSpec(config.coreSpec)
32+
33+
private val desugarTransformer = new DesugarTransformer(linkTimeProperties)
3234

3335
def desugar(unit: LinkingUnit, logger: Logger): LinkingUnit = {
3436
val result = logger.time("Desugarer: Desugar") {
@@ -118,7 +120,7 @@ final class Desugarer(config: CommonPhaseConfig, checkIR: Boolean) {
118120

119121
private[linker] object Desugarer {
120122

121-
private final class DesugarTransformer(coreSpec: CoreSpec)
123+
private final class DesugarTransformer(linkTimeProperties: LinkTimeProperties)
122124
extends ClassTransformer {
123125

124126
/* Cache the names generated for lambda classes because computing their
@@ -135,8 +137,17 @@ private[linker] object Desugarer {
135137

136138
override def transform(tree: Tree): Tree = {
137139
tree match {
138-
case prop: LinkTimeProperty =>
139-
coreSpec.linkTimeProperties.transformLinkTimeProperty(prop)
140+
case LinkTimeProperty(name) =>
141+
implicit val pos = tree.pos
142+
val value = linkTimeProperties.get(name).getOrElse {
143+
throw new IllegalArgumentException(
144+
s"link time property not found: 'name' of type ${tree.tpe}")
145+
A93C }
146+
value match {
147+
case LinkTimeProperties.LinkTimeBoolean(value) => BooleanLiteral(value)
148+
case LinkTimeProperties.LinkTimeInt(value) => IntLiteral(value)
149+
case LinkTimeProperties.LinkTimeString(value) => StringLiteral(value)
150+
}
140151

141152
case NewLambda(descriptor, fun) =>
142153
implicit val pos = tree.pos

linker/shared/src/main/scala/org/scalajs/linker/standard/LinkTimeProperties.scala renamed to linker/shared/src/main/scala/org/scalajs/linker/frontend/LinkTimeProperties.scala

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,16 @@
1010
* additional information regarding copyright ownership.
1111
*/
1212

13-
package org.scalajs.linker.standard
13+
package org.scalajs.linker.frontend
1414

15-
import org.scalajs.ir.{Types => jstpe, Trees => js}
1615
import org.scalajs.ir.Trees.LinkTimeProperty._
16+
import org.scalajs.ir.Types._
1717
import org.scalajs.ir.ScalaJSVersions
18-
import org.scalajs.ir.Position.NoPosition
19-
import org.scalajs.linker.interface.{Semantics, ESFeatures}
2018

21-
private[linker] final class LinkTimeProperties (
19+
import org.scalajs.linker.interface.{ESVersion => _, _}
20+
import org.scalajs.linker.standard.CoreSpec
21+
22+
final class LinkTimeProperties private (
2223
semantics: Semantics,
2324
esFeatures: ESFeatures,
2425
targetIsWebAssembly: Boolean
@@ -38,31 +39,29 @@ private[linker] final class LinkTimeProperties (
3839
LinkTimeString(ScalaJSVersions.current)
3940
)
4041

41-
def validate(name: String, tpe: jstpe.Type): Boolean = {
42-
linkTimeProperties.get(name).exists {
43-
case _: LinkTimeBoolean => tpe == jstpe.BooleanType
44-
case _: LinkTimeInt => tpe == jstpe.IntType
45-
case _: LinkTimeString => tpe == jstpe.StringType
46-
}
47-
}
42+
def get(name: String): Option[LinkTimeValue] =
43+
linkTimeProperties.get(name)
44+
}
4845

49-
def transformLinkTimeProperty(prop: js.LinkTimeProperty): js.Literal = {
50-
val value = linkTimeProperties.getOrElse(prop.name,
51-
throw new IllegalArgumentException(s"link time property not found: '${prop.name}' of type ${prop.tpe}"))
52-
value match {
53-
case LinkTimeBoolean(value) =>
54-
js.BooleanLiteral(value)(prop.pos)
55-
case LinkTimeInt(value) =>
56-
js.IntLiteral(value)(prop.pos)
57-
case LinkTimeString(value) =>
58-
js.StringLiteral(value)(prop.pos)
46+
object LinkTimeProperties {
47+
sealed abstract class LinkTimeValue {
48+
def tpe: Type = this match {
49+
case LinkTimeInt(_) => IntType
50+
case LinkTimeBoolean(_) => BooleanType
51+
case LinkTimeString(_) => StringType
5952
}
6053
}
61-
}
6254

63-
private[linker] object LinkTimeProperties {
64-
sealed abstract class LinkTimeValue
6555
final case class LinkTimeInt(value: Int) extends LinkTimeValue
6656
final case class LinkTimeBoolean(value: Boolean) extends LinkTimeValue
67-
final case class LinkTimeString(value: String) extends LinkTimeValue
57+
58+
final case class LinkTimeString(value: String) extends LinkTimeValue {
59+
// Being extra careful
60+
require(value != null, "LinkTimeString requires a non-null value.")
61+
}
62+
63+
def fromCoreSpec(coreSpec: CoreSpec): LinkTimeProperties = {
64+
new LinkTimeProperties(coreSpec.semantics, coreSpec.esFeatures,
65+
coreSpec.targetIsWebAssembly)
66+
}
6867
}

linker/shared/src/main/scala/org/scalajs/linker/standard/CoreSpec.scala

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,6 @@ final class CoreSpec private (
9696
targetIsWebAssembly
9797
)
9898
}
99-
100-
private[linker] lazy val linkTimeProperties = new LinkTimeProperties(
101-
semantics, esFeatures, targetIsWebAssembly)
10299
}
103100

104101
private[linker] object CoreSpec {

project/BinaryIncompatibilities.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ object BinaryIncompatibilities {
88
)
99

1010
val Linker = Seq(
11+
// private[linker], not an issue
12+
ProblemFilters.exclude[DirectMissingMethodProblem]("org.scalajs.linker.standard.CoreSpec.linkTimeProperties"),
13+
ProblemFilters.exclude[MissingClassProblem]("org.scalajs.linker.standard.LinkTimeProperties*"),
1114
)
1215

1316
val LinkerInterface = Seq(

0 commit comments

Comments
 (0)
0