我有一个sbt插件,需要从源文件中获取编译器AST。我尝试使用以下代码创建一个新的编译器:
val settings = new Settings
settings.usejavacp.value = true
val compiler = new tools.nsc.interactive.Global(settings, new StoreReporter())
但是我收到以下错误:
java.lang.Error: typeConstructor inapplicable for <none>
似乎它与sbt的内部编译器发生了某种冲突。
那么,有没有办法从sbt内部获取这些文件的AST?
或者也许可以直接从sbt的编译器中获取它们? (那会更好,因为我不需要每次都重新编译所有内容)
编辑:
似乎使用tools.nsc.Global而不是“交互式”不会引发错误,但我不知道如何从中获取AST。
编辑:
当我尝试编译一些文件时,tools.nsc.Global
失败并出现相同的错误:(
SBT FAQ声明在初始化编译器时我应该使用一些“代表类型” - settings.embeddedDefaults[MyType]
。但我无法弄清楚我应该发送给它的确切内容。有人可以帮我吗?
答案 0 :(得分:2)
这一行意味着使用java.class.path
系统属性的值作为编译器的类路径:
settings.usejavacp.value = true
在sbt中,这只包括启动器jar,因为这是jvm初始化时类路径上的全部内容。 启动程序jar已使用ProGuard处理,因此它包含不完整的Scala类,并且永远不应位于编译器类路径上。
相反,根据您的需要显式设置类路径:
settings.classpath.value = "some;classpath"