@@ -15,9 +15,6 @@ import SymUtils._
1515import NameKinds .OuterSelectName
1616import scala .collection .mutable
1717
18- // TODO
19- // adapt to Expr/Type when passing arguments to splices
20-
2118/** Translates quoted terms and types to `unpickle` method calls.
2219 * Checks that the phase consistency principle (PCP) holds.
2320 */
@@ -173,6 +170,19 @@ class ReifyQuotes extends MacroTransform {
173170 case _ =>
174171 }
175172
173+ /** Does the level of `sym` match the current level?
174+ * An exception is made for inline vals in macros. These are also OK if their level
175+ * is one higher than the current level, because on execution such values
176+ * are constant expression trees and we can pull out the constant from the tree.
177+ */
178+ def levelOK (sym : Symbol )(implicit ctx : Context ): Boolean = levelOf.get(sym) match {
179+ case Some (l) =>
180+ l == level ||
181+ sym.is(Inline ) && sym.owner.is(Macro ) && sym.info.isValueType && l - 1 == level
182+ case None =>
183+ true
184+ }
185+
176186 /** Issue a "splice outside quote" error unless we ar in the body of an inline method */
177187 def spliceOutsideQuotes (pos : Position )(implicit ctx : Context ) =
178188 ctx.error(i " splice outside quotes " , pos)
@@ -188,7 +198,7 @@ class ReifyQuotes extends MacroTransform {
188198 else i " ${sym.name}.this "
189199 if (! isThis && sym.maybeOwner.isType)
190200 check(sym.owner, sym.owner.thisType, pos)
191- else if (sym.exists && ! sym.isStaticOwner && levelOf.getOrElse (sym, level) != level )
201+ else if (sym.exists && ! sym.isStaticOwner && ! levelOK (sym) )
192202 tp match {
193203 case tp : TypeRef =>
194204 importedTypes += tp
@@ -329,7 +339,8 @@ class ReifyQuotes extends MacroTransform {
329339 cpy.Select (expansion)(cpy.Inlined (tree)(call, bindings, body), name)
330340 case _ : Import =>
331341 tree
332- case tree : DefDef if tree.symbol.is(Macro ) =>
342+ case tree : DefDef if tree.symbol.is(Macro ) && level == 0 =>
343+ markDef(tree)
333344 val tree1 = nested(isQuote = true ).transform(tree)
334345 // check macro code as it if appeared in a quoted context
335346 cpy.DefDef (tree)(rhs = EmptyTree )
0 commit comments