假设我有类似以下的方法:
def getInfo(func: () => T) = {
//Code goes here.
}
如何使用Scala 2.11.1的运行时反射来检查传递的匿名函数func
?
我特别感兴趣的是获得func
的AST(抽象语法树),如果可能的话,还要获取首次定义方法的位置(行号,文件)。
到目前为止我所做的就是获取有关参数类型func
的信息,而不是函数本身。
我知道SO上有类似的问题,但它们主要针对其他Scala版本。
答案 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一个宏,它通过应用相同的技术查找函数中另一个范围绑定的所有变量。