blob: 9ec8c1dc565e3020c058ede2f849c7502b66c6e5 (
plain) (
blame)
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)")
}
|