[ https://issues.apache.org/jira/browse/GROOVY-9096?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16826447#comment-16826447 ]
Eric Milles edited comment on GROOVY-9096 at 4/25/19 8:35 PM: -------------------------------------------------------------- Looks like this has to do with {{CLASS}} retention vs {{RUNTIME}} retention. This edit in {{ExtendedVerifier}} fixes the issue: {code:java} protected void visitAnnotations(AnnotatedNode node, int target) { ... Map<String, List<AnnotationNode>> runtimeAnnotations = new LinkedHashMap<String, List<AnnotationNode>>(); for (AnnotationNode unvisited : node.getAnnotations()) { AnnotationNode visited = visitAnnotation0(unvisited); String name = visited.getClassNode().getName(); // GRECLIPSE edit //if (visited.hasRuntimeRetention()) { if (!visited.hasSourceRetention()) { // GRECLIPSE end List<AnnotationNode> seen = runtimeAnnotations.get(name); if (seen == null) { seen = new ArrayList<AnnotationNode>(); } seen.add(visited); runtimeAnnotations.put(name, seen); } ... } checkForDuplicateAnnotations(node, runtimeAnnotations); } {code} Probably want to rename the {{runtimeAnnotations}} map as well. was (Author: emilles): Looks like this has to do with {{CLASS}} retention vs {{RUNTIME}} retention. This edit in {{ExtendedVerifier}} fixes the issue: {code:java} protected void visitAnnotations(AnnotatedNode node, int target) { ... Map<String, List<AnnotationNode>> runtimeAnnotations = new LinkedHashMap<String, List<AnnotationNode>>(); for (AnnotationNode unvisited : node.getAnnotations()) { AnnotationNode visited = visitAnnotation0(unvisited); String name = visited.getClassNode().getName(); // GRECLIPSE edit //if (visited.hasRuntimeRetention()) { if (!visited.hasSourceRetention()) { // GRECLIPSE end List<AnnotationNode> seen = runtimeAnnotations.get(name); if (seen == null) { seen = new ArrayList<AnnotationNode>(); } seen.add(visited); runtimeAnnotations.put(name, seen); } ... } checkForDuplicateAnnotations(node, runtimeAnnotations); } {code} > Repeatable annotation not wrapped with container type in class file > ------------------------------------------------------------------- > > Key: GROOVY-9096 > URL: https://issues.apache.org/jira/browse/GROOVY-9096 > Project: Groovy > Issue Type: Bug > Components: Compiler > Affects Versions: 2.5.6 > Reporter: Eric Milles > Priority: Major > > Consider the following: > Anno.java > {code:java} > import java.lang.annotation.*; > @Retention(RetentionPolicy.CLASS) > @Repeatable(Annos.class) > @interface Anno { > String value() default ""; > } > @interface Annos { > Anno[] value(); > } > {code} > Pogo.groovy > {code:groovy} > @Anno @Anno('x') > class Pogo {} > {code} > When this is compiled, the annotations in the class file are incorrect: > {code} > // Compiled from Pogo.groovy (version 1.8 : 52.0, super bit) > @a...@pack.anno(value="x") > public class Pogo implements groovy.lang.GroovyObject { > {code} > vs. > {code} > // Compiled from Pojo.java (version 1.8 : 52.0, super bit) > @Annos(value={@Anno,@Anno(value="x")}) > public class Pojo { > {code} > See GROOVY-8234 for initial support for {{@Repeatable}}. -- This message was sent by Atlassian JIRA (v7.6.3#76005)