Mercurial > hg > jdk9-shenandoah > langtools
changeset 2962:c6f2ffcc44b9
8074346: Type annotation on a qualified type causes spurious 'cannot find symbol' errors
Summary: Issue clear diagostic when package names in a qualified type name are illegally annotated
Reviewed-by: mcimadamore, jlahoda
author | sadayapalam |
---|---|
date | Tue, 16 Jun 2015 09:39:59 +0530 |
parents | 931ec7dd6cd9 |
children | 5032dfdc37be |
files | src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out test/tools/javac/annotations/typeAnnotations/failures/T8074346.java test/tools/javac/annotations/typeAnnotations/failures/T8074346.out |
diffstat | 6 files changed, 64 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Thu Jun 11 20:19:56 2015 -0700 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Tue Jun 16 09:39:59 2015 +0530 @@ -4140,7 +4140,12 @@ public void visitAnnotatedType(JCAnnotatedType tree) { attribAnnotationTypes(tree.annotations, env); - Type underlyingType = attribType(tree.underlyingType, env); + JCExpression underlyingTypeTree = tree.getUnderlyingType(); + Type underlyingType = attribTree(underlyingTypeTree, env, + new ResultInfo(KindSelector.TYP_PCK, Type.noType)); + if (!chk.checkAnnotableType(underlyingType, tree.annotations, underlyingTypeTree.pos())) { + underlyingType = underlyingTypeTree.type = syms.errType; + } Type annotatedType = underlyingType.annotatedType(Annotations.TO_BE_SET); if (!env.info.isNewClass) @@ -4631,16 +4636,7 @@ } } else if (enclTr.hasTag(ANNOTATED_TYPE)) { JCAnnotatedType at = (JCTree.JCAnnotatedType) enclTr; - if (enclTy == null || enclTy.hasTag(NONE)) { - if (at.getAnnotations().size() == 1) { - log.error(at.underlyingType.pos(), "cant.type.annotate.scoping.1", at.getAnnotations().head.attribute); - } else { - ListBuffer<Attribute.Compound> comps = new ListBuffer<>(); - for (JCAnnotation an : at.getAnnotations()) { - comps.add(an.attribute); - } - log.error(at.underlyingType.pos(), "cant.type.annotate.scoping", comps.toList()); - } + if (!chk.checkAnnotableType(enclTy, at.getAnnotations(), at.underlyingType.pos())) { repeat = false; } enclTr = at.underlyingType;
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Thu Jun 11 20:19:56 2015 -0700 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Tue Jun 16 09:39:59 2015 +0530 @@ -62,6 +62,8 @@ import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.code.TypeTag.WILDCARD; +import static com.sun.tools.javac.resources.CompilerProperties.Errors.CantTypeAnnotateScoping; +import static com.sun.tools.javac.resources.CompilerProperties.Errors.CantTypeAnnotateScoping1; import static com.sun.tools.javac.tree.JCTree.Tag.*; /** Type checking helper class for the attribution phase. @@ -2691,6 +2693,29 @@ * Check annotations **************************************************************************/ + /** Verify that a component of a qualified type name being type annotated + * can indeed be legally be annotated. For example, package names and type + * names used to access static members cannot be annotated. + * + * @param typeComponent the component of the qualified name being annotated + * @param annotations the annotations + * @param pos diagnostic position + * @return true if all is swell, false otherwise. + */ + boolean checkAnnotableType(Type typeComponent, List<JCAnnotation> annotations, DiagnosticPosition pos) { + if (typeComponent == null || typeComponent.hasTag(PACKAGE) || typeComponent.hasTag(NONE)) { + ListBuffer<Symbol> lb = new ListBuffer<>(); + for (JCAnnotation annotation : annotations) { + lb.append(annotation.annotationType.type.tsym); + } + List<Symbol> symbols = lb.toList(); + log.error(pos, + symbols.size() > 1 ? CantTypeAnnotateScoping(symbols) + : CantTypeAnnotateScoping1(symbols.get(0))); + return false; + } + return true; + } /** * Recursively validate annotations values */
--- a/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java Thu Jun 11 20:19:56 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java Tue Jun 16 09:39:59 2015 +0530 @@ -1,12 +1,12 @@ /* * @test /nodynamiccopyright/ - * @bug 8026564 + * @bug 8026564 8074346 * @summary The parts of a fully-qualified type can't be annotated. * @author Werner Dietl - * @ignore 8057679 clarify error messages trying to annotate scoping * @compile/fail/ref=CantAnnotatePackages.out -XDrawDiagnostics CantAnnotatePackages.java */ + import java.lang.annotation.*; import java.util.List; @@ -21,6 +21,8 @@ java. @TA lang.Object of3; List<java. @TA lang.Object> of4; + List<@CantAnnotatePackages_TB java.lang.Object> of5; // test that we do reasonable things for missing types. + // TODO: also note the order of error messages. }
--- a/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out Thu Jun 11 20:19:56 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out Tue Jun 16 09:39:59 2015 +0530 @@ -1,5 +1,7 @@ -CantAnnotatePackages.java:14:13: compiler.err.cant.type.annotate.scoping.1: @TA -CantAnnotatePackages.java:19:18: compiler.err.cant.type.annotate.scoping.1: @TA -CantAnnotatePackages.java:20:19: compiler.err.cant.type.annotate.scoping.1: @TA -CantAnnotatePackages.java:21:24: compiler.err.cant.type.annotate.scoping.1: @TA -4 errors +CantAnnotatePackages.java:20:14: compiler.err.cant.type.annotate.scoping.1: TA +CantAnnotatePackages.java:21:9: compiler.err.cant.type.annotate.scoping.1: TA +CantAnnotatePackages.java:22:14: compiler.err.cant.type.annotate.scoping.1: TA +CantAnnotatePackages.java:24:11: compiler.err.cant.resolve.location: kindname.class, CantAnnotatePackages_TB, , , (compiler.misc.location: kindname.class, CantAnnotatePackages, null) +CantAnnotatePackages.java:24:35: compiler.err.cant.type.annotate.scoping.1: CantAnnotatePackages_TB +CantAnnotatePackages.java:15:18: compiler.err.cant.type.annotate.scoping.1: @TA +6 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/annotations/typeAnnotations/failures/T8074346.java Tue Jun 16 09:39:59 2015 +0530 @@ -0,0 +1,18 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8074346 + * @author sadayapalam + * @summary Test that type annotation on a qualified type doesn't cause spurious 'cannot find symbol' errors + * @compile/fail/ref=T8074346.out -XDrawDiagnostics T8074346.java +*/ + +abstract class T8074346 implements + @T8074346_TA @T8074346_TB java.util.Map<@T8074346_TA java.lang.String, java.lang.@T8074346_TA String>, + java.util.@T8074346_TA List { +} + +@java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE_USE) +@interface T8074346_TA { } + +@java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE_USE) +@interface T8074346_TB { } \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/annotations/typeAnnotations/failures/T8074346.out Tue Jun 16 09:39:59 2015 +0530 @@ -0,0 +1,3 @@ +T8074346.java:10:35: compiler.err.cant.type.annotate.scoping: T8074346_TA,T8074346_TB +T8074346.java:10:62: compiler.err.cant.type.annotate.scoping.1: T8074346_TA +2 errors \ No newline at end of file