2016-07-16 71 views
0

我正在編寫一個scala宏,它檢查給定的函數以找到它的參數名稱和類型。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 
}) 

現在我在想,如果有可能讓原有的功能「你好」的保持宏觀 內,提取它的類型信息。用 仔細檢查宏中可用的信息,調試器不會產生所期望的結果。

所以我想知道是否有可能,如果沒有:爲什麼?如果可能的話,怎麼樣?

+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... 
...