我正在编写一个scala宏,它检查给定的函数以找到它的参数名称和类型。
def hello(i: Int, s: String) = s + i
到目前为止,如果我像这样喂宏:
val args: TypeInfo = signature(hello _)
但我也希望能够提供对原始功能的引用:
def invokeMacro(f: (Int, String) => String) = signature(f)
invokeMacro(hello)
不幸的是,这不起作用。
以下是我在宏中获取类型信息的方法:
val typeInfo = TypeInfo(t.filter(_.isDef).collect {
case ValDef(_, name, typ, _) =>
name.decodedName.toString -> typ.tpe.toString
})
现在我想知道,如果有可能在宏内部获得原始函数'hello' 并提取它的类型信息。仔细检查宏内可用的信息 调试器没有产生希望的东西。
所以我想知道是否可能,如果不是:为什么?如果有可能,怎么样?
答案 0 :(得分:1)
因为invokeMacro
是一个函数,而不是一个宏,它没有得到它的参数的AST,而signature
只是看到Ident(TermName("f"))
作为它的参数(或类似的东西)。这不是ValDef
,因此您的匹配失败。当然,hello
这个名称在任何方面都不存在(但你可以得到类型)。
要解决此问题,invokeMacro
本身需要是一个只生成signature(f)
调用的宏。或者,更一般地说,
def invokeMacro0[A](f: () => A) = macro...
def invokeMacro1[A, B](f: A => B) = macro...
def invokeMacro2[A, B, C](f: (A, B) => C) = macro...
...