src/share/classes/com/sun/tools/javac/comp/Annotate.java

changeset 1445
376d6c1b49e5
parent 1374
c002fdee76fd
child 1464
f72c9c5aeaef
equal deleted inserted replaced
1444:170e486632d9 1445:376d6c1b49e5
24 */ 24 */
25 25
26 package com.sun.tools.javac.comp; 26 package com.sun.tools.javac.comp;
27 27
28 import java.util.Map; 28 import java.util.Map;
29
30 import com.sun.tools.javac.util.*; 29 import com.sun.tools.javac.util.*;
31 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; 30 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
32 import com.sun.tools.javac.code.*; 31 import com.sun.tools.javac.code.*;
33 import com.sun.tools.javac.code.Symbol.*; 32 import com.sun.tools.javac.code.Symbol.*;
34 import com.sun.tools.javac.tree.*; 33 import com.sun.tools.javac.tree.*;
169 * for the container. 168 * for the container.
170 * 169 *
171 * @param repeatingAnnotations a List of repeating annotations 170 * @param repeatingAnnotations a List of repeating annotations
172 * @return a new Attribute.Compound that is the container for the repeatingAnnotations 171 * @return a new Attribute.Compound that is the container for the repeatingAnnotations
173 */ 172 */
174 public Attribute.Compound processRepeatedAnnotations(List<Attribute.Compound> repeatingAnnotations) { 173 public Attribute.Compound processRepeatedAnnotations(List<Attribute.Compound> repeatingAnnotations, Symbol sym) {
175 return Annotate.this.processRepeatedAnnotations(repeatingAnnotations, this); 174 return Annotate.this.processRepeatedAnnotations(repeatingAnnotations, this, sym);
176 } 175 }
177 176
178 /** 177 /**
179 * Queue the Annotator a on the repeating annotations queue of the 178 * Queue the Annotator a on the repeating annotations queue of the
180 * Annotate instance this context belongs to. 179 * Annotate instance this context belongs to.
337 /* Process repeated annotations. This method returns the 336 /* Process repeated annotations. This method returns the
338 * synthesized container annotation or null IFF all repeating 337 * synthesized container annotation or null IFF all repeating
339 * annotation are invalid. This method reports errors/warnings. 338 * annotation are invalid. This method reports errors/warnings.
340 */ 339 */
341 private Attribute.Compound processRepeatedAnnotations(List<Attribute.Compound> annotations, 340 private Attribute.Compound processRepeatedAnnotations(List<Attribute.Compound> annotations,
342 AnnotateRepeatedContext ctx) { 341 AnnotateRepeatedContext ctx,
342 Symbol on) {
343 Attribute.Compound firstOccurrence = annotations.head; 343 Attribute.Compound firstOccurrence = annotations.head;
344 List<Attribute> repeated = List.nil(); 344 List<Attribute> repeated = List.nil();
345 Type origAnnoType; 345 Type origAnnoType = null;
346 Type arrayOfOrigAnnoType = null; 346 Type arrayOfOrigAnnoType = null;
347 Type targetContainerType = null; 347 Type targetContainerType = null;
348 MethodSymbol containerValueSymbol = null; 348 MethodSymbol containerValueSymbol = null;
349 349
350 Assert.check(!annotations.isEmpty() && 350 Assert.check(!annotations.isEmpty() &&
388 Pair<MethodSymbol, Attribute> p = 388 Pair<MethodSymbol, Attribute> p =
389 new Pair<MethodSymbol, Attribute>(containerValueSymbol, 389 new Pair<MethodSymbol, Attribute>(containerValueSymbol,
390 new Attribute.Array(arrayOfOrigAnnoType, repeated)); 390 new Attribute.Array(arrayOfOrigAnnoType, repeated));
391 annoTree = m.Annotation(new Attribute.Compound(targetContainerType, 391 annoTree = m.Annotation(new Attribute.Compound(targetContainerType,
392 List.of(p))); 392 List.of(p)));
393
394 if (!chk.annotationApplicable(annoTree, on))
395 log.error(annoTree.pos(), "invalid.containedby.annotation.incompatible.target", targetContainerType, origAnnoType);
396
397 if (!chk.validateAnnotationDeferErrors(annoTree))
398 log.error(annoTree.pos(), "duplicate.annotation.invalid.repeated", origAnnoType);
399
393 Attribute.Compound c = enterAnnotation(annoTree, 400 Attribute.Compound c = enterAnnotation(annoTree,
394 targetContainerType, 401 targetContainerType,
395 ctx.env); 402 ctx.env);
396 return c; 403 return c;
397 } else { 404 } else {
408 415
409 // Fetch the ContainedBy annotation from the current 416 // Fetch the ContainedBy annotation from the current
410 // annotation's declaration, or null if it has none 417 // annotation's declaration, or null if it has none
411 Attribute.Compound ca = origAnnoDecl.attribute(syms.containedByType.tsym); 418 Attribute.Compound ca = origAnnoDecl.attribute(syms.containedByType.tsym);
412 if (ca == null) { // has no ContainedBy annotation 419 if (ca == null) { // has no ContainedBy annotation
413 log.error(pos, "duplicate.annotation.missing.container", origAnnoType); 420 log.error(pos, "duplicate.annotation.missing.container", origAnnoType, syms.containedByType);
414 return null; 421 return null;
415 } 422 }
416 423
417 return filterSame(extractContainingType(ca, pos, origAnnoDecl), 424 return filterSame(extractContainingType(ca, pos, origAnnoDecl),
418 origAnnoType); 425 origAnnoType);

mercurial