我正在使用本地Groovy AST转换创建一个自定义注释,该转换是目标类型,并将为它注释的类添加一些额外的方法和一个字段(很像@Bindable annotation)。
但是,如何让IDE了解添加到类中的额外字段和方法?
我看到IntelliJ知道@Bindable注释添加的额外方法,但它似乎与我的一起使用。
答案 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"]
}
}