diff options
author | odersky <odersky@gmail.com> | 2014-07-17 11:00:53 +0200 |
---|---|---|
committer | odersky <odersky@gmail.com> | 2014-07-17 11:00:53 +0200 |
commit | bdbed3934affb22095771c0a4858759a8b813f23 (patch) | |
tree | 35e5308865031b8b1a64858de6d89e7ccc1e06e0 | |
parent | e73fab33efbcffcbd2c41121066024a1d8266933 (diff) | |
parent | 9caa07a15a312a2b208fb346a5301258be62983b (diff) | |
download | dotty-bdbed3934affb22095771c0a4858759a8b813f23.tar.gz dotty-bdbed3934affb22095771c0a4858759a8b813f23.tar.bz2 dotty-bdbed3934affb22095771c0a4858759a8b813f23.zip |
Merge pull request #142 from DarkDimius/fix-transforms-period
Fix using of wrong period for creating nested ctx in TreeTransforms
-rw-r--r-- | src/dotty/tools/dotc/transform/TreeTransform.scala | 27 | ||||
-rw-r--r-- | test/test/DottyTest.scala | 1 | ||||
-rw-r--r-- | test/test/transform/CreateCompanionObjectsTest.scala | 4 | ||||
-rw-r--r-- | test/test/transform/PostTyperTransformerTest.scala | 5 | ||||
-rw-r--r-- | test/test/transform/TreeTransformerTest.scala | 13 |
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) |