Quasiquote
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- время) / toolBox.parse
(время выполнения) из обычного 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"
}}
"""
существуют в разных контекстах. Первый существует в текущем контексте, последний существует в контексте сайта вызова макроса.
Вы можете вставить (соединить) дерево в дерево. Вы не можете вставить реальный объект в дерево. Если у вас есть реальный объект (скомпилированное дерево), уже слишком поздно вставлять его в дерево.
Когда вы видите, что что-то вставляется в дерево, это означает, что «что-то» - это просто компактный способ написать дерево т.е. экземпляр типа class 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)
или foo[MyObject.type]
а внутри
def impl[A: c.WeakTypeTag](c: blackbox.Context)...
у вас есть доступ к weakTypeOf[A]
, затем к его символу. Имея символ, вы можете иметь подписи методов и т. Д. c.