Groovy 3 — выделенная аннотация ASTTransformation

Я хочу, чтобы моя пользовательская аннотация использовалась вместе с аннотацией 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. Эта тестовая компиляция не удалась, потому что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()]
]

Любая идея, почему я получаю неизменяемую аннотацию, отделенную от ее внутренних аннотаций? И что я могу сделать, чтобы решить проблему. Спасибо!

0 ответов

Другие вопросы по тегам