@@ -5,6 +5,7 @@ package transform
5
5
import core ._
6
6
import Contexts ._ , Phases ._ , Symbols ._ , Decorators ._
7
7
import Flags .PackageVal
8
+ import staging .StagingLevel .*
8
9
9
10
/** A MegaPhase combines a number of mini-phases which are all executed in
10
11
* a single tree traversal.
@@ -66,6 +67,8 @@ object MegaPhase {
66
67
def prepareForTry (tree : Try )(using Context ): Context = ctx
67
68
def prepareForSeqLiteral (tree : SeqLiteral )(using Context ): Context = ctx
68
69
def prepareForInlined (tree : Inlined )(using Context ): Context = ctx
70
+ def prepareForQuote (tree : Quote )(using Context ): Context = ctx
71
+ def prepareForSplice (tree : Splice )(using Context ): Context = ctx
69
72
def prepareForTypeTree (tree : TypeTree )(using Context ): Context = ctx
70
73
def prepareForBind (tree : Bind )(using Context ): Context = ctx
71
74
def prepareForAlternative (tree : Alternative )(using Context ): Context = ctx
@@ -100,6 +103,8 @@ object MegaPhase {
100
103
def transformTry (tree : Try )(using Context ): Tree = tree
101
104
def transformSeqLiteral (tree : SeqLiteral )(using Context ): Tree = tree
102
105
def transformInlined (tree : Inlined )(using Context ): Tree = tree
106
+ def transformQuote (tree : Quote )(using Context ): Tree = tree
107
+ def transformSplice (tree : Splice )(using Context ): Tree = tree
103
108
def transformTypeTree (tree : TypeTree )(using Context ): Tree = tree
104
109
def transformBind (tree : Bind )(using Context ): Tree = tree
105
110
def transformAlternative (tree : Alternative )(using Context ): Tree = tree
@@ -394,6 +399,18 @@ class MegaPhase(val miniPhases: Array[MiniPhase]) extends Phase {
394
399
val expansion = transformTree(tree.expansion, start)(using inlineContext(tree.call))
395
400
goInlined(cpy.Inlined (tree)(tree.call, bindings, expansion), start)
396
401
}
402
+ case tree : Quote =>
403
+ inContext(prepQuote(tree, start)(using outerCtx)) {
404
+ val expr = transformTree(tree.expr, start)(using quoteContext)
405
+ val tpt = transformTree(tree.tpt, start)
406
+ goQuote(cpy.Quote (tree)(expr, tpt), start)
407
+ }
408
+ case tree : Splice =>
409
+ inContext(prepSplice(tree, start)(using outerCtx)) {
410
+ val expr = transformTree(tree.expr, start)(using spliceContext)
411
+ val tpt = transformTree(tree.tpt, start)
412
+ goSplice(cpy.Splice (tree)(expr, tpt), start)
413
+ }
397
414
case tree : Return =>
398
415
inContext(prepReturn(tree, start)(using outerCtx)) {
399
416
val expr = transformTree(tree.expr, start)
@@ -546,6 +563,10 @@ class MegaPhase(val miniPhases: Array[MiniPhase]) extends Phase {
546
563
private val nxSeqLiteralTransPhase = init(" transformSeqLiteral" )
547
564
private val nxInlinedPrepPhase = init(" prepareForInlined" )
548
565
private val nxInlinedTransPhase = init(" transformInlined" )
566
+ private val nxQuotePrepPhase = init(" prepareForQuote" )
567
+ private val nxQuoteTransPhase = init(" transformQuote" )
568
+ private val nxSplicePrepPhase = init(" prepareForPrep" )
569
+ private val nxSpliceTransPhase = init(" transformSplice" )
549
570
private val nxTypeTreePrepPhase = init(" prepareForTypeTree" )
550
571
private val nxTypeTreeTransPhase = init(" transformTypeTree" )
551
572
private val nxBindPrepPhase = init(" prepareForBind" )
@@ -893,6 +914,36 @@ class MegaPhase(val miniPhases: Array[MiniPhase]) extends Phase {
893
914
}
894
915
}
895
916
917
+ def prepQuote (tree : Quote , start : Int )(using Context ): Context = {
918
+ val phase = nxQuotePrepPhase(start)
919
+ if (phase == null ) ctx
920
+ else prepQuote(tree, phase.idxInGroup + 1 )(using phase.prepareForQuote(tree))
921
+ }
922
+
923
+ def goQuote (tree : Quote , start : Int )(using Context ): Tree = {
924
+ val phase = nxQuoteTransPhase(start)
925
+ if (phase == null ) tree
926
+ else phase.transformQuote(tree) match {
927
+ case tree1 : Quote => goQuote(tree1, phase.idxInGroup + 1 )
928
+ case tree1 => transformNode(tree1, phase.idxInGroup + 1 )
929
+ }
930
+ }
931
+
932
+ def prepSplice (tree : Splice , start : Int )(using Context ): Context = {
933
+ val phase = nxSplicePrepPhase(start)
934
+ if (phase == null ) ctx
935
+ else prepSplice(tree, phase.idxInGroup + 1 )(using phase.prepareForSplice(tree))
936
+ }
937
+
938
+ def goSplice (tree : Splice , start : Int )(using Context ): Tree = {
939
+ val phase = nxSpliceTransPhase(start)
940
+ if (phase == null ) tree
941
+ else phase.transformSplice(tree) match {
942
+ case tree1 : Splice => goSplice(tree1, phase.idxInGroup + 1 )
943
+ case tree1 => transformNode(tree1, phase.idxInGroup + 1 )
944
+ }
945
+ }
946
+
896
947
def prepTypeTree (tree : TypeTree , start : Int )(using Context ): Context = {
897
948
val phase = nxTypeTreePrepPhase(start)
898
949
if (phase == null ) ctx
0 commit comments