标签: groovyc

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

我正在尝试在所有 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 compilation kotlin groovyc

6
推荐指数
1
解决办法
259
查看次数

GroovyAST 在编译时添加泛型字段

我想在编译时向某些类添加通用字段。为了这个目标,我按照官方文档实现了我自己的 AST 注释和转换类,并使用 AST 注释来注释所需的类。

但我在编译时收到此错误:

org.codehaus.groovy.control.MultipleCompilationErrorsException:启动失败:/home/.../groovy/Sample.groovy:-1:转换直接使用包含 ClassNode java.util.HashSet 的泛型作为字段 x。你不应该这样做。请参考旧的 ClassNode 创建一个新的 ClassNode,并使用新的 ClassNode 代替旧的 ClassNode。否则,编译器将在 OpenJDK 的 TypeResolver 中创建错误的描述符和潜在的 NullPointerException。如果这不是您自己做的,请将此错误报告给转换的作者。@ 第 -1 行,第 -1 列。

我做错了吗?

示例代码

例如,假设我想向每个通过注释进行注释的类添加一个HashSet<Long>名为的字段。xMyAST

我的 AST 注释类:

@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
@GroovyASTTransformationClass(classes = [MyASTTransformation.class])
public @interface MyAST {
}
Run Code Online (Sandbox Code Playgroud)

我的 AST 转换类:

@CompileStatic
@GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS)
public class MyASTTransformation implements ASTTransformation {

@Override
public void visit(ASTNode[] nodes, SourceUnit sourceUnit) {
     ClassNode clazz = (ClassNode) nodes[1];
     ClassNode longHashSetClass = new ClassNode(HashSet.class); …
Run Code Online (Sandbox Code Playgroud)

generics groovy bytecode abstract-syntax-tree groovyc

5
推荐指数
1
解决办法
592
查看次数