Skip to content

Commit 3eabe4a

Browse files
committed
TreeTransform: add support for transforming stats
Added a prepareForStats&transformStats pair of methods, which provide a convinient way to alter scopes of PackageDefs, Templates and Block's.
1 parent 0089217 commit 3eabe4a

File tree

1 file changed

+54
-37
lines changed

1 file changed

+54
-37
lines changed

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

Lines changed: 54 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import dotty.tools.dotc.ast.tpd
44
import dotty.tools.dotc.core.Contexts.Context
55
import dotty.tools.dotc.core.Phases.Phase
66
import dotty.tools.dotc.ast.Trees._
7-
import java.util
87
import scala.annotation.tailrec
98

109
object TreeTransforms {
@@ -49,7 +48,6 @@ object TreeTransforms {
4948
class TreeTransform(group: TreeTransformer, idx: Int) {
5049

5150
import tpd._
52-
import group._
5351

5452
def prepareForIdent(tree: Ident) = this
5553
def prepareForSelect(tree: Select) = this
@@ -81,6 +79,7 @@ object TreeTransforms {
8179
def prepareForDefDef(tree: DefDef) = this
8280
def prepareForTemplate(tree: Template) = this
8381
def prepareForPackageDef(tree: PackageDef) = this
82+
def prepareForStats(trees: List[Tree]) = this
8483

8584
def transformIdent(tree: Ident)(implicit ctx: Context, info: TransformerInfo): Tree = tree
8685
def transformSelect(tree: Select)(implicit ctx: Context, info: TransformerInfo): Tree = tree
@@ -112,6 +111,7 @@ object TreeTransforms {
112111
def transformTypeDef(tree: TypeDef)(implicit ctx: Context, info: TransformerInfo): Tree = tree
113112
def transformTemplate(tree: Template)(implicit ctx: Context, info: TransformerInfo): Tree = tree
114113
def transformPackageDef(tree: PackageDef)(implicit ctx: Context, info: TransformerInfo): Tree = tree
114+
def transformStats(trees: List[Tree])(implicit ctx: Context, info: TransformerInfo): List[Tree] = trees
115115

116116
/** Transform tree using all transforms of current group (including this one) */
117117
def transform(tree: Tree)(implicit ctx: Context): Tree = group.transform(tree)
@@ -125,7 +125,7 @@ object TreeTransforms {
125125

126126
val NoTransform = new TreeTransform(null, -1)
127127

128-
type Mutator = (TreeTransform, tpd.Tree) => TreeTransform
128+
type Mutator[T] = (TreeTransform, T) => TreeTransform
129129

130130
class TransformerInfo(val transformers: Array[TreeTransform], val nx: NXTransformations) {}
131131

@@ -219,6 +219,7 @@ object TreeTransforms {
219219
nxPrepTypeDef = index(transformations, "prepareForTypeDef")
220220
nxPrepTemplate = index(transformations, "prepareForTemplate")
221221
nxPrepPackageDef = index(transformations, "prepareForPackageDef")
222+
nxPrepStats = index(transformations, "prepareForStats")
222223

223224
nxTransIdent = index(transformations, "transformIdent")
224225
nxTransSelect = index(transformations, "transformSelect")
@@ -250,6 +251,7 @@ object TreeTransforms {
250251
nxTransTypeDef = index(transformations, "transformTypeDef")
251252
nxTransTemplate = index(transformations, "transformTemplate")
252253
nxTransPackageDef = index(transformations, "transformPackageDef")
254+
nxTransStats = index(transformations, "transformStats")
253255
}
254256

255257
def this(prev: NXTransformations, changedTansformation: TreeTransform, transformationIndex: Int, reuse: Boolean = false) = {
@@ -285,6 +287,7 @@ object TreeTransforms {
285287
nxPrepTypeDef = indexUpdate(prev.nxPrepTypeDef, changedTansformation, transformationIndex, "prepareForTypeDef", copy)
286288
nxPrepTemplate = indexUpdate(prev.nxPrepTemplate, changedTansformation, transformationIndex, "prepareForTemplate", copy)
287289
nxPrepPackageDef = indexUpdate(prev.nxPrepPackageDef, changedTansformation, transformationIndex, "prepareForPackageDef", copy)
290+
nxPrepStats = indexUpdate(prev.nxPrepStats, changedTansformation, transformationIndex, "prepareForStats", copy)
288291

289292
nxTransIdent = indexUpdate(prev.nxTransIdent, changedTansformation, transformationIndex, "transformIdent", copy)
290293
nxTransSelect = indexUpdate(prev.nxTransSelect, changedTansformation, transformationIndex, "transformSelect", copy)
@@ -316,6 +319,7 @@ object TreeTransforms {
316319
nxTransTypeDef = indexUpdate(prev.nxTransTypeDef, changedTansformation, transformationIndex, "transformTypeDef", copy)
317320
nxTransTemplate = indexUpdate(prev.nxTransTemplate, changedTansformation, transformationIndex, "transformTemplate", copy)
318321
nxTransPackageDef = indexUpdate(prev.nxTransPackageDef, changedTansformation, transformationIndex, "transformPackageDef", copy)
322+
nxTransStats = indexUpdate(prev.nxTransStats, changedTansformation, transformationIndex, "transformStats", copy)
319323
}
320324

321325
var nxPrepIdent: Array[Int] = _
@@ -348,6 +352,7 @@ object TreeTransforms {
348352
var nxPrepTypeDef: Array[Int] = _
349353
var nxPrepTemplate: Array[Int] = _
350354
var nxPrepPackageDef: Array[Int] = _
355+
var nxPrepStats: Array[Int] = _
351356

352357
var nxTransIdent: Array[Int] = _
353358
var nxTransSelect: Array[Int] = _
@@ -379,6 +384,7 @@ object TreeTransforms {
379384
var nxTransTypeDef: Array[Int] = _
380385
var nxTransTemplate: Array[Int] = _
381386
var nxTransPackageDef: Array[Int] = _
387+
var nxTransStats: Array[Int] = _
382388
}
383389

384390
/** A group of tree transforms that are applied in sequence during the same phase */
@@ -388,15 +394,14 @@ object TreeTransforms {
388394

389395
protected def transformations: Array[(TreeTransformer, Int) => TreeTransform]
390396

391-
private val processedTrees = new util.IdentityHashMap[Tree, Tree]()
392397

393398
override def run(implicit ctx: Context): Unit = {
394399
val curTree = ctx.compilationUnit.tpdTree
395400
val newTree = transform(curTree)
396401
ctx.compilationUnit.tpdTree = newTree
397402
}
398403

399-
def mutateTransformers(info: TransformerInfo, mutator: Mutator, mutationPlan: Array[Int], tree: Tree, cur: Int) = {
404+
def mutateTransformers[T](info: TransformerInfo, mutator: Mutator[T], mutationPlan: Array[Int], tree: T, cur: Int) = {
400405
var transformersCopied = false
401406
var nxCopied = false
402407
var result = info.transformers
@@ -424,36 +429,37 @@ object TreeTransforms {
424429
else new TransformerInfo(result, resultNX)
425430
}
426431

427-
val prepForIdent: Mutator = (trans, tree) => trans.prepareForIdent(tree.asInstanceOf[Ident])
428-
val prepForSelect: Mutator = (trans, tree) => trans.prepareForSelect(tree.asInstanceOf[Select])
429-
val prepForThis: Mutator = (trans, tree) => trans.prepareForThis(tree.asInstanceOf[This])
430-
val prepForSuper: Mutator = (trans, tree) => trans.prepareForSuper(tree.asInstanceOf[Super])
431-
val prepForApply: Mutator = (trans, tree) => trans.prepareForApply(tree.asInstanceOf[Apply])
432-
val prepForTypeApply: Mutator = (trans, tree) => trans.prepareForTypeApply(tree.asInstanceOf[TypeApply])
433-
val prepForNew: Mutator = (trans, tree) => trans.prepareForNew(tree.asInstanceOf[New])
434-
val prepForPair: Mutator = (trans, tree) => trans.prepareForPair(tree.asInstanceOf[Pair])
435-
val prepForTyped: Mutator = (trans, tree) => trans.prepareForTyped(tree.asInstanceOf[Typed])
436-
val prepForAssign: Mutator = (trans, tree) => trans.prepareForAssign(tree.asInstanceOf[Assign])
437-
val prepForLiteral: Mutator = (trans, tree) => trans.prepareForLiteral(tree.asInstanceOf[Literal])
438-
val prepForBlock: Mutator = (trans, tree) => trans.prepareForBlock(tree.asInstanceOf[Block])
439-
val prepForIf: Mutator = (trans, tree) => trans.prepareForIf(tree.asInstanceOf[If])
440-
val prepForClosure: Mutator = (trans, tree) => trans.prepareForClosure(tree.asInstanceOf[Closure])
441-
val prepForMatch: Mutator = (trans, tree) => trans.prepareForMatch(tree.asInstanceOf[Match])
442-
val prepForCaseDef: Mutator = (trans, tree) => trans.prepareForCaseDef(tree.asInstanceOf[CaseDef])
443-
val prepForReturn: Mutator = (trans, tree) => trans.prepareForReturn(tree.asInstanceOf[Return])
444-
val prepForTry: Mutator = (trans, tree) => trans.prepareForTry(tree.asInstanceOf[Try])
445-
val prepForThrow: Mutator = (trans, tree) => trans.prepareForThrow(tree.asInstanceOf[Throw])
446-
val prepForSeqLiteral: Mutator = (trans, tree) => trans.prepareForSeqLiteral(tree.asInstanceOf[SeqLiteral])
447-
val prepForTypeTree: Mutator = (trans, tree) => trans.prepareForTypeTree(tree.asInstanceOf[TypeTree])
448-
val prepForSelectFromTypeTree: Mutator = (trans, tree) => trans.prepareForSelectFromTypeTree(tree.asInstanceOf[SelectFromTypeTree])
449-
val prepForBind: Mutator = (trans, tree) => trans.prepareForBind(tree.asInstanceOf[Bind])
450-
val prepForAlternative: Mutator = (trans, tree) => trans.prepareForAlternative(tree.asInstanceOf[Alternative])
451-
val prepForUnApply: Mutator = (trans, tree) => trans.prepareForUnApply(tree.asInstanceOf[UnApply])
452-
val prepForValDef: Mutator = (trans, tree) => trans.prepareForValDef(tree.asInstanceOf[ValDef])
453-
val prepForDefDef: Mutator = (trans, tree) => trans.prepareForDefDef(tree.asInstanceOf[DefDef])
454-
val prepForTypeDef: Mutator = (trans, tree) => trans.prepareForTypeDef(tree.asInstanceOf[TypeDef])
455-
val prepForTemplate: Mutator = (trans, tree) => trans.prepareForTemplate(tree.asInstanceOf[Template])
456-
val prepForPackageDef: Mutator = (trans, tree) => trans.prepareForPackageDef(tree.asInstanceOf[PackageDef])
432+
val prepForIdent: Mutator[Ident] = (trans, tree) => trans.prepareForIdent(tree)
433+
val prepForSelect: Mutator[Select] = (trans, tree) => trans.prepareForSelect(tree)
434+
val prepForThis: Mutator[This] = (trans, tree) => trans.prepareForThis(tree)
435+
val prepForSuper: Mutator[Super] = (trans, tree) => trans.prepareForSuper(tree)
436+
val prepForApply: Mutator[Apply] = (trans, tree) => trans.prepareForApply(tree)
437+
val prepForTypeApply: Mutator[TypeApply] = (trans, tree) => trans.prepareForTypeApply(tree)
438+
val prepForNew: Mutator[New] = (trans, tree) => trans.prepareForNew(tree)
439+
val prepForPair: Mutator[Pair] = (trans, tree) => trans.prepareForPair(tree)
440+
val prepForTyped: Mutator[Typed] = (trans, tree) => trans.prepareForTyped(tree)
441+
val prepForAssign: Mutator[Assign] = (trans, tree) => trans.prepareForAssign(tree)
442+
val prepForLiteral: Mutator[Literal] = (trans, tree) => trans.prepareForLiteral(tree)
443+
val prepForBlock: Mutator[Block] = (trans, tree) => trans.prepareForBlock(tree)
444+
val prepForIf: Mutator[If] = (trans, tree) => trans.prepareForIf(tree)
445+
val prepForClosure: Mutator[Closure] = (trans, tree) => trans.prepareForClosure(tree)
446+
val prepForMatch: Mutator[Match] = (trans, tree) => trans.prepareForMatch(tree)
447+
val prepForCaseDef: Mutator[CaseDef] = (trans, tree) => trans.prepareForCaseDef(tree)
448+
val prepForReturn: Mutator[Return] = (trans, tree) => trans.prepareForReturn(tree)
449+
val prepForTry: Mutator[Try] = (trans, tree) => trans.prepareForTry(tree)
450+
val prepForThrow: Mutator[Throw] = (trans, tree) => trans.prepareForThrow(tree)
451+
val prepForSeqLiteral: Mutator[SeqLiteral] = (trans, tree) => trans.prepareForSeqLiteral(tree)
452+
val prepForTypeTree: Mutator[TypeTree] = (trans, tree) => trans.prepareForTypeTree(tree)
453+
val prepForSelectFromTypeTree: Mutator[SelectFromTypeTree] = (trans, tree) => trans.prepareForSelectFromTypeTree(tree)
454+
val prepForBind: Mutator[Bind] = (trans, tree) => trans.prepareForBind(tree)
455+
val prepForAlternative: Mutator[Alternative] = (trans, tree) => trans.prepareForAlternative(tree)
456+
val prepForUnApply: Mutator[UnApply] = (trans, tree) => trans.prepareForUnApply(tree)
457+
val prepForValDef: Mutator[ValDef] = (trans, tree) => trans.prepareForValDef(tree)
458+
val prepForDefDef: Mutator[DefDef] = (trans, tree) => trans.prepareForDefDef(tree)
459+
val prepForTypeDef: Mutator[TypeDef] = (trans, tree) => trans.prepareForTypeDef(tree)
460+
val prepForTemplate: Mutator[Template] = (trans, tree) => trans.prepareForTemplate(tree)
461+
val prepForPackageDef: Mutator[PackageDef] = (trans, tree) => trans.prepareForPackageDef(tree)
462+
val prepForStats: Mutator[List[Tree]]= (trans, trees) => trans.prepareForStats(trees)
457463

458464
def transform(t: Tree)(implicit ctx: Context): Tree = {
459465
val initialTransformations = transformations.zipWithIndex.map(x => x._1(this, x._2))
@@ -1060,8 +1066,19 @@ object TreeTransforms {
10601066
}
10611067
}
10621068

1063-
def transformStats(trees: List[Tree], info: TransformerInfo, current: Int)(implicit ctx: Context): List[Tree] =
1064-
transformL(trees, info, current)(ctx)
1069+
@tailrec
1070+
final private[TreeTransforms] def goStats(trees: List[Tree], cur: Int)(implicit ctx: Context, info: TransformerInfo): List[Tree] = {
1071+
if (cur < info.transformers.length) {
1072+
val stats = info.transformers(cur).transformStats(trees)
1073+
goStats(stats, info.nx.nxTransStats(cur + 1))
1074+
} else trees
1075+
}
1076+
1077+
def transformStats(trees: List[Tree], info: TransformerInfo, current: Int)(implicit ctx: Context): List[Tree] = {
1078+
val newInfo = mutateTransformers(info, prepForStats, info.nx.nxPrepStats, trees, current)
1079+
val newTrees = transformL(trees, newInfo, current)(ctx)
1080+
flatten(goStats(newTrees, newInfo.nx.nxTransStats(current))(ctx, newInfo))
1081+
}
10651082

10661083
def transformL(trees: List[Tree], info: TransformerInfo, current: Int)(implicit ctx: Context): List[Tree] =
10671084
flatten(trees mapConserve (x => transform(x, info, current)))

0 commit comments

Comments
 (0)