0

トラバースされたコードの一部を分析する 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つの間で変換する方法を見つけようとしましたが、役に立ちませんでした. それは可能ですか?彼らのソースコードを見ると、多くのことが似すぎているように見えて、これは不可能ではありません。

4

2 に答える 2