【问题标题】:Can 'groovyc' be told to just generate stubs? (Joint-compile of Java+Groovy+Kotlin)可以告诉“groovyc”只生成存根吗? (Java+Groovy+Kotlin 联合编译)
【发布时间】:2018-12-13 10:20:04
【问题描述】:

我正在尝试在所有 Java、Groovy 和 Kotlin 之间进行联合/混合编译。 我目前正在研究一个理论,即如果可以使 groovyc 仅作为第一阶段发出存根文件,那么它应该是可能的。

可以吗?否则,是否有任何关于从 Groovy 的源代码中制作此类功能的指针?

这是完全混合编译的想法:

  1. 让 Groovyc 为其所有类创建 Java 存根。 AFAIU,它逐个文件地执行此“盲目”操作,而没有看到任何其他来源。 (这是关键,这个问题是关于什么的:只有 groovyc(或其中的一部分)生成存根)。
  2. 让 Kotlinc 编译 Kotlin 文件,基于 Java 的 Java 文件和 Groovy 的 Java 存根输入(通过将它们添加到 kotlinc 的类路径)
  3. 让 Javac 编译 Java 文件,基于 Groovy 的 Java 存根和 Kotlin 的类文件(通过将它们添加到 javac 的类路径,或为 Java 存根使用 -sourcepath)。
  4. 让 Groovyc 编译 Groovy 文件,基于 Java 的类文件和 Kotlin 的类文件的类型(通过将它们添加到 groovyc 的类路径)。

【问题讨论】:

    标签: java groovy kotlin compilation groovyc


    【解决方案1】:

    以编程方式执行此操作相对容易,但当前命令行不支持此操作。对于编程使用,您需要类似 [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

    【讨论】:

      【解决方案2】:

      使用构建工具,例如 Gradle 或 Maven。

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

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

      Groovy 调用 Java 是我每天都在使用的东西,Java 到 Groovy 也是可能的,但您需要了解 Groovy 的工作原理,因为有许多 Groovy 编码习惯不能直接从 Java 调用,但标准类可以工作完美。

      Kotlin 也有类似的限制。

      【讨论】:

      • 这正是我不想要的。我想将文件混合在一个目录中。我想要所有类型的文件之间的互操作性。我的这个设置非常适合 Java/Groovy,我可以让它与 Kotlin 一起工作,但是我不能有“三种方式”互操作。我想要的。如果我得到我的问题的答案,我可以得到它。 (PS:我当然用的是构建工具,我更喜欢 Gradle。)
      • 你是如何为 groovy/java 做的?都是通过 groovyc 完成的 - 对吧?
      • @daggett 是的,groovyc 的“联合编译”功能。这就是,AFAIU,Groovy 为 Groovy 文件创建 Java 存根文件,然后使用 javac 和类路径上的存根编译 Java,然后自己编译 Groovy 文件,现在在类路径上使用已编译的 Java 类。或者类似的东西。
      • @stolsvik 该过程基本上是正确的。存根是在编译过程的早期生成的,因此目前并不是所有的 AST 转换结果都会反映在存根中。在您的场景中,您仍然希望在接口后面隐藏使用大量 AST/trait 的 Groovy 类。
      猜你喜欢
      • 1970-01-01
      • 2010-11-20
      • 2018-07-21
      • 2021-06-19
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      相关资源
      最近更新 更多