Groovy 3-分离的AST转换注解

wfveoks0  于 2022-10-07  发布在  其他
关注(0)|答案(1)|浏览(169)

我希望我的自定义注解必须与不可变注解结合使用。我通过以下代码实现了这一点-

注解类-

@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之后。此测试编译失败,因为TestFactoryTransform的if条件为True(未找到不可变注解)。

当我打印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()]
]

你知道为什么我要让不变的注解与它的内部注解分开吗?以及我能做些什么来解决这个问题。谢谢!

xsuvu9jc

xsuvu9jc1#

如果我没有记错的话,@Immutable在Groovy 2.5.x中是一个单独的注解,但在Groovy 3.x中它被分解为组件,现在它只是一个基于@AnnotationCollector的元注解,正如您在GroovyDoc中看到的那样。

我不认为有什么需要修复的,您只需要更新您的逻辑以也接受新的组件注解,可能是@ImmutableBase@KnownImmutable

相关问题