2012-08-25 10 views
10

scala 2.10 ASTの要素を再帰的に検索する最良の方法は何ですか?scala 2.10 ASTの検索

木がpower.trees(code)またはmirror.mkToolBox().parseExpr(code) 編集の結果である可能性があります。 2.10.0-RC1でparseExprparseに名前が変更されました。

私が持っている具体的な使用例は、メソッド名で指定されたクラス/オブジェクトコードからメソッド名 でメソッドのコードを抽出することですが、より一般的な方法で定式化すると、 。

答えて

5

たぶん、あなたは特にクラスバーサ、変圧器と置換する方法(Tree.substituteSymbolsTree.substituteTypesまたはTree.substituteThis)で、https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606を見ている必要があります。ツリーからメソッドを抽出する場合は、Traverserを使用し、traverseメソッドをオーバーライドすることができます。トラバースメソッドでは、ノードが目的のメソッドと一致するかどうかをチェックします。そうなら、あなたは完了です。そうでない場合は、super.traverseに電話してください。

+1

リンクされたコードは、トランクと比較してかなり古くなっています。正しいリンクは次のとおりです:1)ツリーのASTクラス:https://github.com/scala/scala/blob/2.10.x/src/library/scala/reflect/base/Trees.scala、2)トランスフォーマーとトラバーサ: https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606 –

+0

おっと、ありがとう... –

+1

トランスフォーマーの例は次のとおりです。https:/ /github.com/scala/scala/blob/46d57d47e81c8794a9a3594e080576788cc92324/src/compiler/scala/reflect/reify/phases/Reshape.scala(コードでは間違いなくクリーンアップを使用しますが、無視するのはあまりにもいい例です)。 'super.transform'と' copyAttrs'の部分に注目してください。 –

関連する問題