如何通过@annotations和AST转换使IDE了解类的添加?

时间:2018-03-16 08:07:52

标签: java eclipse intellij-idea groovy annotations

我正在使用本地Groovy AST转换创建一个自定义注释,该转换是目标类型,并将为它注释的类添加一些额外的方法和一个字段(很像@Bindable annotation)。

但是,如何让IDE了解添加到类中的额外字段和方法?

我看到IntelliJ知道@Bindable注释添加的额外方法,但它似乎与我的一起使用。

1 个答案:

答案 0 :(得分:4)

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

GDSL的documentation有点薄。

TO THE NEW有一个关于GDSL的series of articles,我刚才读过。我记得他们有点过时但是一个很好的起点。

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

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

我想可以克隆IntelliJ存储库并在一个在调试器中运行的IntelliJ中测试你的GDSL(来自另一个IntelliJ实例),但我还没试过。

在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"]
  }
}