0

メソッドの実装で特定のメソッドが使用されているかどうかを調べる必要があります。たとえば、私はこの素晴らしいアプリを持っています:

object Test extends App {

    def getGreetings = Array.fill(2)("hello")

    println(getGreetings.mkString("\n"))

}

メソッドが配列のコンパニオン オブジェクトのgetGreetings関数を使用しているかどうかをテストしたいと思います。fillテストは上記の実装で成功し、たとえば次のように失敗します。

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(())))

ここで欠けている部分は、どのメソッドのコードに対しても同じことを行う方法です。これにより、 method の内部にあるもののツリーを取得できますgetGreetings

前もって感謝します :)

4

0 に答える 0