Scala宏:函数引用的参数类型

时间:2016-07-16 12:10:46

标签: scala macros

我正在编写一个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' 并提取它的类型信息。仔细检查宏内可用的信息 调试器没有产生希望的东西。

所以我想知道是否可能,如果不是:为什么?如果有可能,怎么样?

1 个答案:

答案 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...
...