blob: ddad9fb8725a5ba5e82e48ff2622e803fe88ef0a (
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
32
33
34
35
36
37
38
39
40
41
42
43
44
|
import scala.reflect.macros.whitebox._
import scala.language.experimental.macros
import java.io._
object Macros {
def impl(c: Context) = {
var messages = List[String]()
def println(msg: String) = messages :+= msg
import c.universe._
def test(sym: ClassSymbol): Unit = {
def fullyInitializeSymbol(sym: Symbol): Unit = {
val internal = c.universe.asInstanceOf[scala.reflect.internal.SymbolTable]
internal.definitions.fullyInitializeSymbol(sym.asInstanceOf[internal.Symbol])
}
def defString(sym: Symbol): String = {
val internal = c.universe.asInstanceOf[scala.reflect.internal.SymbolTable]
sym.asInstanceOf[internal.Symbol].defString
}
def showCtor(sym: Symbol): String = {
fullyInitializeSymbol(sym)
if (sym == NoSymbol) "NoSymbol"
else s"${defString(sym)} => ${sym.asMethod.isPrimaryConstructor}"
}
sym.info
println(sym.toString)
println(s"primary constructor: ${showCtor(sym.primaryConstructor)}")
val ctors = sym.info.members.filter(_.name == termNames.CONSTRUCTOR).map(sym => showCtor(sym))
ctors.toList.sorted.foreach(println)
}
println("compile-time")
test(typeOf[File].typeSymbol.asClass)
test(definitions.ScalaPackageClass)
test(definitions.ListModule.moduleClass.asClass)
test(typeOf[Product1[_]].typeSymbol.asClass)
test(typeOf[UninitializedFieldError].typeSymbol.asClass)
test(c.mirror.staticClass("C").asClass)
q"..${messages.map(msg => q"println($msg)")}"
}
def foo: Any = macro impl
}
|