Skip to content

Commit 7af2dea

Browse files
committed
Fix miniphase assembly.
There were two architectural errors here, which confused TreeTransforms and MiniPhases and which caused "NotDefinedHere" on transformFollowing: 1. TreeTransforms should not have idx fields, MiniPhases have them.2 2. TreeTransformers initialize arrays of MiniPhases not TreeTransforms.
1 parent fdd20f4 commit 7af2dea

File tree

5 files changed

+26
-29
lines changed

5 files changed

+26
-29
lines changed

src/dotty/tools/dotc/core/Decorators.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ object Decorators {
135135
*/
136136
implicit class PhaseListDecorator(val names: List[String]) extends AnyVal {
137137
def containsPhase(phase: Phase): Boolean = phase match {
138-
case phase: TreeTransformer => phase.transformations.exists(trans => containsPhase(trans.phase))
138+
case phase: TreeTransformer => phase.miniPhases.exists(containsPhase)
139139
case _ =>
140140
names exists { name =>
141141
name == "all" || {

src/dotty/tools/dotc/core/Phases.scala

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,9 @@ object Phases {
109109
assert(false, s"Only tree transforms can be squashed, ${phase.phaseName} can not be squashed")
110110
}
111111
}
112-
val transforms = filteredPhaseBlock.asInstanceOf[List[MiniPhase]].map(_.treeTransform)
113112
val block = new TreeTransformer {
114-
override def phaseName: String = transformations.map(_.phase.phaseName).mkString("TreeTransform:{", ", ", "}")
115-
116-
override def transformations: Array[TreeTransform] = transforms.toArray
113+
override def phaseName: String = miniPhases.map(_.phaseName).mkString("TreeTransform:{", ", ", "}")
114+
override def miniPhases: Array[MiniPhase] = filteredPhaseBlock.asInstanceOf[List[MiniPhase]].toArray
117115
}
118116
prevPhases ++= filteredPhaseBlock.map(_.getClazz)
119117
block
@@ -145,7 +143,7 @@ object Phases {
145143
val flatPhases = collection.mutable.ListBuffer[Phase]()
146144

147145
phasess.foreach(p => p match {
148-
case t: TreeTransformer => flatPhases ++= t.transformations.map(_.phase)
146+
case t: TreeTransformer => flatPhases ++= t.miniPhases
149147
case _ => flatPhases += p
150148
})
151149

@@ -173,11 +171,11 @@ object Phases {
173171
val phase = phasess(i)
174172
phase match {
175173
case t: TreeTransformer =>
176-
val transforms = t.transformations
177-
transforms.foreach{ x =>
178-
checkRequirements(x.phase)
179-
x.phase.init(this, nextPhaseId)}
180-
t.init(this, transforms.head.phase.id, transforms.last.phase.id)
174+
val miniPhases = t.miniPhases
175+
miniPhases.foreach{ phase =>
176+
checkRequirements(phase)
177+
phase.init(this, nextPhaseId)}
178+
t.init(this, miniPhases.head.id, miniPhases.last.id)
181179
case _ =>
182180
phase.init(this, nextPhaseId)
183181
checkRequirements(phase)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class TreeChecker extends Phase with SymTransformer {
103103

104104
private def previousPhases(phases: List[Phase])(implicit ctx: Context): List[Phase] = phases match {
105105
case (phase: TreeTransformer) :: phases1 =>
106-
val subPhases = phase.transformations.map(_.phase)
106+
val subPhases = phase.miniPhases
107107
val previousSubPhases = previousPhases(subPhases.toList)
108108
if (previousSubPhases.length == subPhases.length) previousSubPhases ::: previousPhases(phases1)
109109
else previousSubPhases

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

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,6 @@ object TreeTransforms {
6363

6464
def treeTransformPhase: Phase = phase.next
6565

66-
/** id of this treeTransform in group */
67-
var idx: Int = _
68-
6966
def prepareForIdent(tree: Ident)(implicit ctx: Context) = this
7067
def prepareForSelect(tree: Select)(implicit ctx: Context) = this
7168
def prepareForThis(tree: This)(implicit ctx: Context) = this
@@ -137,10 +134,10 @@ object TreeTransforms {
137134
def transform(tree: Tree)(implicit ctx: Context, info: TransformerInfo): Tree = info.group.transform(tree, info, 0)
138135

139136
/** Transform subtree using all transforms following the current one in this group */
140-
def transformFollowingDeep(tree: Tree)(implicit ctx: Context, info: TransformerInfo): Tree = info.group.transform(tree, info, idx + 1)
137+
def transformFollowingDeep(tree: Tree)(implicit ctx: Context, info: TransformerInfo): Tree = info.group.transform(tree, info, phase.idx + 1)
141138

142139
/** Transform single node using all transforms following the current one in this group */
143-
def transformFollowing(tree: Tree)(implicit ctx: Context, info: TransformerInfo): Tree = info.group.transformSingle(tree, idx + 1)
140+
def transformFollowing(tree: Tree)(implicit ctx: Context, info: TransformerInfo): Tree = info.group.transformSingle(tree, phase.idx + 1)
144141

145142
def atGroupEnd[T](action : Context => T)(implicit ctx: Context, info: TransformerInfo) = {
146143
val last = info.transformers(info.transformers.length - 1)
@@ -152,14 +149,17 @@ object TreeTransforms {
152149
trait MiniPhase extends Phase { thisPhase =>
153150
def treeTransform: TreeTransform
154151

152+
/** id of this mini phase in group */
153+
var idx: Int = _
154+
155155
/** List of names of phases that should have finished their processing of all compilation units
156156
* before this phase starts
157157
*/
158158
def runsAfterGroupsOf: Set[Class[_ <: Phase]] = Set.empty
159159

160160
protected def mkTreeTransformer = new TreeTransformer {
161161
override def phaseName: String = thisPhase.phaseName
162-
override def transformations = Array(treeTransform)
162+
override def miniPhases = Array(thisPhase)
163163
}
164164

165165
override def run(implicit ctx: Context): Unit = {
@@ -197,7 +197,6 @@ object TreeTransforms {
197197

198198
@sharable val NoTransform = new TreeTransform {
199199
def phase = unsupported("phase")
200-
idx = -1
201200
}
202201

203202
type Mutator[T] = (TreeTransform, T, Context) => TreeTransform
@@ -474,7 +473,7 @@ object TreeTransforms {
474473
/** A group of tree transforms that are applied in sequence during the same phase */
475474
abstract class TreeTransformer extends Phase {
476475

477-
def transformations: Array[TreeTransform]
476+
def miniPhases: Array[MiniPhase]
478477

479478
override def run(implicit ctx: Context): Unit = {
480479
val curTree = ctx.compilationUnit.tpdTree
@@ -549,10 +548,10 @@ object TreeTransforms {
549548
val prepForStats: Mutator[List[Tree]] = (trans, trees, ctx) => trans.prepareForStats(trees)(ctx)
550549
val prepForUnit: Mutator[Tree] = (trans, tree, ctx) => trans.prepareForUnit(tree)(ctx)
551550

552-
val initialTransformationsCache = transformations.zipWithIndex.map {
553-
case (transform, id) =>
554-
transform.idx = id
555-
transform
551+
val initialTransformationsCache = miniPhases.zipWithIndex.map {
552+
case (miniPhase, id) =>
553+
miniPhase.idx = id
554+
miniPhase.treeTransform
556555
}
557556

558557
val initialInfoCache = new TransformerInfo(initialTransformationsCache, new NXTransformations(initialTransformationsCache), this)

test/test/transform/TreeTransformerTest.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class TreeTransformerTest extends DottyTest {
2020
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
2121
}
2222
val transformer = new TreeTransformer {
23-
override def transformations = Array(new EmptyTransform)
23+
override def miniPhases = Array(new EmptyTransform)
2424

2525
override def phaseName: String = "test"
2626
}
@@ -42,7 +42,7 @@ class TreeTransformerTest extends DottyTest {
4242
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
4343
}
4444
val transformer = new TreeTransformer {
45-
override def transformations = Array(new ConstantTransform)
45+
override def miniPhases = Array(new ConstantTransform)
4646

4747
override def phaseName: String = "test"
4848
}
@@ -72,7 +72,7 @@ class TreeTransformerTest extends DottyTest {
7272
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
7373
}
7474
val transformer = new TreeTransformer {
75-
override def transformations = Array(new Transformation)
75+
override def miniPhases = Array(new Transformation)
7676

7777
override def phaseName: String = "test"
7878

@@ -119,7 +119,7 @@ class TreeTransformerTest extends DottyTest {
119119
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
120120
}
121121
val transformer = new TreeTransformer {
122-
override def transformations = Array(new Transformation1, new Transformation2)
122+
override def miniPhases = Array(new Transformation1, new Transformation2)
123123

124124
override def phaseName: String = "test"
125125
}
@@ -187,7 +187,7 @@ class TreeTransformerTest extends DottyTest {
187187
init(ctx, ctx.period.firstPhaseId, ctx.period.lastPhaseId)
188188
}
189189
val transformer = new TreeTransformer {
190-
override def transformations = Array(new Transformation1, new Transformation2)
190+
override def miniPhases = Array(new Transformation1, new Transformation2)
191191

192192
override def phaseName: String = "test"
193193
}

0 commit comments

Comments
 (0)