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

如何从Groovy AST转换访问所有构造函数?,groovy,metaprogramming,abstract-syntax-tree,Groovy,Metaprogramming,Abstract Syntax Tree,我正在编写一个AST转换,目的是通过使引用方的setter也调用拥有方的setter来保持双向JPA关系的同步。当调用setFoo()时,这种方法可以可靠地工作,但是在构造函数中初始化的变量(由于声明中的初始值设定项语句、构造函数中的new或构造函数参数)不会被链接 为了处理这种情况,我可以打开所有现有的构造函数(加上任何隐式默认构造函数)并添加必要的代码。但是,一些添加构造函数的常见AST转换,例如@TupleConstructor,在规范化阶段运行,之后没有任何阶段可以可靠地插入新指令 如何

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

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


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

这里的最佳方法不是更改所有构造函数,而是使用对象初始值设定项块,它被复制到所有构造函数的末尾。如果协作类做了一些愚蠢的事情,则会有轻微的不安全发布风险,但这与将语句显式添加到构造函数末尾的风险相同

方法是:

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

这里最好的方法不是改变所有构造函数,而是使用对象初始值设定项块,它被复制到所有构造函数的末尾。如果协作类做了一些愚蠢的事情,则会有轻微的不安全发布风险,但这与将语句显式添加到构造函数末尾的风险相同

方法是:

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

我认为在编译阶段并没有定义转换的顺序。@cjsethno这是潜在的竞争。我想知道是否有任何实际的解决方法。我认为在编译阶段并没有定义转换的顺序。@cjsethno这是潜在的竞争。我想知道是否有什么切实可行的解决办法。