为什么 Grails 应用程序中的 Groovy AST 转换仅在 class 重新加载期间应用?

Why is this Groovy AST transformation within a Grails app only being applied during class reloading?

为了开发全局 AST 转换以向我的应用程序中的枚举添加新方法 class,我使用 Grails 5 设置了这个示例项目。

https://github.com/davebrown1975/grails_enum_experiment

预期的行为是在 compilation/building 上,AST 转换将应用于项目中的单个枚举 class ('tst.ExampleEnum')。我可以看到在我的 Transformer ('tst.EnumTranslationTransformation') 中调用了 'visit' 方法,但是作为参数传递给访问方法的 sourceunit ast classes 从不包含我的 Enum class .

一旦应用 运行 但是,如果我对 Enum class 进行最简单的更改,例如在某处按下 space 并将其保存以触发编译和重新加载,然后这次我将在控制台中看到输出,通知我调用了访问方法并且检测到枚举 class 并且已应用 AST。

我已经尝试过,根据 Grails 文档,在它自己的 'plugin' 中建立了转换 class,将 class 放入 org.grails.compiler 的子包中.这些都没有什么不同,直到我从新文件 META-INF/services/org.codehaus.groovy.transform.ASTTransformation

中引用 EnumTranslatorTransformation class 之前,我一直没有看到 AST 被调用

任何关于我在这里遗漏的想法都将不胜感激。

我发现确保在构建时编译 AST 并将其应用于枚举的解决方案是将转换放入内联插件中。此时的关键是确保 META-INF/services/org.codehaus.groovy.transform.ASTTransformation 文件被移动到插件而不是主应用程序。只有这样我才能看到在清理和构建项目后应用的转换。