aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/TreeTransform.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-08-09 13:45:29 +0200
committerMartin Odersky <odersky@gmail.com>2014-08-09 13:45:29 +0200
commit57c6c85cbc953a3489ee8d16bb5b7be862183924 (patch)
treeb00bc4ac442e376b9a8da38ca9d5a4039e7630b6 /src/dotty/tools/dotc/transform/TreeTransform.scala
parent9024f25e78a9fe5d27dd2c30aa24999d8901dab6 (diff)
downloaddotty-57c6c85cbc953a3489ee8d16bb5b7be862183924.tar.gz
dotty-57c6c85cbc953a3489ee8d16bb5b7be862183924.tar.bz2
dotty-57c6c85cbc953a3489ee8d16bb5b7be862183924.zip
Disentangle phases from treetransforms
TreeTransforms are no longer phases. This allows to generate new transforms in prepare... methods without running into the problem that thee new transforms are undefined as phases. It also makes for a cleaner separation of concerns.
Diffstat (limited to 'src/dotty/tools/dotc/transform/TreeTransform.scala')
-rw-r--r--src/dotty/tools/dotc/transform/TreeTransform.scala107
1 files changed, 61 insertions, 46 deletions
diff --git a/src/dotty/tools/dotc/transform/TreeTransform.scala b/src/dotty/tools/dotc/transform/TreeTransform.scala
index c39ca90cc..129553264 100644
--- a/src/dotty/tools/dotc/transform/TreeTransform.scala
+++ b/src/dotty/tools/dotc/transform/TreeTransform.scala
@@ -9,6 +9,7 @@ import dotty.tools.dotc.core.Flags.PackageVal
import dotty.tools.dotc.typer.Mode
import dotty.tools.dotc.ast.Trees._
import dotty.tools.dotc.core.Decorators._
+import dotty.tools.dotc.util.DotClass
import scala.annotation.tailrec
import config.Printers.transforms
@@ -50,16 +51,13 @@ object TreeTransforms {
* (4) chain 7 out of 20 transformations over the resulting tree node. I believe the current algorithm is suitable
* for achieving this goal, but there can be no wasted cycles anywhere.
*/
- abstract class TreeTransform extends Phase {
+ abstract class TreeTransform extends DotClass {
+
+ def phase: MiniPhase
/** id of this treeTransform in group */
var idx: Int = _
- /** List of names of phases that should have finished their processing of all compilation units
- * before this phase starts
- */
- def runsAfterGroupsOf: Set[String] = Set.empty
-
def prepareForIdent(tree: Ident)(implicit ctx: Context) = this
def prepareForSelect(tree: Select)(implicit ctx: Context) = this
def prepareForThis(tree: This)(implicit ctx: Context) = this
@@ -136,10 +134,20 @@ object TreeTransforms {
/** perform context-dependant initialization */
def init(implicit ctx: Context, info: TransformerInfo): Unit = {}
+ }
+
+ /** A phase that defines a TreeTransform to be used in a group */
+ trait MiniPhase extends Phase { thisPhase =>
+ def treeTransform: TreeTransform
+
+ /** List of names of phases that should have finished their processing of all compilation units
+ * before this phase starts
+ */
+ def runsAfterGroupsOf: Set[String] = Set.empty
protected def mkTreeTransformer = new TreeTransformer {
- override def name: String = TreeTransform.this.name
- override def transformations = Array(TreeTransform.this)
+ override def name: String = thisPhase.name
+ override def transformations = Array(treeTransform)
}
override def run(implicit ctx: Context): Unit = {
@@ -147,16 +155,23 @@ object TreeTransforms {
}
}
+ /** A mini phase that is its own tree transform */
+ abstract class MiniPhaseTransform extends TreeTransform with MiniPhase {
+ def treeTransform = this
+ def phase = this
+ }
+
val NoTransform = new TreeTransform {
- override def name: String = "NoTransform"
+ def phase = unsupported("phase")
idx = -1
}
- class Separator extends TreeTransform {
- override def name: String = "Separator"
+/* disabled; not needed anywhere
+ class Separator extends TreeTransform(phaseId) {
+ //override def name: String = "Separator"
idx = -1
}
-
+*/
type Mutator[T] = (TreeTransform, T, Context) => TreeTransform
class TransformerInfo(val transformers: Array[TreeTransform], val nx: NXTransformations, val group: TreeTransformer)
@@ -446,7 +461,7 @@ object TreeTransforms {
var allDone = i < l
while (i < l) {
val oldTransform = result(i)
- val newTransform = mutator(oldTransform, tree, ctx.withPhase(oldTransform))
+ val newTransform = mutator(oldTransform, tree, ctx.withPhase(oldTransform.phase))
allDone = allDone && (newTransform eq NoTransform)
if (!(oldTransform eq newTransform)) {
if (!transformersCopied) result = result.clone()
@@ -511,7 +526,7 @@ object TreeTransforms {
final private[TreeTransforms] def goIdent(tree: Ident, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformIdent(tree)(ctx.withPhase(trans), info) match {
+ trans.transformIdent(tree)(ctx.withPhase(trans.phase), info) match {
case t: Ident => goIdent(t, info.nx.nxTransIdent(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -522,7 +537,7 @@ object TreeTransforms {
final private[TreeTransforms] def goSelect(tree: Select, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformSelect(tree)(ctx.withPhase(trans), info) match {
+ trans.transformSelect(tree)(ctx.withPhase(trans.phase), info) match {
case t: Select => goSelect(t, info.nx.nxTransSelect(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -533,7 +548,7 @@ object TreeTransforms {
final private[TreeTransforms] def goThis(tree: This, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformThis(tree)(ctx.withPhase(trans), info) match {
+ trans.transformThis(tree)(ctx.withPhase(trans.phase), info) match {
case t: This => goThis(t, info.nx.nxTransThis(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -544,7 +559,7 @@ object TreeTransforms {
final private[TreeTransforms] def goSuper(tree: Super, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformSuper(tree)(ctx.withPhase(trans), info) match {
+ trans.transformSuper(tree)(ctx.withPhase(trans.phase), info) match {
case t: Super => goSuper(t, info.nx.nxTransSuper(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -555,7 +570,7 @@ object TreeTransforms {
final private[TreeTransforms] def goApply(tree: Apply, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformApply(tree)(ctx.withPhase(trans), info) match {
+ trans.transformApply(tree)(ctx.withPhase(trans.phase), info) match {
case t: Apply => goApply(t, info.nx.nxTransApply(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -566,7 +581,7 @@ object TreeTransforms {
final private[TreeTransforms] def goTypeApply(tree: TypeApply, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformTypeApply(tree)(ctx.withPhase(trans), info) match {
+ trans.transformTypeApply(tree)(ctx.withPhase(trans.phase), info) match {
case t: TypeApply => goTypeApply(t, info.nx.nxTransTypeApply(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -577,7 +592,7 @@ object TreeTransforms {
final private[TreeTransforms] def goNew(tree: New, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformNew(tree)(ctx.withPhase(trans), info) match {
+ trans.transformNew(tree)(ctx.withPhase(trans.phase), info) match {
case t: New => goNew(t, info.nx.nxTransNew(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -588,7 +603,7 @@ object TreeTransforms {
final private[TreeTransforms] def goPair(tree: Pair, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformPair(tree)(ctx.withPhase(trans), info) match {
+ trans.transformPair(tree)(ctx.withPhase(trans.phase), info) match {
case t: Pair => goPair(t, info.nx.nxTransPair(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -599,7 +614,7 @@ object TreeTransforms {
final private[TreeTransforms] def goTyped(tree: Typed, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformTyped(tree)(ctx.withPhase(trans), info) match {
+ trans.transformTyped(tree)(ctx.withPhase(trans.phase), info) match {
case t: Typed => goTyped(t, info.nx.nxTransTyped(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -610,7 +625,7 @@ object TreeTransforms {
final private[TreeTransforms] def goAssign(tree: Assign, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformAssign(tree)(ctx.withPhase(trans), info) match {
+ trans.transformAssign(tree)(ctx.withPhase(trans.phase), info) match {
case t: Assign => goAssign(t, info.nx.nxTransAssign(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -621,7 +636,7 @@ object TreeTransforms {
final private[TreeTransforms] def goLiteral(tree: Literal, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformLiteral(tree)(ctx.withPhase(trans), info) match {
+ trans.transformLiteral(tree)(ctx.withPhase(trans.phase), info) match {
case t: Literal => goLiteral(t, info.nx.nxTransLiteral(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -632,7 +647,7 @@ object TreeTransforms {
final private[TreeTransforms] def goBlock(tree: Block, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformBlock(tree)(ctx.withPhase(trans), info) match {
+ trans.transformBlock(tree)(ctx.withPhase(trans.phase), info) match {
case t: Block => goBlock(t, info.nx.nxTransBlock(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -643,7 +658,7 @@ object TreeTransforms {
final private[TreeTransforms] def goIf(tree: If, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformIf(tree)(ctx.withPhase(trans), info) match {
+ trans.transformIf(tree)(ctx.withPhase(trans.phase), info) match {
case t: If => goIf(t, info.nx.nxTransIf(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -654,7 +669,7 @@ object TreeTransforms {
final private[TreeTransforms] def goClosure(tree: Closure, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformClosure(tree)(ctx.withPhase(trans), info) match {
+ trans.transformClosure(tree)(ctx.withPhase(trans.phase), info) match {
case t: Closure => goClosure(t, info.nx.nxTransClosure(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -665,7 +680,7 @@ object TreeTransforms {
final private[TreeTransforms] def goMatch(tree: Match, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformMatch(tree)(ctx.withPhase(trans), info) match {
+ trans.transformMatch(tree)(ctx.withPhase(trans.phase), info) match {
case t: Match => goMatch(t, info.nx.nxTransMatch(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -676,7 +691,7 @@ object TreeTransforms {
final private[TreeTransforms] def goCaseDef(tree: CaseDef, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformCaseDef(tree)(ctx.withPhase(trans), info) match {
+ trans.transformCaseDef(tree)(ctx.withPhase(trans.phase), info) match {
case t: CaseDef => goCaseDef(t, info.nx.nxTransCaseDef(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -687,7 +702,7 @@ object TreeTransforms {
final private[TreeTransforms] def goReturn(tree: Return, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformReturn(tree)(ctx.withPhase(trans), info) match {
+ trans.transformReturn(tree)(ctx.withPhase(trans.phase), info) match {
case t: Return => goReturn(t, info.nx.nxTransReturn(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -698,7 +713,7 @@ object TreeTransforms {
final private[TreeTransforms] def goTry(tree: Try, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformTry(tree)(ctx.withPhase(trans), info) match {
+ trans.transformTry(tree)(ctx.withPhase(trans.phase), info) match {
case t: Try => goTry(t, info.nx.nxTransTry(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -709,7 +724,7 @@ object TreeTransforms {
final private[TreeTransforms] def goThrow(tree: Throw, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformThrow(tree)(ctx.withPhase(trans), info) match {
+ trans.transformThrow(tree)(ctx.withPhase(trans.phase), info) match {
case t: Throw => goThrow(t, info.nx.nxTransThrow(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -720,7 +735,7 @@ object TreeTransforms {
final private[TreeTransforms] def goSeqLiteral(tree: SeqLiteral, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformSeqLiteral(tree)(ctx.withPhase(trans), info) match {
+ trans.transformSeqLiteral(tree)(ctx.withPhase(trans.phase), info) match {
case t: SeqLiteral => goSeqLiteral(t, info.nx.nxTransSeqLiteral(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -731,7 +746,7 @@ object TreeTransforms {
final private[TreeTransforms] def goTypeTree(tree: TypeTree, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformTypeTree(tree)(ctx.withPhase(trans), info) match {
+ trans.transformTypeTree(tree)(ctx.withPhase(trans.phase), info) match {
case t: TypeTree => goTypeTree(t, info.nx.nxTransTypeTree(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -742,7 +757,7 @@ object TreeTransforms {
final private[TreeTransforms] def goSelectFromTypeTree(tree: SelectFromTypeTree, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformSelectFromTypeTree(tree)(ctx.withPhase(trans), info) match {
+ trans.transformSelectFromTypeTree(tree)(ctx.withPhase(trans.phase), info) match {
case t: SelectFromTypeTree => goSelectFromTypeTree(t, info.nx.nxTransSelectFromTypeTree(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -753,7 +768,7 @@ object TreeTransforms {
final private[TreeTransforms] def goBind(tree: Bind, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformBind(tree)(ctx.withPhase(trans), info) match {
+ trans.transformBind(tree)(ctx.withPhase(trans.phase), info) match {
case t: Bind => goBind(t, info.nx.nxTransBind(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -764,7 +779,7 @@ object TreeTransforms {
final private[TreeTransforms] def goAlternative(tree: Alternative, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformAlternative(tree)(ctx.withPhase(trans), info) match {
+ trans.transformAlternative(tree)(ctx.withPhase(trans.phase), info) match {
case t: Alternative => goAlternative(t, info.nx.nxTransAlternative(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -775,7 +790,7 @@ object TreeTransforms {
final private[TreeTransforms] def goValDef(tree: ValDef, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformValDef(tree)(ctx.withPhase(trans), info) match {
+ trans.transformValDef(tree)(ctx.withPhase(trans.phase), info) match {
case t: ValDef => goValDef(t, info.nx.nxTransValDef(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -786,7 +801,7 @@ object TreeTransforms {
final private[TreeTransforms] def goDefDef(tree: DefDef, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformDefDef(tree)(ctx.withPhase(trans), info) match {
+ trans.transformDefDef(tree)(ctx.withPhase(trans.phase), info) match {
case t: DefDef => goDefDef(t, info.nx.nxTransDefDef(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -797,7 +812,7 @@ object TreeTransforms {
final private[TreeTransforms] def goUnApply(tree: UnApply, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformUnApply(tree)(ctx.withPhase(trans), info) match {
+ trans.transformUnApply(tree)(ctx.withPhase(trans.phase), info) match {
case t: UnApply => goUnApply(t, info.nx.nxTransUnApply(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -808,7 +823,7 @@ object TreeTransforms {
final private[TreeTransforms] def goTypeDef(tree: TypeDef, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformTypeDef(tree)(ctx.withPhase(trans), info) match {
+ trans.transformTypeDef(tree)(ctx.withPhase(trans.phase), info) match {
case t: TypeDef => goTypeDef(t, info.nx.nxTransTypeDef(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -819,7 +834,7 @@ object TreeTransforms {
final private[TreeTransforms] def goTemplate(tree: Template, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformTemplate(tree)(ctx.withPhase(trans), info) match {
+ trans.transformTemplate(tree)(ctx.withPhase(trans.phase), info) match {
case t: Template => goTemplate(t, info.nx.nxTransTemplate(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -830,7 +845,7 @@ object TreeTransforms {
final private[TreeTransforms] def goPackageDef(tree: PackageDef, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- trans.transformPackageDef(tree)(ctx.withPhase(trans), info) match {
+ trans.transformPackageDef(tree)(ctx.withPhase(trans.phase), info) match {
case t: PackageDef => goPackageDef(t, info.nx.nxTransPackageDef(cur + 1))
case t => transformSingle(t, cur + 1)
}
@@ -840,7 +855,7 @@ object TreeTransforms {
final private[TreeTransforms] def goOther(tree: Tree, cur: Int)(implicit ctx: Context, info: TransformerInfo): Tree = {
if (cur < info.transformers.length) {
val trans = info.transformers(cur)
- val t = trans.transformOther(tree)(ctx.withPhase(trans), info)
+ val t = trans.transformOther(tree)(ctx.withPhase(trans.phase), info)
transformSingle(t, cur + 1)
} else tree
}
@@ -1151,8 +1166,8 @@ 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) {
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))
+ // this means that their denotations could not exists in previous period
+ val pctx = ctx.withPhase(info.transformers(cur).phase)
tree match {
//split one big match into 2 smaller ones
case tree: NameTree => transformNamed(tree, info, cur)(pctx)