1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
object Test extends App {
import scala.reflect.runtime.universe._
//
// x's owner is outer Test scope. Previously the quasiquote expansion
// looked like:
//
// object Test {
// build.withFreshTermName("doWhile")(n =>
// LabelDef(n, List(),
// Block(
// List({ val x = 1; x }),
// If(Literal(Constant(true)), Apply(Ident(n), List()), Literal(Constant(())))))
// }
//
// Here the proper owner is anonymous function, not the Test. Hence
// symbol corruption. In new encoding this is represented as:
//
// object Test {
// {
// val n = build.freshTermName("doWhile")
// LabelDef(n, List(),
// Block(
// List({ val x = 1; x }),
// If(Literal(Constant(true)), Apply(Ident(n), List()), Literal(Constant(()))))
// }
// }
//
// Owner stays the same and life is good again.
//
println(q"do ${ val x = 1; x } while(true)")
}
|