scalac插件:如何在具有丢失的jar

时间:2016-12-23 14:10:18

标签: scala scalac scala-compiler

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

  • namer :如果此插件在命名阶段之后运行,则无论配置如何都会调用它。即使由于缺少jar而没有解决许多符号也没关系。
  • typer :如果jar丢失,则不会在分析单元上调用插件,除非我覆盖报告器的hasErrors方法并将其设置为false。这似乎不是正确的方法。

我错误地认为我必须运行typer阶段才能实现我的目标,因为我将完成解决方案。如果我是对的,是否有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"))


}

0 个答案:

没有答案