1

我目前正在尝试构建一个插件来访问 Scala 生成的 AST 以运行一些规则检查。到目前为止,它只漂亮地打印了 AST 以参与进来。AFAK,这个插件可能会在不同的阶段之后运行,但我尝试了这两个:

  • namer:如果此插件在 namer 阶段之后运行,则无论配置如何都会调用它。即使由于缺少 jar 导致许多符号无法解析也很好。
  • typer:如果缺少jar,则不会在分析单元上调用插件,除非我覆盖了reporter的hasErrors方法并将其设置为false。这似乎不是正确的方法。

我是否错误地认为我必须运行打字机阶段才能实现我的目标,因为将为我完成解决方案。如果我是对的,是否有 scalac 的配置可以帮助发出未解析类型的节点,而不是在编译单元级别停止编译?如果我错了,为什么我的插件看不到任何打印输出

那么演示文稿编译器会有所帮助吗?或者,也许使用插件的想法不是正确的。

这是用于调用的代码

object TestJF {
val settings = new Settings


settings.plugin.appendToValue("")
settings.bootclasspath.append("C:\\Users\\JTR\\.ivy2\\cache\\org.scala-lang\\scala-library\\jars\\scala-library-2.11.8.jar")
settings.classpath.append("C:\\Users\\JTR\\.ivy2\\cache\\org.scala-lang\\scala-library\\jars\\scala-library-2.11.8.jar")
settings.classpath.append("C:\\Users\\JTR\\.ivy2\\cache\\org.scala-lang\\scala-library\\jars\\scala-library-2.11.8.jar")
settings.classpath.append("C:\\Users\\JTR\\.ivy2\\cache\\org.scala-lang\\scala-compiler\\jars\\scala-compiler-2.11.8.jar")
// missing jar here to trigger resolution issues
//settings.classpath.append("C:\\Users\\JTR\\.ivy2\\cache\\org.scala-lang\\scala-reflect\\jars\\scala-reflect-2.11.8.jar")

settings.plugin.appendToValue("C:\\Users\\jeff\\IdeaProjects\\scalanyzer\\target\\scala-2.11\\scalanyzer_2.11-1.0.jar")
settings.Yidedebug.value = true
settings.genPhaseGraph.value = "phases"
settings.Ylogcp.value = true
settings.nowarn.value = true


settings.developer.value = true
settings.withErrorFn (err => { println("ERROR" +err) })

val global = Global(settings, new ConsoleReporter(settings)
{
   override def hasErrors: Boolean = false
})


def main (args : Array[String]) : Unit = {
  val run = new global.Run() {
     override def informUnitStarting(phase: Phase, unit: TestJF.global.CompilationUnit): Unit = {
        println(s"Phase ${phase.name} with unit ${unit.source.path}")
     }

  }

      run.compile(List("C:\\Users\\jeff\\IdeaProjects\\untitled\\src\\main\\java\\TestJf.scala"))


}
4

0 回答 0