我需要找出方法实现中是否使用了某种方法。例如,我有一个很棒的应用程序:
object Test extends App {
def getGreetings = Array.fill(2)("hello")
println(getGreetings.mkString("\n"))
}
我想测试方法是否getGreetings
使用了fill
Array 的伴生对象的功能。测试将通过上述实现成功并失败,例如:
def getGreetings = Array("hello", "hello") // nah, fill isn't used
在这段视频的帮助下,我了解到我可以使用这样的宏检查实现:
def printTree(title: String)(expr: Any): Unit = macro printTreeMacro
def printTreeMacro(c: Context)(title: c.Tree)(expr: c.Tree) = {
import c.universe._
val code : String = showCode(expr)
val raw : String = showRaw(expr)
q"""
println(
$title.toUpperCase + "\n\n" +
$code + "\n\n" +
$raw + "\n\n"
)
"""
}
printTree("Method") {
val a = Array.fill(2)("hello")
}
现在printTree
揭示了使用的fill
方法:
Block(List(ValDef(Modifiers(), TermName("a"), TypeTree(),
Apply(Apply(Apply(TypeApply(Select(Select(Ident(scala), scala.Array),
TermName("fill")), List(TypeTree())), List(Literal(Constant(2)))),
List(Literal(Constant("hello")))),
List(Typed(Apply(TypeApply(Select(Ident(scala.reflect.ClassTag),
TermName("apply")), List(TypeTree())),
List(Literal(Constant(String)))), TypeTree()))))), Literal(Constant(())))
这里缺少的部分是如何对任何方法的代码做同样的事情,这样我就可以获得方法内部的树getGreetings
。
提前致谢 :)