准报价
q"""{object MyObject {
def method1() = "m1"
}}
"""
或者
reify{
object MyObject {
def method1() = "m1"
}
}.tree
只是写树的方法
Block(
List(
ModuleDef(Modifiers(), TermName("MyObject"),
Template(
List(Select(Ident(scala), TypeName("AnyRef"))),
noSelfType,
List(
DefDef(Modifiers(), termNames.CONSTRUCTOR, List(), List(List()), TypeTree(),
Block(List(pendingSuperCall), Literal(Constant(())))
),
DefDef(Modifiers(), TermName("method1"), List(), List(List()), TypeTree(),
Literal(Constant("m1"))
)
)
)
)
),
Literal(Constant(()))
)
可以从普通的context.parse
(compile-time) / toolBox.parse
(runtime)获得相同的String
val str: String =
"""object MyObject {
| def method1() = "m1"
|}""".stripMargin
toolBox.parse(str)
有宏的编译时间和宏的运行时间。主要代码及其运行时都有编译时间。宏的运行时间是主代码的编译时间。
MyObject
在
object MyObject {
def method1() = "m1"
}
并且MyObject
在
q"""{object MyObject {
def method1() = "m1"
}}
"""
存在于不同的语境中。前者存在于当前上下文中,后者存在于宏的调用点上下文中。
您可以将一棵树插入(拼接)到一棵树中。您不能将实际对象插入树中。如果您有实际对象(编译树),则将其插入树中为时已晚。
当您看到某物被插入到树中时,这意味着“某物”只是编写树的一种紧凑方式,即类型类的实例Liftable
object MyObject {
def method1() = "m1"
}
implicit val myObjectLiftable: Liftable[MyObject.type] = new Liftable[MyObject.type] {
override def apply(value: MyObject.type): Tree =
q"""
object MyObject {
def method1() = "m1"
}"""
}
q"""
class SomeClass {
$MyObject
}"""
我猜你的宏看起来像
def foo[A](a: A) = macro impl[A]
或者
def foo[A] = macro impl[A]
所以你可以把它叫做foo(MyObject)
orfoo[MyObject.type]
和 inside
def impl[A: c.WeakTypeTag](c: blackbox.Context)...
您可以访问weakTypeOf[A]
,然后是它的符号。拥有符号,您可以拥有方法等的签名。