8074346: Type annotation on a qualified type causes spurious 'cannot find symbol' errors
authorsadayapalam
Tue, 16 Jun 2015 09:39:59 +0530
changeset 31212 edf65e25e066
parent 31119 d69c968463f0
child 31213 00956793a1c8
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
langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java
langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java
langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out
langtools/test/tools/javac/annotations/typeAnnotations/failures/T8074346.java
langtools/test/tools/javac/annotations/typeAnnotations/failures/T8074346.out
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java	Wed Jul 05 20:38:06 2017 +0200
+++ b/langtools/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/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java	Wed Jul 05 20:38:06 2017 +0200
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java	Wed Jul 05 20:38:06 2017 +0200
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out	Wed Jul 05 20:38:06 2017 +0200
+++ b/langtools/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/langtools/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/langtools/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