aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/transform/TreeTransform.scala27
-rw-r--r--test/test/DottyTest.scala1
-rw-r--r--test/test/transform/CreateCompanionObjectsTest.scala4
-rw-r--r--test/test/transform/PostTyperTransformerTest.scala5
-rw-r--r--test/test/transform/TreeTransformerTest.scala13
5 files changed, 40 insertions, 10 deletions
diff --git a/src/dotty/tools/dotc/transform/TreeTransform.scala b/src/dotty/tools/dotc/transform/TreeTransform.scala
index 1bce0de66..347762678 100644
--- a/src/dotty/tools/dotc/transform/TreeTransform.scala
+++ b/src/dotty/tools/dotc/transform/TreeTransform.scala
@@ -875,11 +875,13 @@ object TreeTransforms {
}
final private[TreeTransforms] def transformSingle(tree: Tree, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree =
- tree match {
- // split one big match into 2 smaller ones
- case tree: NameTree => goNamed(tree, cur)
- case tree => goUnamed(tree, cur)
- }
+ if (cur < info.transformers.length) {
+ tree match {
+ // split one big match into 2 smaller ones
+ case tree: NameTree => goNamed(tree, cur)
+ case tree => goUnamed(tree, cur)
+ }
+ } else tree
def localContext(owner: Symbol)(implicit ctx: Context) = ctx.fresh.setOwner(owner)
@@ -1127,11 +1129,16 @@ object TreeTransforms {
}
def transform(tree: Tree, info: TransformerInfo, cur: Int)(implicit ctx: Context): Tree = ctx.traceIndented(s"transforming ${tree.show} at ${ctx.phase}", transforms, show = true) {
- tree match {
- //split one big match into 2 smaller ones
- case tree: NameTree => transformNamed(tree, info, cur)
- case tree => transformUnnamed(tree, info, cur)
- }
+ if (cur < info.transformers.length) {
+ // if cur > 0 then some of the symbols can be created by already performed transformations
+ // this means that their denotations could not exists in previous periods
+ val pctx = ctx.withPhase(info.transformers(cur))
+ tree match {
+ //split one big match into 2 smaller ones
+ case tree: NameTree => transformNamed(tree, info, cur)(pctx)
+ case tree => transformUnnamed(tree, info, cur)(pctx)
+ }
+ } else tree
}
@tailrec
diff --git a/test/test/DottyTest.scala b/test/test/DottyTest.scala
index 4efb1e615..06a31fa6a 100644
--- a/test/test/DottyTest.scala
+++ b/test/test/DottyTest.scala
@@ -42,6 +42,7 @@ class DottyTest extends ContextEscapeDetection{
ctx = null
}
private def compilerWithChecker(phase: String)(assertion:(tpd.Tree, Context) => Unit) = new Compiler {
+ self =>
override def phases = {
val allPhases = super.phases
val targetPhase = allPhases.flatten.find(p => p.name == phase).get
diff --git a/test/test/transform/CreateCompanionObjectsTest.scala b/test/test/transform/CreateCompanionObjectsTest.scala
index 0a50cb942..05f4e1062 100644
--- a/test/test/transform/CreateCompanionObjectsTest.scala
+++ b/test/test/transform/CreateCompanionObjectsTest.scala
@@ -32,6 +32,7 @@ class CreateCompanionObjectsTest extends DottyTest {
override def name: String = "create all companion objects"
override def predicate(cts: TypeDef)(implicit ctx:Context): Boolean = true
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
})
override def name: String = "test"
@@ -56,6 +57,7 @@ class CreateCompanionObjectsTest extends DottyTest {
override def name: String = "create all companion modules"
override def predicate(cts: TypeDef)(implicit ctx:Context): Boolean = true
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
})
override def name: String = "test"
@@ -79,6 +81,7 @@ class CreateCompanionObjectsTest extends DottyTest {
override def transformations = Array(new CreateCompanionObjects {
override def name: String = "create all companion modules"
override def predicate(cts: TypeDef)(implicit ctx:Context): Boolean = true
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
})
override def name: String = "test"
@@ -102,6 +105,7 @@ class CreateCompanionObjectsTest extends DottyTest {
override def transformations = Array(new CreateCompanionObjects {
override def name: String = "create all companion modules"
override def predicate(cts: TypeDef)(implicit ctx:Context): Boolean = cts.name.toString.contains("CREATE")
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
})
override def name: String = "test"
diff --git a/test/test/transform/PostTyperTransformerTest.scala b/test/test/transform/PostTyperTransformerTest.scala
index 040f871a2..0c3f222c7 100644
--- a/test/test/transform/PostTyperTransformerTest.scala
+++ b/test/test/transform/PostTyperTransformerTest.scala
@@ -24,6 +24,7 @@ class PostTyperTransformerTest extends DottyTest {
implicit val ctx = context
class EmptyTransform extends TreeTransform {
override def name: String = "empty"
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
}
val transformer = new PostTyperTransformer {
override def transformations = Array(new EmptyTransform)
@@ -43,6 +44,7 @@ class PostTyperTransformerTest extends DottyTest {
implicit val ctx = context
class EmptyTransform extends TreeTransform {
override def name: String = "empty"
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
}
val transformer = new PostTyperTransformer {
override def transformations = Array(new EmptyTransform)
@@ -62,6 +64,7 @@ class PostTyperTransformerTest extends DottyTest {
implicit val ctx = context
class EmptyTransform extends TreeTransform {
override def name: String = "empty"
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
}
val transformer = new PostTyperTransformer {
override def transformations = Array(new EmptyTransform)
@@ -85,6 +88,7 @@ class PostTyperTransformerTest extends DottyTest {
implicit val ctx = context
class EmptyTransform extends TreeTransform {
override def name: String = "empty"
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
}
val transformer = new PostTyperTransformer {
override def transformations = Array(new EmptyTransform)
@@ -108,6 +112,7 @@ class PostTyperTransformerTest extends DottyTest {
implicit val ctx = context
class EmptyTransform extends TreeTransform {
override def name: String = "empty"
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
}
val transformer = new PostTyperTransformer {
override def transformations = Array(new EmptyTransform)
diff --git a/test/test/transform/TreeTransformerTest.scala b/test/test/transform/TreeTransformerTest.scala
index 88ed9ce53..06257b48b 100644
--- a/test/test/transform/TreeTransformerTest.scala
+++ b/test/test/transform/TreeTransformerTest.scala
@@ -17,6 +17,7 @@ class TreeTransformerTest extends DottyTest {
implicit val ctx = context
class EmptyTransform extends TreeTransform {
override def name: String = "empty"
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
}
val transformer = new TreeTransformer {
override def transformations = Array(new EmptyTransform)
@@ -38,6 +39,7 @@ class TreeTransformerTest extends DottyTest {
override def transformLiteral(tree: tpd.Literal)(implicit ctx: Context, info: TransformerInfo): tpd.Tree = tpd.Literal(Constant(2))
override def name: String = "canReplaceConstant"
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
}
val transformer = new TreeTransformer {
override def transformations = Array(new ConstantTransform)
@@ -66,11 +68,14 @@ class TreeTransformerTest extends DottyTest {
)
tpd.cpy.ValDef(tree, tree.mods, tree.name, tree.tpt, tpd.Literal(Constant(2)))
}
+
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
}
val transformer = new TreeTransformer {
override def transformations = Array(new Transformation)
override def name: String = "test"
+
}
val tr = transformer.transform(tree).toString
@@ -99,6 +104,8 @@ class TreeTransformerTest extends DottyTest {
)
tpd.cpy.ValDef(tree, tree.mods, tree.name, tree.tpt, tpd.Literal(Constant(2)))
}
+
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
}
class Transformation2 extends TreeTransform {
override def name: String = "transformationOrder2"
@@ -108,6 +115,8 @@ class TreeTransformerTest extends DottyTest {
)
tpd.cpy.ValDef(tree, tree.mods, tree.name, tree.tpt, tpd.Literal(Constant(3)))
}
+
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
}
val transformer = new TreeTransformer {
override def transformations = Array(new Transformation1, new Transformation2)
@@ -143,6 +152,8 @@ class TreeTransformerTest extends DottyTest {
)
tpd.cpy.ValDef(tree, tree.mods, tree.name, tree.tpt, transformFollowing(tpd.Literal(Constant(2))))
}
+
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
}
var transformed2 = 0
class Transformation2 extends TreeTransform {
@@ -172,6 +183,8 @@ class TreeTransformerTest extends DottyTest {
)
transformFollowing(tpd.cpy.ValDef(tree, tree.mods, tree.name, tree.tpt, tpd.Literal(Constant(3))))
}
+
+ init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
}
val transformer = new TreeTransformer {
override def transformations = Array(new Transformation1, new Transformation2)