トラバースされたコードの一部を分析する Scala (2.10.0) コンパイラ プラグインを作成しようとしています。
これは私がもともと持っていたものです:
class MyPlugin (val global: Global) extends Plugin {
import global._
val name = "myPlugin"
val components = List[PluginComponent](MyComponent)
private object MyComponent extends PluginComponent {
val global: MyPlugin.this.global.type = MyPlugin.this.global
val runsAfter = List ("refchecks")
val phaseName = "codeAnalysis"
def newPhase (_prev: Phase) = new AnalysisPhase (_prev)
class AnalysisPhase (prev: Phase) extends StdPhase (prev) {
override def name = phaseName
def apply (unit: CompilationUnit) {
codeTraverser traverse unit.body
printLinesToFile(counters.map{case (k,v) => k + "\t" + v},out)
}
def codeTraverser = new ForeachTreeTraverser (tree => /* Analyze tree */)
}
}
}
このコードは期待どおりに機能しますが、このオブジェクトからコード トラバーサー メソッドを切り離すことができないため、気に入りません。CodeTraverser
特定のツリーで分析を実行する別のクラスを書きたいと思います。これは、とりわけ、このコードをより適切にテストするのに役立つ場合があります。
主な問題はunit.body
、内部の Tree タイプが内部にあることscala.reflect.internal.Trees
です。内部バージョンの代わりに作業できればscala.reflect.api.Trees#Tree
、トラバーサー機能を分離して、非常に簡単にテストすることさえできます。
私は2つの間で変換する方法を見つけようとしましたが、役に立ちませんでした. それは可能ですか?彼らのソースコードを見ると、多くのことが似すぎているように見えて、これは不可能ではありません。