scala で AST を変更できる変換オブジェクトを把握するのを手伝ってくれる人はいますか?
Web には多くの例がありますが、再帰がどのように行われているかを理解するのに苦労しています。
たとえば、次の AST がある場合:
def foo = {
true
}
また
def foo = true
そして、それをに変換したい
def foo = {
println("foo")
true
}
変換機能はどのように見えるべきですか。この時点で、次のようなものがあります。
override def transform(tree: Tree) = tree match {
case defdef @ DefDef(_,_,_,_,_,rhs) => rhs match{
case b: Block => treeCopy.Block(b, createPrintln :: b.stats, b.expr)
case _ => //Manage functions without block
}
case t => super.transform(t)
}
private def createPrintln = Apply(Select(Ident("System.out"), newTermName("println")), List(Literal(Constant("foo"))))
正直なところ、例で見たものを適用しているだけですが、ツリーがどのように構築されているのかわかりません。「ダミー用」の説明をいただければ幸いです。
[編集]
セニアの例は素晴らしいですが、次のようなもう少し複雑なツリーがあると、まだ立ち往生しています。
imports bla.bla
class MyObject{
val x = 0
def foo = true
def foo2 = { 1 }
}
object MyObject
期待される結果:
import bla.bla
class MyObject{
val x = 0
def foo = { println("foo"); true }
def foo2 = { println("foo"); 1 }
}
object MyObject