首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy 3- ASTTransformation注释隔离

Groovy 3- ASTTransformation注释隔离
EN

Stack Overflow用户
提问于 2022-09-25 15:10:07
回答 1查看 35关注 0票数 0

我希望我的自定义注释必须与不可变注释一起使用。我通过以下代码实现了这一目标-

注释类-

代码语言:javascript
复制
@Retention(RetentionPolicy.SOURCE)
@Target([ElementType.TYPE])
@GroovyASTTransformationClass(classes = TestFactoryTransform)
@interface TestFactory {
}

它的转化类-

代码语言:javascript
复制
@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 {
        ...
    }
}

我有个测试用例来验证-

代码语言:javascript
复制
@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时,我得到-

代码语言:javascript
复制
[
    org.codehaus.groovy.ast.AnnotationNode@16c0bc,
    org.codehaus.groovy.ast.AnnotationNode@16c0bc,
    org.codehaus.groovy.ast.AnnotationNode@16c0bc
]

但是用groovy 3,我得到了

代码语言:javascript
复制
[
    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()]
]

知道吗,为什么我要将不可变的注释与其内部注释隔离开来?以及我能做些什么来解决这个问题。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-25 17:49:58

如果我没有弄错的话,@Immutable是Groovy2.5.x中的一个单一注释,但是它是用Groovy3.x分解成的组件,现在它只是一个基于@AnnotationCollector的元注释,就像您在GroovyDoc中看到的那样。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73845575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档