aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/transform/ExtensionMethods.scala4
-rw-r--r--src/dotty/tools/dotc/transform/TailRec.scala9
-rw-r--r--src/dotty/tools/dotc/transform/TreeTransform.scala5
3 files changed, 13 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/transform/ExtensionMethods.scala b/src/dotty/tools/dotc/transform/ExtensionMethods.scala
index c140bc9a5..4adbfe164 100644
--- a/src/dotty/tools/dotc/transform/ExtensionMethods.scala
+++ b/src/dotty/tools/dotc/transform/ExtensionMethods.scala
@@ -179,9 +179,9 @@ class ExtensionMethods extends MiniPhaseTransform with DenotTransformer with Ful
extensionDefs(staticClass) = newC
newC
}
- store += fullyParameterizedDef(extensionMeth, tree)
+ store += atGroupEnd(fullyParameterizedDef(extensionMeth, tree)(_))
cpy.DefDef(tree)(tree.mods, tree.name, tree.tparams, tree.vparamss, tree.tpt,
- forwarder(extensionMeth, tree))
+ atGroupEnd(forwarder(extensionMeth, tree)(_)))
} else tree
}
}
diff --git a/src/dotty/tools/dotc/transform/TailRec.scala b/src/dotty/tools/dotc/transform/TailRec.scala
index 16764de07..82b08ef5f 100644
--- a/src/dotty/tools/dotc/transform/TailRec.scala
+++ b/src/dotty/tools/dotc/transform/TailRec.scala
@@ -84,7 +84,9 @@ class TailRec extends MiniPhaseTransform with DenotTransformer with FullParamete
case dd@DefDef(mods, name, tparams, vparamss0, tpt, rhs0)
if (dd.symbol.isEffectivelyFinal) && !((dd.symbol is Flags.Accessor) || (rhs0 eq EmptyTree) || (dd.symbol is Flags.Label)) =>
val mandatory = dd.symbol.hasAnnotation(defn.TailrecAnnotationClass)
- cpy.DefDef(dd)(rhs = {
+ atGroupEnd { implicit ctx: Context =>
+
+ cpy.DefDef(dd)(rhs = {
val origMeth = tree.symbol
val label = mkLabel(dd.symbol)
@@ -99,7 +101,7 @@ class TailRec extends MiniPhaseTransform with DenotTransformer with FullParamete
// now this speculatively transforms tree and throws away result in many cases
val rhsSemiTransformed = {
val transformer = new TailRecElimination(dd.symbol, owner, thisTpe, mandatory, label)
- val rhs = transformer.transform(rhs0)(ctx.withPhase(ctx.phase.next))
+ val rhs = atGroupEnd(transformer.transform(rhs0)(_))
rewrote = transformer.rewrote
rhs
}
@@ -114,7 +116,8 @@ class TailRec extends MiniPhaseTransform with DenotTransformer with FullParamete
ctx.error("TailRec optimisation not applicable, method not tail recursive", dd.pos)
rhs0
}
- })
+ })
+ }
case d: DefDef if d.symbol.hasAnnotation(defn.TailrecAnnotationClass) =>
ctx.error("TailRec optimisation not applicable, method is neither private nor final so can be overridden", d.pos)
d
diff --git a/src/dotty/tools/dotc/transform/TreeTransform.scala b/src/dotty/tools/dotc/transform/TreeTransform.scala
index d06e1a0d9..9e04d03b9 100644
--- a/src/dotty/tools/dotc/transform/TreeTransform.scala
+++ b/src/dotty/tools/dotc/transform/TreeTransform.scala
@@ -134,6 +134,11 @@ object TreeTransforms {
/** Transform single node using all transforms following the current one in this group */
def transformFollowing(tree: Tree)(implicit ctx: Context, info: TransformerInfo): Tree = info.group.transformSingle(tree, idx + 1)
+ def atGroupEnd[T](action : Context => T)(implicit ctx: Context, info: TransformerInfo) = {
+ val last = info.transformers(info.transformers.length - 1)
+ action(ctx.withPhase(last.phase.next))
+ }
+
/** perform context-dependant initialization */
def init(implicit ctx: Context, info: TransformerInfo): Unit = {}
}