如何使用Scalas运行时反射来检查传递的匿名函数?

时间:2014-06-29 22:44:21

标签: scala reflection anonymous-function mirror scala-2.11

假设我有类似以下的方法:

def getInfo(func: () => T) = {
  //Code goes here.
}

如何使用Scala 2.11.1的运行时反射来检查传递的匿名函数func

我特别感兴趣的是获得func的AST(抽象语法树),如果可能的话,还要获取首次定义方法的位置(行号,文件)。 到目前为止我所做的就是获取有关参数类型func的信息,而不是函数本身。

我知道SO上有类似的问题,但它们主要针对其他Scala版本。

1 个答案:

答案 0 :(得分:1)

正如Ben在评论中提到的,这可以在编译时使用Scala宏来完成。

一种可能的选择是将原始调用扩展为查询必要信息的宏,然后调用内部getInfoMethod,它对信息执行某些操作。

getInfo功能的示例:

import scala.language.experimental.macros
//getInfo method which gets expanded to macro
def getInfo(func: => Any):Unit = macro FindFreeVars.findMacro

def getInfoInternal(info: Any) {
   //Do something with the collected information
}

宏示例:

//Macro delclaration
def getInfoMacro(c: Context)(func: c.Tree): c.Expr[Unit] = {
    import c.universe._

    //Extract information, like enclosingPosition or symols from the function tree. 
    val functionInfo = getFunctionInfo(func)

    //Call internal method
    c.Expr[List[(String, Any)]](q"getInfoInternal($func, $closedVars)")
}

有关Symbols, Trees and Types的详情,请进行分析。

More complete example一个宏,它通过应用相同的技术查找函数中另一个范围绑定的所有变量。