当前位置: 首页 > 知识库问答 >
问题:

Groovy 3-分离的ASTTransformation注释

金成济
2023-03-14

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

注释类-

@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()]
]

任何想法,为什么我得到不可变的注释和它的内部注释分离?以及我能做什么来解决这个问题。谢谢大家!

共有1个答案

穆阳炎
2023-03-14

如果我没有弄错的话,在Groovy 2.5.x中,< code>@Immutable是一个单独的注释,但是在Groovy 3.x中,它被分解成多个组件,现在它只是一个基于< code > @ annotation collector 的元注释,正如您在GroovyDoc中看到的那样。

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

 类似资料:
  • 我是Java和Netbeans的新手,想写一个Swing项目来学习。 null [一些小代码示例会很可爱] 谢了。安东尼。

  • 本文向大家介绍将python代码和注释分离的方法,包括了将python代码和注释分离的方法的使用技巧和注意事项,需要的朋友参考一下 python的注释方式和C语言、C++、java有所不同 python语言中,使用‘#' 来进行注释,其次还有使用 三个引号来进行注释 本文的程序将把 python 中 使用‘#' 号 好 三个引号的注释分离出来, 当然也能再次合并回去 有需求的小伙伴可以来围观了 本

  • 我有Oracle的飞行路线脚本(100)列表。 当我将我的包发布到客户环境时,为我们的Spring Boot应用程序创建的用户只允许DML脚本执行,DDL只能由客户DBA团队执行。 现在需要分离DDL

  • 问题内容: 寻找匹配和替换的正则表达式序列(最好是PHP,但没关系)以更改此规则(开始和结束只是需要保留的随机文本)。 在: 到这个OUT: 谢谢。 问题答案: 您是否只是想删除评论?怎么样 或稍好一点(由发问者本人建议): 但是请记住,HTML 不是 正规的,因此当有人向其抛出奇怪的边缘情况时,使用正则表达式进行解析将使您陷入痛苦的世界。

  • 我在解析日期格式时出现异常? parseException:不可解析日期:“10-10-2016”

  • 从1.r.58开始, 内置读写分离支持 ioc js形式的配置 NutDaoRunner新增了slaveDataSource属性 dataSource : { // master数据源 }, slaveDataSource : { // slave数据源,负责读 }, dao : { type : "org.