Skip to content

Commit 9e85373

Browse files
committed
WIP
1 parent 09a9b91 commit 9e85373

File tree

4 files changed

+39
-5
lines changed

4 files changed

+39
-5
lines changed

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

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,8 @@ class ReifyQuotes extends MacroTransformWithImplicits {
411411
(tree: RefTree) => {
412412
def newCapture = {
413413
val argTpe =
414-
if (tree.isTerm) defn.QuotedExprType.appliedTo(tree.tpe.widen)
414+
if (tree.symbol.is(Inline)) tree.tpe.widen
415+
else if (tree.isTerm) defn.QuotedExprType.appliedTo(tree.tpe.widen)
415416
else defn.QuotedTypeType.appliedTo(defn.AnyType)
416417
val selectArg = arg.select(nme.apply).appliedTo(Literal(Constant(i))).asInstance(argTpe)
417418
val capturedArg = SyntheticValDef(UniqueName.fresh(tree.name.toTermName).toTermName, selectArg)
@@ -445,8 +446,9 @@ class ReifyQuotes extends MacroTransformWithImplicits {
445446
/** Returns true if this tree will be captured by `makeLambda` */
446447
private def isCaptured(tree: RefTree, level: Int)(implicit ctx: Context): Boolean = {
447448
// Check phase consistency and presence of capturer
448-
level == 1 && !tree.symbol.is(Inline) && levelOf.get(tree.symbol).contains(1) &&
449-
capturers.contains(tree.symbol)
449+
( (level == 1 && levelOf.get(tree.symbol).contains(1)) ||
450+
(level == 0 && tree.symbol.is(Inline))
451+
) && capturers.contains(tree.symbol)
450452
}
451453

452454
/** Transform `tree` and return the resulting tree and all `embedded` quotes
@@ -484,8 +486,15 @@ class ReifyQuotes extends MacroTransformWithImplicits {
484486
case tree: Select if tree.symbol.isSplice =>
485487
splice(tree)
486488
case tree: RefTree if isCaptured(tree, level) =>
489+
println("================")
490+
println(tree.show)
491+
println(tree)
492+
println()
493+
println()
494+
println()
487495
val capturer = capturers(tree.symbol)
488-
splice(capturer(tree).select(if (tree.isTerm) nme.UNARY_~ else tpnme.UNARY_~))
496+
if (tree.symbol.is(Inline)) capturer(tree)
497+
else splice(capturer(tree).select(if (tree.isTerm) nme.UNARY_~ else tpnme.UNARY_~))
489498
case Block(stats, _) =>
490499
val last = enteredSyms
491500
stats.foreach(markDef)
@@ -509,7 +518,17 @@ class ReifyQuotes extends MacroTransformWithImplicits {
509518
tree
510519
case tree: DefDef if tree.symbol.is(Macro) && level == 0 =>
511520
markDef(tree)
512-
nested(isQuote = true).transform(tree)
521+
val reifier = nested(isQuote = true)
522+
val b = reifier.transform(tree)
523+
val macroLambda = reifier.embedded.head
524+
println(b.show)
525+
println()
526+
println()
527+
println(macroLambda.show)
528+
println()
529+
println()
530+
println()
531+
println()
513532
// check macro code as it if appeared in a quoted context
514533
cpy.DefDef(tree)(rhs = EmptyTree)
515534
case _ =>

tests/run/quote-simple-macro.check

Whitespace-only changes.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import scala.quoted._
2+
3+
object Macros {
4+
inline def foo(inline i: Int, dummy: Int, j: Int): Int = ~bar(i, '(j))
5+
def bar(x: Int, y: Expr[Int]): Expr[Int] = '{ ~x.toExpr + ~y }
6+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import scala.quoted._
2+
import Macros._
3+
4+
object Test {
5+
def main(args: Array[String]): Unit = {
6+
val x = 2
7+
println(foo(1, x))
8+
}
9+
}

0 commit comments

Comments
 (0)