我正在使用本地Groovy AST转换创建一个目标类型的自定义批注,并将在其批注的类中添加一些额外的方法和一个字段(非常类似于@Bindable annotation)。
但是,如何使IDE知道添加到类中的其他字段和方法呢?
我看到IntelliJ知道@Bindable注释添加的其他方法,但似乎不适用于我的方法。
最佳答案
对于IntelliJ,您需要编写扩展名或使用GDSL。开箱即用地支持某些注释,但是在Groovy支持中,所有这些都是特殊情况,即,没有代码可以通用地推断添加的方法或字段。根据您的描述,GDSL应该足够了。
GDSL的documentation有点薄。
我最近读过关于GDSL的最新消息。我记得它们有些过时,但是是一个很好的起点。
Spock使用了一个gdsl文件,可以作为一个很好的参考:series of articles
如果您决定尝试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"]
}
}