@@ -4,7 +4,6 @@ import dotty.tools.dotc.ast.tpd
4
4
import dotty .tools .dotc .core .Contexts .Context
5
5
import dotty .tools .dotc .core .Phases .Phase
6
6
import dotty .tools .dotc .ast .Trees ._
7
- import java .util
8
7
import scala .annotation .tailrec
9
8
10
9
object TreeTransforms {
@@ -49,7 +48,6 @@ object TreeTransforms {
49
48
class TreeTransform (group : TreeTransformer , idx : Int ) {
50
49
51
50
import tpd ._
52
- import group ._
53
51
54
52
def prepareForIdent (tree : Ident ) = this
55
53
def prepareForSelect (tree : Select ) = this
@@ -81,6 +79,7 @@ object TreeTransforms {
81
79
def prepareForDefDef (tree : DefDef ) = this
82
80
def prepareForTemplate (tree : Template ) = this
83
81
def prepareForPackageDef (tree : PackageDef ) = this
82
+ def prepareForStats (trees : List [Tree ]) = this
84
83
85
84
def transformIdent (tree : Ident )(implicit ctx : Context , info : TransformerInfo ): Tree = tree
86
85
def transformSelect (tree : Select )(implicit ctx : Context , info : TransformerInfo ): Tree = tree
@@ -112,6 +111,7 @@ object TreeTransforms {
112
111
def transformTypeDef (tree : TypeDef )(implicit ctx : Context , info : TransformerInfo ): Tree = tree
113
112
def transformTemplate (tree : Template )(implicit ctx : Context , info : TransformerInfo ): Tree = tree
114
113
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
115
115
116
116
/** Transform tree using all transforms of current group (including this one) */
117
117
def transform (tree : Tree )(implicit ctx : Context ): Tree = group.transform(tree)
@@ -125,7 +125,7 @@ object TreeTransforms {
125
125
126
126
val NoTransform = new TreeTransform (null , - 1 )
127
127
128
- type Mutator = (TreeTransform , tpd. Tree ) => TreeTransform
128
+ type Mutator [ T ] = (TreeTransform , T ) => TreeTransform
129
129
130
130
class TransformerInfo (val transformers : Array [TreeTransform ], val nx : NXTransformations ) {}
131
131
@@ -219,6 +219,7 @@ object TreeTransforms {
219
219
nxPrepTypeDef = index(transformations, " prepareForTypeDef" )
220
220
nxPrepTemplate = index(transformations, " prepareForTemplate" )
221
221
nxPrepPackageDef = index(transformations, " prepareForPackageDef" )
222
+ nxPrepStats = index(transformations, " prepareForStats" )
222
223
223
224
nxTransIdent = index(transformations, " transformIdent" )
224
225
nxTransSelect = index(transformations, " transformSelect" )
@@ -250,6 +251,7 @@ object TreeTransforms {
250
251
nxTransTypeDef = index(transformations, " transformTypeDef" )
251
252
nxTransTemplate = index(transformations, " transformTemplate" )
252
253
nxTransPackageDef = index(transformations, " transformPackageDef" )
254
+ nxTransStats = index(transformations, " transformStats" )
253
255
}
254
256
255
257
def this (prev : NXTransformations , changedTansformation : TreeTransform , transformationIndex : Int , reuse : Boolean = false ) = {
@@ -285,6 +287,7 @@ object TreeTransforms {
285
287
nxPrepTypeDef = indexUpdate(prev.nxPrepTypeDef, changedTansformation, transformationIndex, " prepareForTypeDef" , copy)
286
288
nxPrepTemplate = indexUpdate(prev.nxPrepTemplate, changedTansformation, transformationIndex, " prepareForTemplate" , copy)
287
289
nxPrepPackageDef = indexUpdate(prev.nxPrepPackageDef, changedTansformation, transformationIndex, " prepareForPackageDef" , copy)
290
+ nxPrepStats = indexUpdate(prev.nxPrepStats, changedTansformation, transformationIndex, " prepareForStats" , copy)
288
291
289
292
nxTransIdent = indexUpdate(prev.nxTransIdent, changedTansformation, transformationIndex, " transformIdent" , copy)
290
293
nxTransSelect = indexUpdate(prev.nxTransSelect, changedTansformation, transformationIndex, " transformSelect" , copy)
@@ -316,6 +319,7 @@ object TreeTransforms {
316
319
nxTransTypeDef = indexUpdate(prev.nxTransTypeDef, changedTansformation, transformationIndex, " transformTypeDef" , copy)
317
320
nxTransTemplate = indexUpdate(prev.nxTransTemplate, changedTansformation, transformationIndex, " transformTemplate" , copy)
318
321
nxTransPackageDef = indexUpdate(prev.nxTransPackageDef, changedTansformation, transformationIndex, " transformPackageDef" , copy)
322
+ nxTransStats = indexUpdate(prev.nxTransStats, changedTansformation, transformationIndex, " transformStats" , copy)
319
323
}
320
324
321
325
var nxPrepIdent : Array [Int ] = _
@@ -348,6 +352,7 @@ object TreeTransforms {
348
352
var nxPrepTypeDef : Array [Int ] = _
349
353
var nxPrepTemplate : Array [Int ] = _
350
354
var nxPrepPackageDef : Array [Int ] = _
355
+ var nxPrepStats : Array [Int ] = _
351
356
352
357
var nxTransIdent : Array [Int ] = _
353
358
var nxTransSelect : Array [Int ] = _
@@ -379,6 +384,7 @@ object TreeTransforms {
379
384
var nxTransTypeDef : Array [Int ] = _
380
385
var nxTransTemplate : Array [Int ] = _
381
386
var nxTransPackageDef : Array [Int ] = _
387
+ var nxTransStats : Array [Int ] = _
382
388
}
383
389
384
390
/** A group of tree transforms that are applied in sequence during the same phase */
@@ -388,15 +394,14 @@ object TreeTransforms {
388
394
389
395
protected def transformations : Array [(TreeTransformer , Int ) => TreeTransform ]
390
396
391
- private val processedTrees = new util.IdentityHashMap [Tree , Tree ]()
392
397
393
398
override def run (implicit ctx : Context ): Unit = {
394
399
val curTree = ctx.compilationUnit.tpdTree
395
400
val newTree = transform(curTree)
396
401
ctx.compilationUnit.tpdTree = newTree
397
402
}
398
403
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 ) = {
400
405
var transformersCopied = false
401
406
var nxCopied = false
402
407
var result = info.transformers
@@ -424,36 +429,37 @@ object TreeTransforms {
424
429
else new TransformerInfo (result, resultNX)
425
430
}
426
431
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)
457
463
458
464
def transform (t : Tree )(implicit ctx : Context ): Tree = {
459
465
val initialTransformations = transformations.zipWithIndex.map(x => x._1(this , x._2))
@@ -1060,8 +1066,19 @@ object TreeTransforms {
1060
1066
}
1061
1067
}
1062
1068
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
+ }
1065
1082
1066
1083
def transformL (trees : List [Tree ], info : TransformerInfo , current : Int )(implicit ctx : Context ): List [Tree ] =
1067
1084
flatten(trees mapConserve (x => transform(x, info, current)))
0 commit comments