Skip to content

Commit 56e60e1

Browse files
committed
Allow phases to choose to run at group end
1 parent 9a84842 commit 56e60e1

File tree

2 files changed

+28
-25
lines changed

2 files changed

+28
-25
lines changed

compiler/src/dotty/tools/dotc/ast/tpd.scala

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -656,26 +656,27 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
656656
/** After phase `trans`, set the owner of every definition in this tree that was formerly
657657
* owner by `from` to `to`.
658658
*/
659-
def changeOwnerAfter(from: Symbol, to: Symbol, trans: DenotTransformer)(implicit ctx: Context): ThisTree = {
660-
assert(ctx.phase == trans.next)
661-
val traverser = new TreeTraverser {
662-
def traverse(tree: Tree)(implicit ctx: Context) = tree match {
663-
case tree: DefTree =>
664-
val sym = tree.symbol
665-
val prevDenot = sym.denot(ctx.withPhase(trans))
666-
if (prevDenot.effectiveOwner == from.skipWeakOwner) {
667-
val d = sym.copySymDenotation(owner = to)
668-
d.installAfter(trans)
669-
d.transformAfter(trans, d => if (d.owner eq from) d.copySymDenotation(owner = to) else d)
670-
}
671-
if (sym.isWeakOwner) traverseChildren(tree)
672-
case _ =>
673-
traverseChildren(tree)
659+
def changeOwnerAfter(from: Symbol, to: Symbol, trans: DenotTransformer)(implicit ctx: Context): ThisTree =
660+
if (ctx.phase == trans.next) {
661+
val traverser = new TreeTraverser {
662+
def traverse(tree: Tree)(implicit ctx: Context) = tree match {
663+
case tree: DefTree =>
664+
val sym = tree.symbol
665+
val prevDenot = sym.denot(ctx.withPhase(trans))
666+
if (prevDenot.effectiveOwner == from.skipWeakOwner) {
667+
val d = sym.copySymDenotation(owner = to)
668+
d.installAfter(trans)
669+
d.transformAfter(trans, d => if (d.owner eq from) d.copySymDenotation(owner = to) else d)
670+
}
671+
if (sym.isWeakOwner) traverseChildren(tree)
672+
case _ =>
673+
traverseChildren(tree)
674+
}
674675
}
676+
traverser.traverse(tree)
677+
tree
675678
}
676-
traverser.traverse(tree)
677-
tree
678-
}
679+
else changeOwnerAfter(from, to, trans)(ctx.withPhase(trans.next))
679680

680681
/** A select node with the given selector name and a computed type */
681682
def select(name: Name)(implicit ctx: Context): Select =

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ object TreeTransforms {
6262
def phase: MiniPhase
6363

6464
/** The phase at which the tree is transformed */
65-
final def treeTransformPhase: Phase = phase.next
65+
def treeTransformPhase(implicit ctx: Context, info: TransformerInfo): Phase =
66+
phase.next
6667

6768
val cpy: TypedTreeCopier = cpyBetweenPhases
6869

@@ -140,10 +141,11 @@ object TreeTransforms {
140141
/** Transform single node using all transforms following the current one in this group */
141142
def transformFollowing(tree: Tree)(implicit ctx: Context, info: TransformerInfo): Tree = info.group.transformSingle(tree, phase.idx + 1)
142143

143-
def atGroupEnd[T](action : Context => T)(implicit ctx: Context, info: TransformerInfo) = {
144-
val last = info.transformers(info.transformers.length - 1)
145-
action(ctx.withPhase(last.phase.next))
146-
}
144+
def atGroupEnd[T](action : Context => T)(implicit ctx: Context, info: TransformerInfo) =
145+
action(ctx.withPhase(groupEndPhase))
146+
147+
def groupEndPhase(implicit ctx: Context, info: TransformerInfo) =
148+
info.transformers(info.transformers.length - 1).phase.next
147149
}
148150

149151
/** A phase that defines a TreeTransform to be used in a group */
@@ -494,7 +496,7 @@ object TreeTransforms {
494496
var allDone = i < l
495497
while (i < l) {
496498
val oldTransform = result(i)
497-
val newTransform = mutator(oldTransform, tree, ctx.withPhase(oldTransform.treeTransformPhase))
499+
val newTransform = mutator(oldTransform, tree, ctx.withPhase(oldTransform.treeTransformPhase(ctx, info)))
498500
allDone = allDone && (newTransform eq NoTransform)
499501
if (!(oldTransform eq newTransform)) {
500502
if (!transformersCopied) result = result.clone()
@@ -1180,7 +1182,7 @@ object TreeTransforms {
11801182
util.Stats.record("TreeTransform.transform")
11811183
// if cur > 0 then some of the symbols can be created by already performed transformations
11821184
// this means that their denotations could not exists in previous period
1183-
val pctx = ctx.withPhase(info.transformers(cur).treeTransformPhase)
1185+
val pctx = ctx.withPhase(info.transformers(cur).treeTransformPhase(ctx, info))
11841186
tree match {
11851187
//split one big match into 2 smaller ones
11861188
case tree: NameTree => transformNamed(tree, info, cur)(pctx)

0 commit comments

Comments
 (0)