可以告诉 'groovyc' 只生成存根吗? (Java+Groovy+Kotlin 联合编译)

Can 'groovyc' be told to just generate stubs? (Joint-compile of Java+Groovy+Kotlin)

我正在尝试在所有 Java、Groovy 和 Kotlin 之间进行 joint/mixed 编译。 我目前正在研究一个理论,如果可以让 groovyc 只在第一阶段发出存根文件,那应该是可能的。

可以吗?否则,任何指向从 Groovy?

的来源制作这样的功能的指针

全混合编译思路如下:

  1. 让 Groovyc 为其所有 classes 创建 Java-存根。 AFAIU,它逐个文件执行此操作 "blind",没有看到任何其他来源。 (这很重要,这个问题是关于什么的:有 groovyc(或某些部分它的)只生成存根)。
  2. 让 Kotlinc 编译 Kotlin 文件,基于 Java 的 Java 文件和 Groovy 的 Java 存根(通过将它们添加到 kotlinc 的class路径)
  3. 让 Javac 编译 Java 文件,基于 Groovy 的 Java 存根和 Kotlin 的 class 文件进行键入(通过将它们添加到 javac 的 class 路径,或为 Java-存根使用 -sourcepath)。
  4. 让 Groovyc 编译 Groovy-文件,基于为 Java 键入 class-文件,为 Kotlin 键入 class-文件(通过将它们添加到 groovyc 的 classpath).

使用 Gradle 或 Maven 等构建工具。

它们有一个标准的项目文件布局,其中指定了目录结构和命名约定。您将 groovy 源文件放在 /src/groovy/ 下, java 源文件放在 /src/java/ 下,kotlin 类似。

使用选择的构建工具初始化项目目录并准备基础构建配置。如果构建配置告诉工具有多种语言,那么它们将在编译时自动了解彼此。更重要的是,如果您使用 IDE,例如 IntelliJ(甚至是免费版本),编辑器将理解构建配置并了解多种语言,并提供导入建议和 class/method 完成。

Groovy 调用 Java 是我每天使用的东西,Java 调用 Groovy 也是可能的,但你需要了解 Groovy 是如何工作的从某种意义上说,有许多 Groovy 编码习语不能直接从 Java 调用,但标准 类 工作得很好。

类似的限制适用于 Kotlin。

这相对容易以编程方式完成,但目前不支持命令行。对于程序化使用,您需要类似 [1] 的内容,但将引用行上的阶段更改为 SEMANTIC_ANALYSIS。您还需要按照 [2].

保留存根

要从命令行启用此功能,FileSystemCompiler 需要了解完成阶段,并且 [3] 中的 unit.compile() 语句需要了解该阶段。但我自己并没有真正尝试过这些改变。

[1] https://github.com/apache/groovy/blob/master/src/test/groovy/bugs/Groovy6086Bug.groovy#L63

[2]https://github.com/apache/groovy/blob/master/src/test/groovy/bugs/Groovy9031.groovy#L33

[3] https://github.com/apache/groovy/blob/master/src/main/java/org/codehaus/groovy/tools/FileSystemCompiler.java#L309-L317