Skip to content

Commit bdbed39

Browse files
committed
Merge pull request #142 from DarkDimius/fix-transforms-period
Fix using of wrong period for creating nested ctx in TreeTransforms
2 parents e73fab3 + 9caa07a commit bdbed39

File tree

5 files changed

+40
-10
lines changed

5 files changed

+40
-10
lines changed

src/dotty/tools/dotc/transform/TreeTransform.scala

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -875,11 +875,13 @@ object TreeTransforms {
875875
}
876876

877877
final private[TreeTransforms] def transformSingle(tree: Tree, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree =
878-
tree match {
879-
// split one big match into 2 smaller ones
880-
case tree: NameTree => goNamed(tree, cur)
881-
case tree => goUnamed(tree, cur)
882-
}
878+
if (cur < info.transformers.length) {
879+
tree match {
880+
// split one big match into 2 smaller ones
881+
case tree: NameTree => goNamed(tree, cur)
882+
case tree => goUnamed(tree, cur)
883+
}
884+
} else tree
883885

884886
def localContext(owner: Symbol)(implicit ctx: Context) = ctx.fresh.setOwner(owner)
885887

@@ -1127,11 +1129,16 @@ object TreeTransforms {
11271129
}
11281130

11291131
def transform(tree: Tree, info: TransformerInfo, cur: Int)(implicit ctx: Context): Tree = ctx.traceIndented(s"transforming ${tree.show} at ${ctx.phase}", transforms, show = true) {
1130-
tree match {
1131-
//split one big match into 2 smaller ones
1132-
case tree: NameTree => transformNamed(tree, info, cur)
1133-
case tree => transformUnnamed(tree, info, cur)
1134-
}
1132+
if (cur < info.transformers.length) {
1133+
// if cur > 0 then some of the symbols can be created by already performed transformations
1134+
// this means that their denotations could not exists in previous periods
1135+
val pctx = ctx.withPhase(info.transformers(cur))
1136+
tree match {
1137+
//split one big match into 2 smaller ones
1138+
case tree: NameTree => transformNamed(tree, info, cur)(pctx)
1139+
case tree => transformUnnamed(tree, info, cur)(pctx)
1140+
}
1141+
} else tree
11351142
}
11361143

11371144
@tailrec

test/test/DottyTest.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class DottyTest extends ContextEscapeDetection{
4242
ctx = null
4343
}
4444
private def compilerWithChecker(phase: String)(assertion:(tpd.Tree, Context) => Unit) = new Compiler {
45+
self =>
4546
override def phases = {
4647
val allPhases = super.phases
4748
val targetPhase = allPhases.flatten.find(p => p.name == phase).get

test/test/transform/CreateCompanionObjectsTest.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class CreateCompanionObjectsTest extends DottyTest {
3232

3333
override def name: String = "create all companion objects"
3434
override def predicate(cts: TypeDef)(implicit ctx:Context): Boolean = true
35+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
3536
})
3637

3738
override def name: String = "test"
@@ -56,6 +57,7 @@ class CreateCompanionObjectsTest extends DottyTest {
5657

5758
override def name: String = "create all companion modules"
5859
override def predicate(cts: TypeDef)(implicit ctx:Context): Boolean = true
60+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
5961
})
6062

6163
override def name: String = "test"
@@ -79,6 +81,7 @@ class CreateCompanionObjectsTest extends DottyTest {
7981
override def transformations = Array(new CreateCompanionObjects {
8082
override def name: String = "create all companion modules"
8183
override def predicate(cts: TypeDef)(implicit ctx:Context): Boolean = true
84+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
8285
})
8386

8487
override def name: String = "test"
@@ -102,6 +105,7 @@ class CreateCompanionObjectsTest extends DottyTest {
102105
override def transformations = Array(new CreateCompanionObjects {
103106
override def name: String = "create all companion modules"
104107
override def predicate(cts: TypeDef)(implicit ctx:Context): Boolean = cts.name.toString.contains("CREATE")
108+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
105109
})
106110

107111
override def name: String = "test"

test/test/transform/PostTyperTransformerTest.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class PostTyperTransformerTest extends DottyTest {
2424
implicit val ctx = context
2525
class EmptyTransform extends TreeTransform {
2626
override def name: String = "empty"
27+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
2728
}
2829
val transformer = new PostTyperTransformer {
2930
override def transformations = Array(new EmptyTransform)
@@ -43,6 +44,7 @@ class PostTyperTransformerTest extends DottyTest {
4344
implicit val ctx = context
4445
class EmptyTransform extends TreeTransform {
4546
override def name: String = "empty"
47+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
4648
}
4749
val transformer = new PostTyperTransformer {
4850
override def transformations = Array(new EmptyTransform)
@@ -62,6 +64,7 @@ class PostTyperTransformerTest extends DottyTest {
6264
implicit val ctx = context
6365
class EmptyTransform extends TreeTransform {
6466
override def name: String = "empty"
67+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
6568
}
6669
val transformer = new PostTyperTransformer {
6770
override def transformations = Array(new EmptyTransform)
@@ -85,6 +88,7 @@ class PostTyperTransformerTest extends DottyTest {
8588
implicit val ctx = context
8689
class EmptyTransform extends TreeTransform {
8790
override def name: String = "empty"
91+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
8892
}
8993
val transformer = new PostTyperTransformer {
9094
override def transformations = Array(new EmptyTransform)
@@ -108,6 +112,7 @@ class PostTyperTransformerTest extends DottyTest {
108112
implicit val ctx = context
109113
class EmptyTransform extends TreeTransform {
110114
override def name: String = "empty"
115+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
111116
}
112117
val transformer = new PostTyperTransformer {
113118
override def transformations = Array(new EmptyTransform)

test/test/transform/TreeTransformerTest.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class TreeTransformerTest extends DottyTest {
1717
implicit val ctx = context
1818
class EmptyTransform extends TreeTransform {
1919
override def name: String = "empty"
20+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
2021
}
2122
val transformer = new TreeTransformer {
2223
override def transformations = Array(new EmptyTransform)
@@ -38,6 +39,7 @@ class TreeTransformerTest extends DottyTest {
3839

3940
override def transformLiteral(tree: tpd.Literal)(implicit ctx: Context, info: TransformerInfo): tpd.Tree = tpd.Literal(Constant(2))
4041
override def name: String = "canReplaceConstant"
42+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
4143
}
4244
val transformer = new TreeTransformer {
4345
override def transformations = Array(new ConstantTransform)
@@ -66,11 +68,14 @@ class TreeTransformerTest extends DottyTest {
6668
)
6769
tpd.cpy.ValDef(tree, tree.mods, tree.name, tree.tpt, tpd.Literal(Constant(2)))
6870
}
71+
72+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
6973
}
7074
val transformer = new TreeTransformer {
7175
override def transformations = Array(new Transformation)
7276

7377
override def name: String = "test"
78+
7479
}
7580
val tr = transformer.transform(tree).toString
7681

@@ -99,6 +104,8 @@ class TreeTransformerTest extends DottyTest {
99104
)
100105
tpd.cpy.ValDef(tree, tree.mods, tree.name, tree.tpt, tpd.Literal(Constant(2)))
101106
}
107+
108+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
102109
}
103110
class Transformation2 extends TreeTransform {
104111
override def name: String = "transformationOrder2"
@@ -108,6 +115,8 @@ class TreeTransformerTest extends DottyTest {
108115
)
109116
tpd.cpy.ValDef(tree, tree.mods, tree.name, tree.tpt, tpd.Literal(Constant(3)))
110117
}
118+
119+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
111120
}
112121
val transformer = new TreeTransformer {
113122
override def transformations = Array(new Transformation1, new Transformation2)
@@ -143,6 +152,8 @@ class TreeTransformerTest extends DottyTest {
143152
)
144153
tpd.cpy.ValDef(tree, tree.mods, tree.name, tree.tpt, transformFollowing(tpd.Literal(Constant(2))))
145154
}
155+
156+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
146157
}
147158
var transformed2 = 0
148159
class Transformation2 extends TreeTransform {
@@ -172,6 +183,8 @@ class TreeTransformerTest extends DottyTest {
172183
)
173184
transformFollowing(tpd.cpy.ValDef(tree, tree.mods, tree.name, tree.tpt, tpd.Literal(Constant(3))))
174185
}
186+
187+
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
175188
}
176189
val transformer = new TreeTransformer {
177190
override def transformations = Array(new Transformation1, new Transformation2)

0 commit comments

Comments
 (0)