changeset 1830:f10cffab99b4

8009686: Generated javadoc documentation should be able to display type annotation on an array Reviewed-by: jjg
author bpatel
date Sat, 13 Apr 2013 18:48:29 -0700
parents 76537856a54e
children b26f36a7ae3b
files src/share/classes/com/sun/javadoc/ExecutableMemberDoc.java src/share/classes/com/sun/javadoc/Type.java src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java src/share/classes/com/sun/tools/doclets/formats/html/LinkOutputImpl.java src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java src/share/classes/com/sun/tools/javadoc/PrimitiveType.java src/share/classes/com/sun/tools/javadoc/TypeMaker.java test/com/sun/javadoc/testTypeAnnotations/TestTypeAnnotations.java test/com/sun/javadoc/testTypeAnnotations/typeannos/Fields.java
diffstat 13 files changed, 237 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/com/sun/javadoc/ExecutableMemberDoc.java	Sat Apr 13 12:25:44 2013 +0100
+++ b/src/share/classes/com/sun/javadoc/ExecutableMemberDoc.java	Sat Apr 13 18:48:29 2013 -0700
@@ -96,15 +96,6 @@
     Type receiverType();
 
     /**
-     * Get the receiver annotations of this executable element.
-     * Return an empty array if there are none.
-     *
-     * @return the receiver annotations of this executable element.
-     * @since 1.8
-     */
-    AnnotationDesc[] receiverAnnotations();
-
-    /**
      * Return the throws tags in this method.
      *
      * @return an array of ThrowTag containing all <code>&#64;exception</code>
--- a/src/share/classes/com/sun/javadoc/Type.java	Sat Apr 13 12:25:44 2013 +0100
+++ b/src/share/classes/com/sun/javadoc/Type.java	Sat Apr 13 18:48:29 2013 -0700
@@ -160,4 +160,13 @@
      * @since 1.5
      */
     AnnotationTypeDoc asAnnotationTypeDoc();
+
+    /**
+     * If this type is an array type, return the element type of the
+     * array. Otherwise, return null.
+     *
+     * @return a <code>Type</code> representing the element type or null.
+     * @since 1.8
+     */
+    Type getElementType();
 }
--- a/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java	Sat Apr 13 12:25:44 2013 +0100
+++ b/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java	Sat Apr 13 18:48:29 2013 -0700
@@ -157,9 +157,9 @@
             if (!isFirst) {
                 linkInfo.displayLength += 1;
                 output.append(" ");
-                isFirst = false;
             }
             output.append(anno);
+            isFirst = false;
         }
         if (!annos.isEmpty()) {
             linkInfo.displayLength += 1;
--- a/src/share/classes/com/sun/tools/doclets/formats/html/LinkOutputImpl.java	Sat Apr 13 12:25:44 2013 +0100
+++ b/src/share/classes/com/sun/tools/doclets/formats/html/LinkOutputImpl.java	Sat Apr 13 18:48:29 2013 -0700
@@ -63,6 +63,13 @@
     /**
      * {@inheritDoc}
      */
+    public void insert(int offset, Object o) {
+        output.insert(offset, o.toString());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
     public String toString() {
         return output.toString();
     }
--- a/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java	Sat Apr 13 12:25:44 2013 +0100
+++ b/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java	Sat Apr 13 18:48:29 2013 -0700
@@ -61,7 +61,7 @@
                 //Just a primitive.
                 linkInfo.displayLength += type.typeName().length();
                 linkOutput.append(type.typeName());
-            } else if (type.asAnnotatedType() != null) {
+            } else if (type.asAnnotatedType() != null && type.dimension().length() == 0) {
                 linkOutput.append(getTypeAnnotationLinks(linkInfo));
                 linkInfo.type = type.asAnnotatedType().underlyingType();
                 linkOutput.append(getLinkOutput(linkInfo));
@@ -141,8 +141,21 @@
                 linkInfo.displayLength += 3;
                 linkOutput.append("...");
             } else {
-                linkInfo.displayLength += type.dimension().length();
-                linkOutput.append(type.dimension());
+                while (type != null && type.dimension().length() > 0) {
+                    linkInfo.displayLength += type.dimension().length();
+                    if (type.asAnnotatedType() != null) {
+                        linkInfo.type = type;
+                        linkOutput.append(" ");
+                        linkOutput.append(getTypeAnnotationLinks(linkInfo));
+                        linkOutput.append("[]");
+                        type = type.asAnnotatedType().underlyingType().getElementType();
+                    } else {
+                        linkOutput.append("[]");
+                        type = type.getElementType();
+                    }
+                }
+                linkInfo.type = type;
+                linkOutput.insert(0, getTypeAnnotationLinks(linkInfo));
             }
             return linkOutput;
         } else if (linkInfo.classDoc != null) {
--- a/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java	Sat Apr 13 12:25:44 2013 +0100
+++ b/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java	Sat Apr 13 18:48:29 2013 -0700
@@ -44,4 +44,12 @@
      * @param o the object to append.
      */
     public void append(Object o);
+
+    /**
+     * Insert the given object into the output sequence.
+     *
+     * @param offset the offset.
+     * @param o the object to be inserted.
+     */
+    public void insert(int offset, Object o);
 }
--- a/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java	Sat Apr 13 12:25:44 2013 +0100
+++ b/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java	Sat Apr 13 18:48:29 2013 -0700
@@ -61,6 +61,10 @@
         return type.tsym.getQualifiedName().toString();
     }
 
+    public com.sun.javadoc.Type getElementType() {
+        return null;
+    }
+
     public String simpleTypeName() {
         return type.tsym.name.toString();
     }
--- a/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java	Sat Apr 13 12:25:44 2013 +0100
+++ b/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java	Sat Apr 13 18:48:29 2013 -0700
@@ -108,6 +108,10 @@
         this.tsym = sym;
     }
 
+    public com.sun.javadoc.Type getElementType() {
+        return null;
+    }
+
     /**
      * Returns the flags in terms of javac's flags
      */
--- a/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java	Sat Apr 13 12:25:44 2013 +0100
+++ b/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java	Sat Apr 13 18:48:29 2013 -0700
@@ -210,24 +210,6 @@
         return (recvtype != null) ? TypeMaker.getType(env, recvtype, false, true) : null;
     }
 
-    public AnnotationDesc[] receiverAnnotations() {
-        // TODO: change how receiver annotations are output!
-        Type recvtype = sym.type.asMethodType().recvtype;
-        if (recvtype == null) {
-            return new AnnotationDesc[0];
-        }
-        if (!recvtype.isAnnotated()) {
-            return new AnnotationDesc[0];
-        }
-        List<? extends Compound> typeAnnos = ((com.sun.tools.javac.code.Type.AnnotatedType)recvtype).typeAnnotations;
-        AnnotationDesc result[] = new AnnotationDesc[typeAnnos.length()];
-        int i = 0;
-        for (Attribute.Compound a : typeAnnos) {
-            result[i++] = new AnnotationDescImpl(env, a);
-        }
-        return result;
-    }
-
     /**
      * Return the formal type parameters of this method or constructor.
      * Return an empty array if there are none.
--- a/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java	Sat Apr 13 12:25:44 2013 +0100
+++ b/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java	Sat Apr 13 18:48:29 2013 -0700
@@ -63,6 +63,10 @@
         return name;
     }
 
+    public com.sun.javadoc.Type getElementType() {
+        return null;
+    }
+
     /**
      * Return qualified name of type excluding any dimension information.
      *<p>
--- a/src/share/classes/com/sun/tools/javadoc/TypeMaker.java	Sat Apr 13 12:25:44 2013 +0100
+++ b/src/share/classes/com/sun/tools/javadoc/TypeMaker.java	Sat Apr 13 18:48:29 2013 -0700
@@ -222,6 +222,10 @@
 
         private com.sun.javadoc.Type skipArraysCache = null;
 
+        public com.sun.javadoc.Type getElementType() {
+            return TypeMaker.getType(env, env.types.elemtype(arrayType));
+        }
+
         private com.sun.javadoc.Type skipArrays() {
             if (skipArraysCache == null) {
                 Type t;
--- a/test/com/sun/javadoc/testTypeAnnotations/TestTypeAnnotations.java	Sat Apr 13 12:25:44 2013 +0100
+++ b/test/com/sun/javadoc/testTypeAnnotations/TestTypeAnnotations.java	Sat Apr 13 18:48:29 2013 -0700
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug      8005091
+ * @bug      8005091 8009686
  * @summary  Make sure that type annotations are displayed correctly
  * @author   Bhavesh Patel
  * @library  ../lib/
@@ -34,7 +34,7 @@
 public class TestTypeAnnotations extends JavadocTester {
 
     //Test information.
-    private static final String BUG_ID = "8005091";
+    private static final String BUG_ID = "8005091-8009686";
 
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
@@ -45,18 +45,37 @@
     private static final String[][] NEGATED_TEST = NO_TEST;
     private static final String[][] TEST = {
         // Test for type annotations on Class Extends (ClassExtends.java).
+        /* @ignore 8012173
+        {BUG_ID + FS + "typeannos" + FS + "MyClass.html",
+            "extends <a href=\"../typeannos/ClassExtA.html\" title=\"annotation " +
+            "in typeannos\">@ClassExtA</a> <a href=\"../typeannos/ParameterizedClass.html\" " +
+            "title=\"class in typeannos\">ParameterizedClass</a>&lt;<a href=\"" +
+            "../typeannos/ClassExtB.html\" title=\"annotation in typeannos\">" +
+            "@ClassExtB</a> java.lang.String&gt;"
+        },
+        */
+        /* @ignore 8012173
         {BUG_ID + FS + "typeannos" + FS + "MyClass.html",
             "implements <a href=\"../typeannos/ClassExtB.html\" title=\"" +
             "annotation in typeannos\">@ClassExtB</a> java.lang.CharSequence, " +
-            "<a href=\"../typeannos/ParameterizedInterface.html\" title=\"" +
-            "interface in typeannos\">ParameterizedInterface</a>&lt;java.lang.String&gt;</pre>"
+            "<a href=\"../typeannos/ClassExtA.html\" title=\"annotation in " +
+            "typeannos\">@ClassExtA</a> <a href=\"../typeannos/ParameterizedInterface.html\" " +
+            "title=\"interface in typeannos\">ParameterizedInterface</a>&lt;" +
+            "<a href=\"../typeannos/ClassExtB.html\" title=\"annotation in " +
+            "typeannos\">@ClassExtB</a> java.lang.String&gt;</pre>"
         },
+        */
+        /* @ignore 8012173
         {BUG_ID + FS + "typeannos" + FS + "MyInterface.html",
-            "extends <a href=\"../typeannos/ParameterizedInterface.html\" title" +
-            "=\"interface in typeannos\">ParameterizedInterface</a>&lt;java." +
-            "lang.String&gt;, <a href=\"../typeannos/ClassExtB.html\" title=\"" +
-            "annotation in typeannos\">@ClassExtB</a> java.lang.CharSequence</pre>"
+            "extends <a href=\"../typeannos/ClassExtA.html\" title=\"annotation " +
+            "in typeannos\">@ClassExtA</a> <a href=\"../typeannos/" +
+            "ParameterizedInterface.html\" title=\"interface in typeannos\">" +
+            "ParameterizedInterface</a>&lt;<a href=\"../typeannos/ClassExtA.html\" " +
+            "title=\"annotation in typeannos\">@ClassExtA</a> java.lang.String&gt;, " +
+            "<a href=\"../typeannos/ClassExtB.html\" title=\"annotation in " +
+            "typeannos\">@ClassExtB</a> java.lang.CharSequence</pre>"
         },
+        */
 
         // Test for type annotations on Class Parameters (ClassParameters.java).
         {BUG_ID + FS + "typeannos" + FS + "ExtendsBound.html",
@@ -64,11 +83,21 @@
             "href=\"../typeannos/ClassParamA.html\" title=\"annotation in " +
             "typeannos\">@ClassParamA</a> java.lang.String&gt;</span>"
         },
+        /* @ignore 8012173
+        {BUG_ID + FS + "typeannos" + FS + "ExtendsGeneric.html",
+            "<pre> class <span class=\"strong\">ExtendsGeneric&lt;K extends " +
+            "<a href=\"../typeannos/ClassParamA.html\" title=\"annotation in " +
+            "typeannos\">@ClassParamA</a> <a href=\"../typeannos/Unannotated.html\" " +
+            "title=\"class in typeannos\">Unannotated</a>&lt;<a href=\"" +
+            "../typeannos/ClassParamB.html\" title=\"annotation in typeannos\">" +
+            "@ClassParamB</a> java.lang.String&gt;&gt;</span>"
+        },
+        */
         {BUG_ID + FS + "typeannos" + FS + "TwoBounds.html",
-            "class <span class=\"strong\">TwoBounds&lt;K extends <a href=\"" +
+            "<pre> class <span class=\"strong\">TwoBounds&lt;K extends <a href=\"" +
             "../typeannos/ClassParamA.html\" title=\"annotation in typeannos\">" +
-            "@ClassParamA</a> java.lang.String,V extends <a href=\"../typeannos" +
-            "/ClassParamB.html\" title=\"annotation in typeannos\">@ClassParamB" +
+            "@ClassParamA</a> java.lang.String,V extends <a href=\"../typeannos/" +
+            "ClassParamB.html\" title=\"annotation in typeannos\">@ClassParamB" +
             "</a> java.lang.String&gt;</span>"
         },
         {BUG_ID + FS + "typeannos" + FS + "Complex1.html",
@@ -89,12 +118,86 @@
             "</a> java.lang.Runnable&gt;</span>"
         },
 
+        // Test for type annotations on fields (Fields.java).
+        /* @ignore 8012173
+        {BUG_ID + FS + "typeannos" + FS + "DefaultScope.html",
+            "<pre><a href=\"../typeannos/Parameterized.html\" title=\"class in " +
+            "typeannos\">Parameterized</a>&lt;<a href=\"../typeannos/FldA.html\" " +
+            "title=\"annotation in typeannos\">@FldA</a> java.lang.String,<a " +
+            "href=\"../typeannos/FldB.html\" title=\"annotation in typeannos\">" +
+            "@FldB</a> java.lang.String&gt; bothTypeArgs</pre>"
+        },
+        */
+        {BUG_ID + FS + "typeannos" + FS + "DefaultScope.html",
+            "<pre><a href=\"../typeannos/FldA.html\" title=\"annotation in " +
+            "typeannos\">@FldA</a> java.lang.String <a href=\"../typeannos/" +
+            "FldB.html\" title=\"annotation in typeannos\">@FldB</a> [] " +
+            "array1Deep</pre>"
+        },
+        {BUG_ID + FS + "typeannos" + FS + "DefaultScope.html",
+            "<pre>java.lang.String[] <a href=\"../typeannos/FldB.html\" " +
+            "title=\"annotation in typeannos\">@FldB</a> [] array2SecondOld</pre>"
+        },
+        {BUG_ID + FS + "typeannos" + FS + "DefaultScope.html",
+            "<pre><a href=\"../typeannos/FldD.html\" title=\"annotation in " +
+            "typeannos\">@FldD</a> java.lang.String <a href=\"../typeannos/" +
+            "FldC.html\" title=\"annotation in typeannos\">@FldC</a> <a href=\"" +
+            "../typeannos/FldA.html\" title=\"annotation in typeannos\">@FldA" +
+            "</a> [] <a href=\"../typeannos/FldC.html\" title=\"annotation in " +
+            "typeannos\">@FldC</a> <a href=\"../typeannos/FldB.html\" title=\"" +
+            "annotation in typeannos\">@FldB</a> [] array2Deep</pre>"
+        },
+        /* @ignore 8012173
+        {BUG_ID + FS + "typeannos" + FS + "ModifiedScoped.html",
+            "<pre>public final&nbsp;<a href=\"../typeannos/Parameterized.html\" " +
+            "title=\"class in typeannos\">Parameterized</a>&lt;<a href=\"../" +
+            "typeannos/FldA.html\" title=\"annotation in typeannos\">@FldA</a> " +
+            "<a href=\"../typeannos/Parameterized.html\" title=\"class in " +
+            "typeannos\">Parameterized</a>&lt;<a href=\"../typeannos/FldA.html\" " +
+            "title=\"annotation in typeannos\">@FldA</a> java.lang.String,<a " +
+            "href=\"../typeannos/FldB.html\" title=\"annotation in typeannos\">" +
+            "@FldB</a> java.lang.String&gt;,<a href=\"../typeannos/FldB.html\" " +
+            "title=\"annotation in typeannos\">@FldB</a> java.lang.String&gt; " +
+            "nestedParameterized</pre>"
+        },
+        */
+        {BUG_ID + FS + "typeannos" + FS + "ModifiedScoped.html",
+            "<pre>public final&nbsp;<a href=\"../typeannos/FldA.html\" " +
+            "title=\"annotation in typeannos\">@FldA</a> java.lang.String[][] " +
+            "array2</pre>"
+        },
+
         // Test for type annotations on method return types (MethodReturnType.java).
         {BUG_ID + FS + "typeannos" + FS + "MtdDefaultScope.html",
             "<pre>public&nbsp;&lt;T&gt;&nbsp;<a href=\"../typeannos/MRtnA.html\" " +
             "title=\"annotation in typeannos\">@MRtnA</a> java.lang.String" +
             "&nbsp;method()</pre>"
         },
+        {BUG_ID + FS + "typeannos" + FS + "MtdDefaultScope.html",
+            "<pre><a href=\"../typeannos/MRtnA.html\" title=\"annotation in " +
+            "typeannos\">@MRtnA</a> java.lang.String <a href=\"../typeannos/" +
+            "MRtnA.html\" title=\"annotation in typeannos\">@MRtnA</a> [] <a " +
+            "href=\"../typeannos/MRtnB.html\" title=\"annotation in typeannos\">" +
+            "@MRtnB</a> []&nbsp;array2Deep()</pre>"
+        },
+        {BUG_ID + FS + "typeannos" + FS + "MtdDefaultScope.html",
+            "<pre><a href=\"../typeannos/MRtnA.html\" title=\"annotation in " +
+            "typeannos\">@MRtnA</a> java.lang.String[][]&nbsp;array2()</pre>"
+        },
+        /* @ignore 8012173
+        {BUG_ID + FS + "typeannos" + FS + "MtdModifiedScoped.html",
+            "<pre>public final&nbsp;<a href=\"../typeannos/MtdParameterized.html\" " +
+            "title=\"class in typeannos\">MtdParameterized</a>&lt;<a href=\"../" +
+            "typeannos/MRtnA.html\" title=\"annotation in typeannos\">@MRtnA</a> " +
+            "<a href=\"../typeannos/MtdParameterized.html\" title=\"class in " +
+            "typeannos\">MtdParameterized</a>&lt;<a href=\"../typeannos/MRtnA." +
+            "html\" title=\"annotation in typeannos\">@MRtnA</a> java.lang." +
+            "String,<a href=\"../typeannos/MRtnB.html\" title=\"annotation in " +
+            "typeannos\">@MRtnB</a> java.lang.String&gt;,<a href=\"../typeannos/" +
+            "MRtnB.html\" title=\"annotation in typeannos\">@MRtnB</a> java." +
+            "lang.String&gt;&nbsp;nestedMtdParameterized()</pre>"
+        },
+        */
 
         // Test for type annotations on method type parameters (MethodTypeParameters.java).
         {BUG_ID + FS + "typeannos" + FS + "UnscopedUnmodified.html",
@@ -102,11 +205,63 @@
             "annotation in typeannos\">@MTyParamA</a> java.lang.String&gt;" +
             "&nbsp;void&nbsp;methodExtends()</pre>"
         },
+        /* @ignore 8012173
+        {BUG_ID + FS + "typeannos" + FS + "UnscopedUnmodified.html",
+            "<pre>&lt;K extends <a href=\"../typeannos/MTyParamA.html\" title=\"" +
+            "annotation in typeannos\">@MTyParamA</a> <a href=\"../typeannos/" +
+            "MtdTyParameterized.html\" title=\"class in typeannos\">" +
+            "MtdTyParameterized</a>&lt;<a href=\"../typeannos/MTyParamB.html\" " +
+            "title=\"annotation in typeannos\">@MTyParamB</a> java.lang.String" +
+            "&gt;&gt;&nbsp;void&nbsp;nestedExtends()</pre>"
+        },
+        */
         {BUG_ID + FS + "typeannos" + FS + "PublicModifiedMethods.html",
             "<pre>public final&nbsp;&lt;K extends <a href=\"../typeannos/" +
             "MTyParamA.html\" title=\"annotation in typeannos\">@MTyParamA</a> " +
             "java.lang.String&gt;&nbsp;void&nbsp;methodExtends()</pre>"
         },
+        /* @ignore 8012173
+        {BUG_ID + FS + "typeannos" + FS + "PublicModifiedMethods.html",
+            "<pre>public final&nbsp;&lt;K extends <a href=\"../typeannos/" +
+            "MTyParamA.html\" title=\"annotation in typeannos\">@MTyParamA</a> " +
+            "java.lang.String,V extends <a href=\"../typeannos/MTyParamA.html\" " +
+            "title=\"annotation in typeannos\">@MTyParamA</a> <a href=\"../" +
+            "typeannos/MtdTyParameterized.html\" title=\"class in typeannos\">" +
+            "MtdTyParameterized</a>&lt;<a href=\"../typeannos/MTyParamB.html\" " +
+            "title=\"annotation in typeannos\">@MTyParamB</a> java.lang.String" +
+            "&gt;&gt;&nbsp;void&nbsp;dual()</pre>"
+        },
+        */
+
+        // Test for type annotations on parameters (Parameters.java).
+        {BUG_ID + FS + "typeannos" + FS + "Parameters.html",
+            "<pre>void&nbsp;unannotated(<a href=\"../typeannos/" +
+            "ParaParameterized.html\" title=\"class in typeannos\">" +
+            "ParaParameterized</a>&lt;java.lang.String,java.lang.String&gt;" +
+            "&nbsp;a)</pre>"
+        },
+        /* @ignore 8012173
+        {BUG_ID + FS + "typeannos" + FS + "Parameters.html",
+            "<pre>void&nbsp;nestedParaParameterized(<a href=\"../typeannos/" +
+            "ParaParameterized.html\" title=\"class in typeannos\">" +
+            "ParaParameterized</a>&lt;<a href=\"../typeannos/ParamA.html\" " +
+            "title=\"annotation in typeannos\">@ParamA</a> <a href=\"../" +
+            "typeannos/ParaParameterized.html\" title=\"class in typeannos\">" +
+            "ParaParameterized</a>&lt;<a href=\"../typeannos/ParamA.html\" " +
+            "title=\"annotation in typeannos\">@ParamA</a> java.lang.String," +
+            "<a href=\"../typeannos/ParamB.html\" title=\"annotation in " +
+            "typeannos\">@ParamB</a> java.lang.String&gt;,<a href=\"../" +
+            "typeannos/ParamB.html\" title=\"annotation in typeannos\">@ParamB" +
+            "</a> java.lang.String&gt;&nbsp;a)</pre>"
+        },
+        */
+        {BUG_ID + FS + "typeannos" + FS + "Parameters.html",
+            "<pre>void&nbsp;array2Deep(<a href=\"../typeannos/ParamA.html\" " +
+            "title=\"annotation in typeannos\">@ParamA</a> java.lang.String " +
+            "<a href=\"../typeannos/ParamA.html\" title=\"annotation in " +
+            "typeannos\">@ParamA</a> [] <a href=\"../typeannos/ParamB.html\" " +
+            "title=\"annotation in typeannos\">@ParamB</a> []&nbsp;a)</pre>"
+        },
 
         // Test for type annotations on throws (Throws.java).
         {BUG_ID + FS + "typeannos" + FS + "ThrDefaultUnmodified.html",
@@ -148,6 +303,13 @@
             "annotation in typeannos\">@ThrA</a> java.lang.Exception</pre>"
         },
 
+        // Test for type annotations on type parameters (TypeParameters.java).
+        {BUG_ID + FS + "typeannos" + FS + "TestMethods.html",
+            "<pre>&lt;K,V extends <a href=\"../typeannos/TyParaA.html\" title=\"" +
+            "annotation in typeannos\">@TyParaA</a> java.lang.String&gt;&nbsp;" +
+            "void&nbsp;secondAnnotated()</pre>"
+        },
+
         // Test for type annotations on wildcard type (Wildcards.java).
         {BUG_ID + FS + "typeannos" + FS + "BoundTest.html",
             "<pre>void&nbsp;wcExtends(<a href=\"../typeannos/MyList.html\" " +
--- a/test/com/sun/javadoc/testTypeAnnotations/typeannos/Fields.java	Sat Apr 13 12:25:44 2013 +0100
+++ b/test/com/sun/javadoc/testTypeAnnotations/typeannos/Fields.java	Sat Apr 13 18:48:29 2013 -0700
@@ -40,7 +40,7 @@
     @FldA String [] array1;
     @FldA String @FldB [] array1Deep;
     @FldA String [] [] array2;
-    @FldA String @FldA [] @FldB [] array2Deep;
+    @FldD String @FldC @FldA [] @FldC @FldB [] array2Deep;
     String @FldA [] [] array2First;
     String [] @FldB [] array2Second;
 
@@ -74,3 +74,9 @@
 @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
 @Documented
 @interface FldB { }
+@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
+@Documented
+@interface FldC { }
+@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
+@Documented
+@interface FldD { }