Repository: groovy Updated Branches: refs/heads/master ea0418c72 -> e28949291
GROOVY-8898: Annotation value cannot take inline constant from enum. Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/e2894929 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/e2894929 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/e2894929 Branch: refs/heads/master Commit: e2894929126d76e0d939c080bb9c942543d1f270 Parents: ea0418c Author: Paul King <pa...@asert.com.au> Authored: Wed Dec 5 20:51:46 2018 +1000 Committer: Paul King <pa...@asert.com.au> Committed: Wed Dec 5 20:51:46 2018 +1000 ---------------------------------------------------------------------- .../groovy/ast/tools/ExpressionUtils.java | 7 +++-- src/test/gls/annotations/AnnotationTest.groovy | 33 ++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/e2894929/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java b/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java index 8fab0db..e1399ec 100644 --- a/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java +++ b/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java @@ -293,7 +293,7 @@ public class ExpressionUtils { } /** - * The attribute values of annotations must be primitive or String constants. + * The attribute values of annotations must be primitive, String or Enum constants. * In various places, such constants can be seen during type resolution but won't be * readily accessible in later phases, e.g. they might be embedded into constructor code. * This method transforms constants that would appear in annotations early so they aren't lost. @@ -309,8 +309,9 @@ public class ExpressionUtils { if (pe.getObjectExpression() instanceof ClassExpression) { ClassExpression ce = (ClassExpression) pe.getObjectExpression(); ClassNode type = ce.getType(); - if (type.isEnum()) return exp; - Expression constant = findConstant(ClassNodeUtils.getField(type, pe.getPropertyAsString())); + FieldNode field = ClassNodeUtils.getField(type, pe.getPropertyAsString()); + if (type.isEnum() && field != null && field.isEnum()) return exp; + Expression constant = findConstant(field); if (constant != null) return constant; } } else if (exp instanceof BinaryExpression) { http://git-wip-us.apache.org/repos/asf/groovy/blob/e2894929/src/test/gls/annotations/AnnotationTest.groovy ---------------------------------------------------------------------- diff --git a/src/test/gls/annotations/AnnotationTest.groovy b/src/test/gls/annotations/AnnotationTest.groovy index c79b290..c881274 100644 --- a/src/test/gls/annotations/AnnotationTest.groovy +++ b/src/test/gls/annotations/AnnotationTest.groovy @@ -847,6 +847,39 @@ class AnnotationTest extends CompilableTestSupport { ''' } + void testAnnotationAttributeConstantFromEnumConstantField() { + // GROOVY-8898 + assertScript ''' + import java.lang.annotation.* + + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.TYPE) + @interface MyAnnotation { + String[] groups() default [] + MyEnum alt() default MyEnum.ALT1 + } + + class Base { + static final String CONST = 'bar' + def groups() { getClass().annotations[0].groups() } + def alt() { getClass().annotations[0].alt() } + } + + enum MyEnum { + ALT1, ALT2; + public static final String CONST = 'baz' + } + + @MyAnnotation(groups = ['foo', Base.CONST, MyEnum.CONST], alt = MyEnum.ALT2) + class Child extends Base {} + + new Child().with { + assert groups() == ['foo', 'bar', 'baz'] + assert alt() == MyEnum.ALT2 + } + ''' + } + void testAnnotationWithRepeatableSupportedPrecompiledJava() { assertScript ''' import java.lang.annotation.*