Java 如何让IDE意识到通过@annotations和AST转换添加到类中?

Java 如何让IDE意识到通过@annotations和AST转换添加到类中?,java,eclipse,intellij-idea,groovy,annotations,Java,Eclipse,Intellij Idea,Groovy,Annotations,我正在创建一个带有本地Groovy AST转换的自定义注释,该转换以类型为目标,并将向其注释的类添加一些额外的方法和字段(非常类似于 但是我如何让IDE知道添加到类中的额外字段和方法呢 我看到IntelliJ知道@Bindable注释添加的额外方法,但它似乎与我的方法不兼容。对于IntelliJ,您需要编写扩展或使用GDSL。有些注释是开箱即用的,但这些都是Groovy支持中的特殊情况,即没有代码可以一般地推断添加的方法或字段。根据您的描述,GDSL应该足够了 对于GDSL来说,这个函数有点薄

我正在创建一个带有本地Groovy AST转换的自定义注释,该转换以类型为目标,并将向其注释的类添加一些额外的方法和字段(非常类似于

但是我如何让IDE知道添加到类中的额外字段和方法呢


我看到IntelliJ知道@Bindable注释添加的额外方法,但它似乎与我的方法不兼容。

对于IntelliJ,您需要编写扩展或使用GDSL。有些注释是开箱即用的,但这些都是Groovy支持中的特殊情况,即没有代码可以一般地推断添加的方法或字段。根据您的描述,GDSL应该足够了

对于GDSL来说,这个函数有点薄

我刚才读到一篇关于GDSL的文章。我记得它们有点过时,但这是一个很好的起点

Spock使用的gdsl文件可以作为一个很好的参考:

如果您决定尝试GDSL,则提示:从终端打开IntelliJ。您可以在GDSL文件中使用
println
进行调试

我想克隆IntelliJ存储库并在调试器(从另一个IntelliJ实例)中运行的IntelliJ中测试GDSL是可能的,但我还没有尝试过

在Jetbrains文档的末尾,您将找到一些链接的示例。其中一个是用于
@Bindable
,因此这几乎就是您要寻找的

contributor(context()) {
  if (classType?.fields?.find {it.hasAnnotation("groovy.beans.Bindable")}) {
    method name: "addPropertyChangeListener", type: "void", params: [s: "java.lang.String", l: "java.beans.PropertyChangeListener"]
    method name: "addPropertyChangeListener", type: "void", params: [l: "java.beans.PropertyChangeListener"]

    method name: "removePropertyChangeListener", type: "void", params: [s: "java.lang.String", l: "java.beans.PropertyChangeListener"]
    method name: "removePropertyChangeListener", type: "void", params: [l: "java.beans.PropertyChangeListener"]

    method name: "firePropertyChange", type: "void", params: [s: "java.lang.String", o1: "java.lang.Object", o2: "java.lang.Object"]

    method name: "getPropertyChangeListeners", type: "java.beans.PropertyChangeListener[]"
    method name: "getPropertyChangeListeners", type: "java.beans.PropertyChangeListener[]", params: [s: "java.lang.String"]
  }
}

对于IntelliJ,您需要编写扩展或使用GDSL。有些注释是开箱即用的,但这些都是Groovy支持中的特殊情况,即没有代码可以一般地推断添加的方法或字段。根据您的描述,GDSL应该足够了

对于GDSL来说,这个函数有点薄

我刚才读到一篇关于GDSL的文章。我记得它们有点过时,但这是一个很好的起点

Spock使用的gdsl文件可以作为一个很好的参考:

如果您决定尝试GDSL,则提示:从终端打开IntelliJ。您可以在GDSL文件中使用
println
进行调试

我想克隆IntelliJ存储库并在调试器(从另一个IntelliJ实例)中运行的IntelliJ中测试GDSL是可能的,但我还没有尝试过

在Jetbrains文档的末尾,您将找到一些链接的示例。其中一个是用于
@Bindable
,因此这几乎就是您要寻找的

contributor(context()) {
  if (classType?.fields?.find {it.hasAnnotation("groovy.beans.Bindable")}) {
    method name: "addPropertyChangeListener", type: "void", params: [s: "java.lang.String", l: "java.beans.PropertyChangeListener"]
    method name: "addPropertyChangeListener", type: "void", params: [l: "java.beans.PropertyChangeListener"]

    method name: "removePropertyChangeListener", type: "void", params: [s: "java.lang.String", l: "java.beans.PropertyChangeListener"]
    method name: "removePropertyChangeListener", type: "void", params: [l: "java.beans.PropertyChangeListener"]

    method name: "firePropertyChange", type: "void", params: [s: "java.lang.String", o1: "java.lang.Object", o2: "java.lang.Object"]

    method name: "getPropertyChangeListeners", type: "java.beans.PropertyChangeListener[]"
    method name: "getPropertyChangeListeners", type: "java.beans.PropertyChangeListener[]", params: [s: "java.lang.String"]
  }
}

如果您有Groovy支持,这通常在Eclipse中工作得很好;Eclipse将检查
.class
文件以查找字段之类的内容,根据我的经验,它甚至可以在同一个类中自动完成。@chrylis ok。我无法使用IntelliJ 2017.3使其正常工作。在我的注释/转换或IntelliJ中是否需要做一些明确的事情来让IntelliJ检查.class文件?如果Groovy支持正常工作,这在Eclipse中正常工作;Eclipse将检查
.class
文件以查找字段之类的内容,根据我的经验,它甚至可以在同一个类中自动完成。@chrylis ok。我无法使用IntelliJ 2017.3使其正常工作。在我的注释/转换或IntelliJ中是否需要执行一些明确的操作,以使IntelliJ检查.class文件?谢谢。我设法让自动完成工作。但是,IntelliJ仍然表示这些方法是未知/动态的(在其名称下面加下划线),或者表示如果使用@CompileStatic(以红色显示方法名称),则存在错误。即使我逐字使用bindableTransform.gdsl中的内容。让我觉得IntelliJ还有一些我不知道的秘密酱汁。我现在有IntelliJ 2017.3,无法复制。对我来说,一旦我实现了自动完成,其余的也能正常工作。根据实现的不同,
@CompileStatic
可能需要一个类型检查扩展,但这不是特定于IDE的(如果我理解正确的话,它可以编译?),你是对的。它似乎确实起作用了。我只是需要一点耐心。。。看起来IntelliJ可以在10-30秒左右开始使用这些更改。。。有时它似乎也有点碰运气。有没有一条规则规定.gdsl文件应该放在哪里,这样它才能持续工作?哦,我明白了。是的,IntelliJ有一种不明显的方法来应用GDSL(修改)。它通常具有确定性:转到GDSL文件并添加一行(即按enter键),然后按ctrl+s。在编辑器的顶部会出现一个黄色框,您需要“激活回”(框中的链接)GDSL。谢谢。我设法让自动完成工作。但是,IntelliJ仍然表示这些方法是未知/动态的(在其名称下面加下划线),或者表示如果使用@CompileStatic(以红色显示方法名称),则存在错误。即使我逐字使用bindableTransform.gdsl中的内容。让我觉得IntelliJ还有一些我不知道的秘密酱汁。我现在有IntelliJ 2017.3,无法复制。对我来说,一旦我实现了自动完成,其余的也能正常工作。根据实现的不同,
@CompileStatic
可能需要一个类型检查扩展,但这不是特定于IDE的(如果我理解正确的话,它可以编译?),你是对的。它似乎确实起作用了。我只是需要一点耐心。。。看起来IntelliJ可以在10-30秒左右开始使用这些更改。。。有时它似乎也有点碰运气。有没有一条规则规定.gdsl文件应该放在哪里,这样它才能持续工作?哦,我明白了。是的,IntelliJ有一种不明显的方法来应用GDSL(修改)。它通常具有确定性:转到GDSL文件并添加一行(即按enter键),然后按ctrl+s。在编辑器顶部会出现一个黄色框,您需要“激活回”(所述框中的链接)GDSL。