2

我有一个 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]. 但我无法确切地知道我应该发送给它什么。有人可以帮我吗?

4

1 回答 1

2

这一行意味着使用java.class.path系统属性的值作为编译器的类路径:

settings.usejavacp.value = true

在 sbt 中,这只会包含启动器 jar,因为这是初始化 jvm 时类路径上的全部内容。启动器 jar 已使用 ProGuard 处理,因此它包含不完整的 Scala 类,并且永远不应位于编译器类路径中。

相反,根据您的需要显式设置类路径:

settings.classpath.value = "some;classpath"
于 2012-09-12T19:45:36.410 回答