@@ -198,12 +198,6 @@ object TreeTransforms {
198
198
idx = - 1
199
199
}
200
200
201
- /* disabled; not needed anywhere
202
- class Separator extends TreeTransform(phaseId) {
203
- //override def name: String = "Separator"
204
- idx = -1
205
- }
206
- */
207
201
type Mutator [T ] = (TreeTransform , T , Context ) => TreeTransform
208
202
209
203
class TransformerInfo (val transformers : Array [TreeTransform ], val nx : NXTransformations , val group : TreeTransformer )
@@ -224,7 +218,7 @@ object TreeTransforms {
224
218
* i <= j
225
219
* j == transforms.length || transform(j) defines a non-default method with given `name`
226
220
*/
227
- private def index (transformations : Array [TreeTransform ], name : String ): Array [Int ] = {
221
+ private def index (transformations : Array [Class [_] ], name : String ): Array [Int ] = {
228
222
val len = transformations.length
229
223
val next = new Array [Int ](len + 1 )
230
224
var nextTransform : Int = len
@@ -237,7 +231,7 @@ object TreeTransforms {
237
231
var i = len - 1
238
232
while (i >= 0 ) {
239
233
// update nextTransform if this phase redefines the method
240
- if (hasRedefinedMethod(transformations(i).getClass , name)) {
234
+ if (hasRedefinedMethod(transformations(i), name)) {
241
235
nextTransform = i
242
236
}
243
237
next(i) = nextTransform
@@ -246,8 +240,8 @@ object TreeTransforms {
246
240
next
247
241
}
248
242
249
- private def indexUpdate (prev : Array [Int ], changedTansformation : TreeTransform , index : Int , name : String , copy : Boolean = true ) = {
250
- val isDefinedNow = hasRedefinedMethod(changedTansformation.getClass , name)
243
+ private def indexUpdate (prev : Array [Int ], changedTansformation : Class [_] , index : Int , name : String , copy : Boolean = true ) = {
244
+ val isDefinedNow = hasRedefinedMethod(changedTansformation, name)
251
245
val wasDefinedBefore = prev(index) == index
252
246
if (isDefinedNow == wasDefinedBefore) prev
253
247
else {
@@ -265,7 +259,7 @@ object TreeTransforms {
265
259
}
266
260
}
267
261
268
- def this (transformations : Array [TreeTransform ]) = {
262
+ def this (transformations : Array [Class [_] ]) = {
269
263
this ()
270
264
nxPrepIdent = index(transformations, " prepareForIdent" )
271
265
nxPrepSelect = index(transformations, " prepareForSelect" )
@@ -335,73 +329,78 @@ object TreeTransforms {
335
329
nxTransOther = index(transformations, " transformOther" )
336
330
}
337
331
332
+ def this (transformations : Array [TreeTransform ]) = {
333
+ this (transformations.map(_.getClass).asInstanceOf [Array [Class [_]]])
334
+ }
335
+
338
336
def this (prev : NXTransformations , changedTansformation : TreeTransform , transformationIndex : Int , reuse : Boolean = false ) = {
339
337
this ()
340
338
val copy = ! reuse
341
- nxPrepIdent = indexUpdate(prev.nxPrepIdent, changedTansformation, transformationIndex, " prepareForIdent" , copy)
342
- nxPrepSelect = indexUpdate(prev.nxPrepSelect, changedTansformation, transformationIndex, " prepareForSelect" , copy)
343
- nxPrepThis = indexUpdate(prev.nxPrepThis, changedTansformation, transformationIndex, " prepareForThis" , copy)
344
- nxPrepSuper = indexUpdate(prev.nxPrepSuper, changedTansformation, transformationIndex, " prepareForSuper" , copy)
345
- nxPrepApply = indexUpdate(prev.nxPrepApply, changedTansformation, transformationIndex, " prepareForApply" , copy)
346
- nxPrepTypeApply = indexUpdate(prev.nxPrepTypeApply, changedTansformation, transformationIndex, " prepareForTypeApply" , copy)
347
- nxPrepLiteral = indexUpdate(prev.nxPrepLiteral, changedTansformation, transformationIndex, " prepareForLiteral" , copy)
348
- nxPrepNew = indexUpdate(prev.nxPrepNew, changedTansformation, transformationIndex, " prepareForNew" , copy)
349
- nxPrepPair = indexUpdate(prev.nxPrepPair, changedTansformation, transformationIndex, " prepareForPair" , copy)
350
- nxPrepTyped = indexUpdate(prev.nxPrepTyped, changedTansformation, transformationIndex, " prepareForTyped" , copy)
351
- nxPrepAssign = indexUpdate(prev.nxPrepAssign, changedTansformation, transformationIndex, " prepareForAssign" , copy)
352
- nxPrepBlock = indexUpdate(prev.nxPrepBlock, changedTansformation, transformationIndex, " prepareForBlock" , copy)
353
- nxPrepIf = indexUpdate(prev.nxPrepIf, changedTansformation, transformationIndex, " prepareForIf" , copy)
354
- nxPrepClosure = indexUpdate(prev.nxPrepClosure, changedTansformation, transformationIndex, " prepareForClosure" , copy)
355
- nxPrepMatch = indexUpdate(prev.nxPrepMatch, changedTansformation, transformationIndex, " prepareForMatch" , copy)
356
- nxPrepCaseDef = indexUpdate(prev.nxPrepCaseDef, changedTansformation, transformationIndex, " prepareForCaseDef" , copy)
357
- nxPrepReturn = indexUpdate(prev.nxPrepReturn, changedTansformation, transformationIndex, " prepareForReturn" , copy)
358
- nxPrepTry = indexUpdate(prev.nxPrepTry, changedTansformation, transformationIndex, " prepareForTry" , copy)
359
- nxPrepThrow = indexUpdate(prev.nxPrepThrow, changedTansformation, transformationIndex, " prepareForThrow" , copy)
360
- nxPrepSeqLiteral = indexUpdate(prev.nxPrepSeqLiteral, changedTansformation, transformationIndex, " prepareForSeqLiteral" , copy)
361
- nxPrepTypeTree = indexUpdate(prev.nxPrepTypeTree, changedTansformation, transformationIndex, " prepareForTypeTree" , copy)
362
- nxPrepSelectFromTypeTree = indexUpdate(prev.nxPrepSelectFromTypeTree, changedTansformation, transformationIndex, " prepareForSelectFromTypeTree" , copy)
363
- nxPrepBind = indexUpdate(prev.nxPrepBind, changedTansformation, transformationIndex, " prepareForBind" , copy)
364
- nxPrepAlternative = indexUpdate(prev.nxPrepAlternative, changedTansformation, transformationIndex, " prepareForAlternative" , copy)
365
- nxPrepUnApply = indexUpdate(prev.nxPrepUnApply, changedTansformation, transformationIndex, " prepareForUnApply" , copy)
366
- nxPrepValDef = indexUpdate(prev.nxPrepValDef, changedTansformation, transformationIndex, " prepareForValDef" , copy)
367
- nxPrepDefDef = indexUpdate(prev.nxPrepDefDef, changedTansformation, transformationIndex, " prepareForDefDef" , copy)
368
- nxPrepTypeDef = indexUpdate(prev.nxPrepTypeDef, changedTansformation, transformationIndex, " prepareForTypeDef" , copy)
369
- nxPrepTemplate = indexUpdate(prev.nxPrepTemplate, changedTansformation, transformationIndex, " prepareForTemplate" , copy)
370
- nxPrepPackageDef = indexUpdate(prev.nxPrepPackageDef, changedTansformation, transformationIndex, " prepareForPackageDef" , copy)
371
- nxPrepStats = indexUpdate(prev.nxPrepStats, changedTansformation, transformationIndex, " prepareForStats" , copy)
372
-
373
- nxTransIdent = indexUpdate(prev.nxTransIdent, changedTansformation, transformationIndex, " transformIdent" , copy)
374
- nxTransSelect = indexUpdate(prev.nxTransSelect, changedTansformation, transformationIndex, " transformSelect" , copy)
375
- nxTransThis = indexUpdate(prev.nxTransThis, changedTansformation, transformationIndex, " transformThis" , copy)
376
- nxTransSuper = indexUpdate(prev.nxTransSuper, changedTansformation, transformationIndex, " transformSuper" , copy)
377
- nxTransApply = indexUpdate(prev.nxTransApply, changedTansformation, transformationIndex, " transformApply" , copy)
378
- nxTransTypeApply = indexUpdate(prev.nxTransTypeApply, changedTansformation, transformationIndex, " transformTypeApply" , copy)
379
- nxTransLiteral = indexUpdate(prev.nxTransLiteral, changedTansformation, transformationIndex, " transformLiteral" , copy)
380
- nxTransNew = indexUpdate(prev.nxTransNew, changedTansformation, transformationIndex, " transformNew" , copy)
381
- nxTransPair = indexUpdate(prev.nxTransPair, changedTansformation, transformationIndex, " transformPair" , copy)
382
- nxTransTyped = indexUpdate(prev.nxTransTyped, changedTansformation, transformationIndex, " transformTyped" , copy)
383
- nxTransAssign = indexUpdate(prev.nxTransAssign, changedTansformation, transformationIndex, " transformAssign" , copy)
384
- nxTransBlock = indexUpdate(prev.nxTransBlock, changedTansformation, transformationIndex, " transformBlock" , copy)
385
- nxTransIf = indexUpdate(prev.nxTransIf, changedTansformation, transformationIndex, " transformIf" , copy)
386
- nxTransClosure = indexUpdate(prev.nxTransClosure, changedTansformation, transformationIndex, " transformClosure" , copy)
387
- nxTransMatch = indexUpdate(prev.nxTransMatch, changedTansformation, transformationIndex, " transformMatch" , copy)
388
- nxTransCaseDef = indexUpdate(prev.nxTransCaseDef, changedTansformation, transformationIndex, " transformCaseDef" , copy)
389
- nxTransReturn = indexUpdate(prev.nxTransReturn, changedTansformation, transformationIndex, " transformReturn" , copy)
390
- nxTransTry = indexUpdate(prev.nxTransTry, changedTansformation, transformationIndex, " transformTry" , copy)
391
- nxTransThrow = indexUpdate(prev.nxTransThrow, changedTansformation, transformationIndex, " transformThrow" , copy)
392
- nxTransSeqLiteral = indexUpdate(prev.nxTransSeqLiteral, changedTansformation, transformationIndex, " transformSeqLiteral" , copy)
393
- nxTransTypeTree = indexUpdate(prev.nxTransTypeTree, changedTansformation, transformationIndex, " transformTypeTree" , copy)
394
- nxTransSelectFromTypeTree = indexUpdate(prev.nxTransSelectFromTypeTree, changedTansformation, transformationIndex, " transformSelectFromTypeTree" , copy)
395
- nxTransBind = indexUpdate(prev.nxTransBind, changedTansformation, transformationIndex, " transformBind" , copy)
396
- nxTransAlternative = indexUpdate(prev.nxTransAlternative, changedTansformation, transformationIndex, " transformAlternative" , copy)
397
- nxTransUnApply = indexUpdate(prev.nxTransUnApply, changedTansformation, transformationIndex, " transformUnApply" , copy)
398
- nxTransValDef = indexUpdate(prev.nxTransValDef, changedTansformation, transformationIndex, " transformValDef" , copy)
399
- nxTransDefDef = indexUpdate(prev.nxTransDefDef, changedTansformation, transformationIndex, " transformDefDef" , copy)
400
- nxTransTypeDef = indexUpdate(prev.nxTransTypeDef, changedTansformation, transformationIndex, " transformTypeDef" , copy)
401
- nxTransTemplate = indexUpdate(prev.nxTransTemplate, changedTansformation, transformationIndex, " transformTemplate" , copy)
402
- nxTransPackageDef = indexUpdate(prev.nxTransPackageDef, changedTansformation, transformationIndex, " transformPackageDef" , copy)
403
- nxTransStats = indexUpdate(prev.nxTransStats, changedTansformation, transformationIndex, " transformStats" , copy)
404
- nxTransOther = indexUpdate(prev.nxTransOther, changedTansformation, transformationIndex, " transformOther" , copy)
339
+ val changedTransformationClass = changedTansformation.getClass
340
+ nxPrepIdent = indexUpdate(prev.nxPrepIdent, changedTransformationClass, transformationIndex, " prepareForIdent" , copy)
341
+ nxPrepSelect = indexUpdate(prev.nxPrepSelect, changedTransformationClass, transformationIndex, " prepareForSelect" , copy)
342
+ nxPrepThis = indexUpdate(prev.nxPrepThis, changedTransformationClass, transformationIndex, " prepareForThis" , copy)
343
+ nxPrepSuper = indexUpdate(prev.nxPrepSuper, changedTransformationClass, transformationIndex, " prepareForSuper" , copy)
344
+ nxPrepApply = indexUpdate(prev.nxPrepApply, changedTransformationClass, transformationIndex, " prepareForApply" , copy)
345
+ nxPrepTypeApply = indexUpdate(prev.nxPrepTypeApply, changedTransformationClass, transformationIndex, " prepareForTypeApply" , copy)
346
+ nxPrepLiteral = indexUpdate(prev.nxPrepLiteral, changedTransformationClass, transformationIndex, " prepareForLiteral" , copy)
347
+ nxPrepNew = indexUpdate(prev.nxPrepNew, changedTransformationClass, transformationIndex, " prepareForNew" , copy)
348
+ nxPrepPair = indexUpdate(prev.nxPrepPair, changedTransformationClass, transformationIndex, " prepareForPair" , copy)
349
+ nxPrepTyped = indexUpdate(prev.nxPrepTyped, changedTransformationClass, transformationIndex, " prepareForTyped" , copy)
350
+ nxPrepAssign = indexUpdate(prev.nxPrepAssign, changedTransformationClass, transformationIndex, " prepareForAssign" , copy)
351
+ nxPrepBlock = indexUpdate(prev.nxPrepBlock, changedTransformationClass, transformationIndex, " prepareForBlock" , copy)
352
+ nxPrepIf = indexUpdate(prev.nxPrepIf, changedTransformationClass, transformationIndex, " prepareForIf" , copy)
353
+ nxPrepClosure = indexUpdate(prev.nxPrepClosure, changedTransformationClass, transformationIndex, " prepareForClosure" , copy)
354
+ nxPrepMatch = indexUpdate(prev.nxPrepMatch, changedTransformationClass, transformationIndex, " prepareForMatch" , copy)
355
+ nxPrepCaseDef = indexUpdate(prev.nxPrepCaseDef, changedTransformationClass, transformationIndex, " prepareForCaseDef" , copy)
356
+ nxPrepReturn = indexUpdate(prev.nxPrepReturn, changedTransformationClass, transformationIndex, " prepareForReturn" , copy)
357
+ nxPrepTry = indexUpdate(prev.nxPrepTry, changedTransformationClass, transformationIndex, " prepareForTry" , copy)
358
+ nxPrepThrow = indexUpdate(prev.nxPrepThrow, changedTransformationClass, transformationIndex, " prepareForThrow" , copy)
359
+ nxPrepSeqLiteral = indexUpdate(prev.nxPrepSeqLiteral, changedTransformationClass, transformationIndex, " prepareForSeqLiteral" , copy)
360
+ nxPrepTypeTree = indexUpdate(prev.nxPrepTypeTree, changedTransformationClass, transformationIndex, " prepareForTypeTree" , copy)
361
+ nxPrepSelectFromTypeTree = indexUpdate(prev.nxPrepSelectFromTypeTree, changedTransformationClass, transformationIndex, " prepareForSelectFromTypeTree" , copy)
362
+ nxPrepBind = indexUpdate(prev.nxPrepBind, changedTransformationClass, transformationIndex, " prepareForBind" , copy)
363
+ nxPrepAlternative = indexUpdate(prev.nxPrepAlternative, changedTransformationClass, transformationIndex, " prepareForAlternative" , copy)
364
+ nxPrepUnApply = indexUpdate(prev.nxPrepUnApply, changedTransformationClass, transformationIndex, " prepareForUnApply" , copy)
365
+ nxPrepValDef = indexUpdate(prev.nxPrepValDef, changedTransformationClass, transformationIndex, " prepareForValDef" , copy)
366
+ nxPrepDefDef = indexUpdate(prev.nxPrepDefDef, changedTransformationClass, transformationIndex, " prepareForDefDef" , copy)
367
+ nxPrepTypeDef = indexUpdate(prev.nxPrepTypeDef, changedTransformationClass, transformationIndex, " prepareForTypeDef" , copy)
368
+ nxPrepTemplate = indexUpdate(prev.nxPrepTemplate, changedTransformationClass, transformationIndex, " prepareForTemplate" , copy)
369
+ nxPrepPackageDef = indexUpdate(prev.nxPrepPackageDef, changedTransformationClass, transformationIndex, " prepareForPackageDef" , copy)
370
+ nxPrepStats = indexUpdate(prev.nxPrepStats, changedTransformationClass, transformationIndex, " prepareForStats" , copy)
371
+
372
+ nxTransIdent = indexUpdate(prev.nxTransIdent, changedTransformationClass, transformationIndex, " transformIdent" , copy)
373
+ nxTransSelect = indexUpdate(prev.nxTransSelect, changedTransformationClass, transformationIndex, " transformSelect" , copy)
374
+ nxTransThis = indexUpdate(prev.nxTransThis, changedTransformationClass, transformationIndex, " transformThis" , copy)
375
+ nxTransSuper = indexUpdate(prev.nxTransSuper, changedTransformationClass, transformationIndex, " transformSuper" , copy)
376
+ nxTransApply = indexUpdate(prev.nxTransApply, changedTransformationClass, transformationIndex, " transformApply" , copy)
377
+ nxTransTypeApply = indexUpdate(prev.nxTransTypeApply, changedTransformationClass, transformationIndex, " transformTypeApply" , copy)
378
+ nxTransLiteral = indexUpdate(prev.nxTransLiteral, changedTransformationClass, transformationIndex, " transformLiteral" , copy)
379
+ nxTransNew = indexUpdate(prev.nxTransNew, changedTransformationClass, transformationIndex, " transformNew" , copy)
380
+ nxTransPair = indexUpdate(prev.nxTransPair, changedTransformationClass, transformationIndex, " transformPair" , copy)
381
+ nxTransTyped = indexUpdate(prev.nxTransTyped, changedTransformationClass, transformationIndex, " transformTyped" , copy)
382
+ nxTransAssign = indexUpdate(prev.nxTransAssign, changedTransformationClass, transformationIndex, " transformAssign" , copy)
383
+ nxTransBlock = indexUpdate(prev.nxTransBlock, changedTransformationClass, transformationIndex, " transformBlock" , copy)
384
+ nxTransIf = indexUpdate(prev.nxTransIf, changedTransformationClass, transformationIndex, " transformIf" , copy)
385
+ nxTransClosure = indexUpdate(prev.nxTransClosure, changedTransformationClass, transformationIndex, " transformClosure" , copy)
386
+ nxTransMatch = indexUpdate(prev.nxTransMatch, changedTransformationClass, transformationIndex, " transformMatch" , copy)
387
+ nxTransCaseDef = indexUpdate(prev.nxTransCaseDef, changedTransformationClass, transformationIndex, " transformCaseDef" , copy)
388
+ nxTransReturn = indexUpdate(prev.nxTransReturn, changedTransformationClass, transformationIndex, " transformReturn" , copy)
389
+ nxTransTry = indexUpdate(prev.nxTransTry, changedTransformationClass, transformationIndex, " transformTry" , copy)
390
+ nxTransThrow = indexUpdate(prev.nxTransThrow, changedTransformationClass, transformationIndex, " transformThrow" , copy)
391
+ nxTransSeqLiteral = indexUpdate(prev.nxTransSeqLiteral, changedTransformationClass, transformationIndex, " transformSeqLiteral" , copy)
392
+ nxTransTypeTree = indexUpdate(prev.nxTransTypeTree, changedTransformationClass, transformationIndex, " transformTypeTree" , copy)
393
+ nxTransSelectFromTypeTree = indexUpdate(prev.nxTransSelectFromTypeTree, changedTransformationClass, transformationIndex, " transformSelectFromTypeTree" , copy)
394
+ nxTransBind = indexUpdate(prev.nxTransBind, changedTransformationClass, transformationIndex, " transformBind" , copy)
395
+ nxTransAlternative = indexUpdate(prev.nxTransAlternative, changedTransformationClass, transformationIndex, " transformAlternative" , copy)
396
+ nxTransUnApply = indexUpdate(prev.nxTransUnApply, changedTransformationClass, transformationIndex, " transformUnApply" , copy)
397
+ nxTransValDef = indexUpdate(prev.nxTransValDef, changedTransformationClass, transformationIndex, " transformValDef" , copy)
398
+ nxTransDefDef = indexUpdate(prev.nxTransDefDef, changedTransformationClass, transformationIndex, " transformDefDef" , copy)
399
+ nxTransTypeDef = indexUpdate(prev.nxTransTypeDef, changedTransformationClass, transformationIndex, " transformTypeDef" , copy)
400
+ nxTransTemplate = indexUpdate(prev.nxTransTemplate, changedTransformationClass, transformationIndex, " transformTemplate" , copy)
401
+ nxTransPackageDef = indexUpdate(prev.nxTransPackageDef, changedTransformationClass, transformationIndex, " transformPackageDef" , copy)
402
+ nxTransStats = indexUpdate(prev.nxTransStats, changedTransformationClass, transformationIndex, " transformStats" , copy)
403
+ nxTransOther = indexUpdate(prev.nxTransOther, changedTransformationClass, transformationIndex, " transformOther" , copy)
405
404
}
406
405
407
406
/** Those arrays are used as "execution plan" in order to only execute non-tivial transformations\preparations
@@ -548,12 +547,16 @@ object TreeTransforms {
548
547
val prepForStats : Mutator [List [Tree ]] = (trans, trees, ctx) => trans.prepareForStats(trees)(ctx)
549
548
val prepForUnit : Mutator [Tree ] = (trans, tree, ctx) => trans.prepareForUnit(tree)(ctx)
550
549
550
+ val initialTransformationsCache = transformations.zipWithIndex.map {
551
+ case (transform, id) =>
552
+ transform.idx = id
553
+ transform
554
+ }
555
+
556
+ val initialInfoCache = new TransformerInfo (initialTransformationsCache, new NXTransformations (initialTransformationsCache), this )
557
+
551
558
def macroTransform (t : Tree )(implicit ctx : Context ): Tree = {
552
- val initialTransformations = transformations
553
- val info = new TransformerInfo (initialTransformations, new NXTransformations (initialTransformations), this )
554
- initialTransformations.zipWithIndex.foreach {
555
- case (transform, id) => transform.idx = id
556
- }
559
+ val info = initialInfoCache
557
560
implicit val mutatedInfo : TransformerInfo = mutateTransformers(info, prepForUnit, info.nx.nxPrepUnit, t, 0 )
558
561
if (mutatedInfo eq null ) t
559
562
else goUnit(transform(t, mutatedInfo, 0 ), mutatedInfo.nx.nxTransUnit(0 ))
0 commit comments