如何从 Groovy AST 转换访问所有构造函数?

How can I access all constructors from a Groovy AST transformation?

我正在编写一个 AST 转换,旨在通过使引用端的 setter 也调用拥有端的 setter 来保持双向 JPA 关系同步。这在调用 setFoo() 时可靠地工作,但是在构造函数中初始化的变量(由于声明中的初始化语句、构造函数中的 new 或构造函数参数)不会被链接。

为了处理这种情况,我可以打开所有现有的构造函数(加上任何隐式默认构造函数)并添加必要的代码。但是,一些添加构造函数的常见 AST 转换,例如 @TupleConstructor、运行 在 CANONICALIZATION 阶段,之后就没有可以可靠地插入新指令的阶段了。

如何确保将我的额外代码添加到每个构造函数中,包括可能由其他转换添加的代码?

此处最好的方法不是更改所有构造函数,而是使用一个对象初始化程序块,将其复制到所有构造函数的末尾。如果合作 class 做了一些愚蠢的事情,则存在轻微的不安全发布风险,但这与显式将语句添加到构造函数末尾的风险相同。

方法是:

classNode.addObjectInitializerStatements(assignS(target, value));