Skip to content

Commit 687d06e

Browse files
committed
Transform Quote/Splice in MiniPhase
To transform quotes and splices in inline methods.
1 parent 1ef7f59 commit 687d06e

File tree

3 files changed

+51
-9
lines changed

3 files changed

+51
-9
lines changed

compiler/src/dotty/tools/dotc/transform/ElimByName.scala

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,6 @@ class ElimByName extends MiniPhase, InfoTransformer:
159159
else tree
160160
}
161161

162-
override def transformOther(tree: Tree)(using Context): Tree = tree match
163-
case tree @ Splice(spliced, tpt) =>
164-
assert(dotty.tools.dotc.inlines.Inlines.inInlineMethod)
165-
cpy.Splice(tree)(transformAllDeep(spliced), tpt)
166-
case tree => tree
167-
168162
object ElimByName:
169163
val name: String = "elimByName"
170164
val description: String = "map by-name parameters to functions"

compiler/src/dotty/tools/dotc/transform/FirstTransform.scala

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,6 @@ class FirstTransform extends MiniPhase with InfoTransformer { thisPhase =>
153153
override def transformOther(tree: Tree)(using Context): Tree = tree match {
154154
case tree: Export => EmptyTree
155155
case tree: NamedArg => transformAllDeep(tree.arg)
156-
case tree @ Splice(expr, tpt) =>
157-
assert(dotty.tools.dotc.inlines.Inlines.inInlineMethod)
158-
cpy.Splice(tree)(transformAllDeep(expr), transformAllDeep(tpt))
159156
case tree => if (tree.isType) toTypeTree(tree) else tree
160157
}
161158

compiler/src/dotty/tools/dotc/transform/MegaPhase.scala

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package transform
55
import core._
66
import Contexts._, Phases._, Symbols._, Decorators._
77
import Flags.PackageVal
8+
import staging.StagingLevel.*
89

910
/** A MegaPhase combines a number of mini-phases which are all executed in
1011
* a single tree traversal.
@@ -66,6 +67,8 @@ object MegaPhase {
6667
def prepareForTry(tree: Try)(using Context): Context = ctx
6768
def prepareForSeqLiteral(tree: SeqLiteral)(using Context): Context = ctx
6869
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
6972
def prepareForTypeTree(tree: TypeTree)(using Context): Context = ctx
7073
def prepareForBind(tree: Bind)(using Context): Context = ctx
7174
def prepareForAlternative(tree: Alternative)(using Context): Context = ctx
@@ -100,6 +103,8 @@ object MegaPhase {
100103
def transformTry(tree: Try)(using Context): Tree = tree
101104
def transformSeqLiteral(tree: SeqLiteral)(using Context): Tree = tree
102105
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
103108
def transformTypeTree(tree: TypeTree)(using Context): Tree = tree
104109
def transformBind(tree: Bind)(using Context): Tree = tree
105110
def transformAlternative(tree: Alternative)(using Context): Tree = tree
@@ -394,6 +399,18 @@ class MegaPhase(val miniPhases: Array[MiniPhase]) extends Phase {
394399
val expansion = transformTree(tree.expansion, start)(using inlineContext(tree.call))
395400
goInlined(cpy.Inlined(tree)(tree.call, bindings, expansion), start)
396401
}
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+
}
397414
case tree: Return =>
398415
inContext(prepReturn(tree, start)(using outerCtx)) {
399416
val expr = transformTree(tree.expr, start)
@@ -546,6 +563,10 @@ class MegaPhase(val miniPhases: Array[MiniPhase]) extends Phase {
546563
private val nxSeqLiteralTransPhase = init("transformSeqLiteral")
547564
private val nxInlinedPrepPhase = init("prepareForInlined")
548565
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")
549570
private val nxTypeTreePrepPhase = init("prepareForTypeTree")
550571
private val nxTypeTreeTransPhase = init("transformTypeTree")
551572
private val nxBindPrepPhase = init("prepareForBind")
@@ -893,6 +914,36 @@ class MegaPhase(val miniPhases: Array[MiniPhase]) extends Phase {
893914
}
894915
}
895916

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+
896947
def prepTypeTree(tree: TypeTree, start: Int)(using Context): Context = {
897948
val phase = nxTypeTreePrepPhase(start)
898949
if (phase == null) ctx

0 commit comments

Comments
 (0)