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 32 33 34 35 36 37 38 39 40 41 42
|
trait T {
val traitVal = ""
}
object O extends App with T {
val vall = ""
lazy val lazyy = ""
def deff = ""
println(vall) // no warn
new {
println(vall) // no warn
}
}
object Client {
println(O.vall) // warn
import O.vall
println(vall) // warn
println(O.lazyy) // no warn
println(O.deff) // no warn
println(O.traitVal) // no warn
}
// Delayed init usage pattern from Specs2
// See: https://groups.google.com/d/msg/scala-sips/wP6dL8nIAQs/ogjoPE-MSVAJ
trait Before extends DelayedInit {
def before()
override def delayedInit(x: => Unit): Unit = { before; x }
}
object Spec {
trait UserContext extends Before {
def before() = ()
val foo = "foo"
}
new UserContext {
println(foo) // no warn
println(this.foo) // no warn
println({locally(()); this}.foo) // warn (spurious, but we can't discriminate)
}
}
|