我希望我的自定义注释必须与不可变注释一起使用。我通过以下代码实现了这一目标-
注释类-
@Retention(RetentionPolicy.SOURCE)
@Target([ElementType.TYPE])
@GroovyASTTransformationClass(classes = TestFactoryTransform)
@interface TestFactory {
}它的转化类-
@GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS)
public class TestFactoryTransform implements ASTTransformation {
@Override
public void visit(ASTNode[] astNodes, SourceUnit sourceUnit) {
ClassNode classNode = (ClassNode) astNodes[1]
if (classNode.getAnnotations(ClassHelper.make(Immutable)).size() == 0) {
// throw ERROR
} else {
...
}
}我有个测试用例来验证-
@TestFactory
@Immutable
@AnnotationCollector
@interface SampleTestFactory {}
@SampleTestFactory
class Test1 {
int f1
}
class TestFactoryTransformTest {
@Test
void testIntField() {
...
}
}这在groovy 2中运行得很好。
但是,在将groovy升级到3.0.13之后。此测试编译失败,因为if条件的TestFactoryTransform为真(不可变注释未找到)。
当我打印classNode.getAnnotations()语句的输出,然后使用groovy 2时,我得到-
[
org.codehaus.groovy.ast.AnnotationNode@16c0bc,
org.codehaus.groovy.ast.AnnotationNode@16c0bc,
org.codehaus.groovy.ast.AnnotationNode@16c0bc
]但是用groovy 3,我得到了
[
org.codehaus.groovy.ast.AnnotationNode@390fbe99[@com.my.transform.TestFactory()],
org.codehaus.groovy.ast.AnnotationNode@587db6e0[@groovy.transform.TupleConstructor(defaults: false)],
org.codehaus.groovy.ast.AnnotationNode@5798d0f[@groovy.transform.ToString(includeSuperProperties: true, cache: true)],
org.codehaus.groovy.ast.AnnotationNode@54f967a6[@groovy.transform.EqualsAndHashCode(cache: true)],
org.codehaus.groovy.ast.AnnotationNode@7293bc6b[@groovy.transform.ImmutableBase()],
org.codehaus.groovy.ast.AnnotationNode@735697ed[@groovy.transform.ImmutableOptions()],
org.codehaus.groovy.ast.AnnotationNode@2818eebe[@groovy.transform.PropertyOptions(propertyHandler: groovy.transform.options.ImmutablePropertyHandler)],
org.codehaus.groovy.ast.AnnotationNode@68c5d616[@groovy.transform.MapConstructor(noArg: true, includeSuperProperties: true, includeFields: true)],
org.codehaus.groovy.ast.AnnotationNode@24992745[@groovy.transform.KnownImmutable()]
]知道吗,为什么我要将不可变的注释与其内部注释隔离开来?以及我能做些什么来解决这个问题。谢谢!
发布于 2022-09-25 17:49:58
如果我没有弄错的话,@Immutable是Groovy2.5.x中的一个单一注释,但是它是用Groovy3.x分解成的组件,现在它只是一个基于@AnnotationCollector的元注释,就像您在GroovyDoc中看到的那样。
我不认为有什么需要修复的,您只需要更新您的逻辑就可以接受新的组件注释,可能是@ImmutableBase和@KnownImmutable。
https://stackoverflow.com/questions/73845575
复制相似问题