@@ -321,16 +321,21 @@ class ReifyQuotes extends MacroTransformWithImplicits {
321
321
val last = enteredSyms
322
322
stats.foreach(markDef)
323
323
mapOverTree(last)
324
- case Inlined (call, bindings, expansion @ Select (body, name)) if expansion.symbol.isSplice =>
324
+
325
+ case Inlined (call, bindings, InlineSplice (expansion @ Select (body, name))) =>
325
326
// To maintain phase consistency, we move the binding of the this parameter into the spliced code
326
327
val (splicedBindings, stagedBindings) = bindings.partition {
327
328
case vdef : ValDef => vdef.symbol.is(Synthetic ) // Assume that only _this bindings are tagged with Synthetic
328
329
case _ => false
329
330
}
331
+
330
332
val tree1 =
331
333
if (level == 0 ) cpy.Inlined (tree)(call, stagedBindings, Splicer .splice(seq(splicedBindings, body)))
332
334
else seq(stagedBindings, cpy.Select (expansion)(cpy.Inlined (tree)(call, splicedBindings, body), name))
333
335
transform(tree1)
336
+
337
+ if (tree.tpe =:= defn.UnitType ) Block (tree1 :: Nil , Literal (Constant (())))
338
+ else tree1
334
339
case _ : Import =>
335
340
tree
336
341
case tree : DefDef if tree.symbol.is(Macro ) && level == 0 =>
@@ -343,5 +348,20 @@ class ReifyQuotes extends MacroTransformWithImplicits {
343
348
checkLevel(mapOverTree(enteredSyms))
344
349
}
345
350
}
351
+
352
+ /** InlineSplice is used to detect cases where the expansion
353
+ * consists of a (possibly multiple & nested) block or a sole expression.
354
+ */
355
+ object InlineSplice {
356
+ def unapply (tree : Tree )(implicit ctx : Context ): Option [Select ] = {
357
+ tree match {
358
+ case expansion : Select if expansion.symbol.isSplice =>
359
+ Some (expansion)
360
+ case Block (List (stat), Literal (Constant (()))) => unapply(stat)
361
+ case Block (Nil , expr) => unapply(expr)
362
+ case _ => None
363
+ }
364
+ }
365
+ }
346
366
}
347
367
}
0 commit comments