# HG changeset patch # User bpatel # Date 1365904109 25200 # Node ID f10cffab99b4d26ebd15e9693c49aea262d09d89 # Parent 76537856a54e3f5b31a93d2d9674e23b4fdd58ab 8009686: Generated javadoc documentation should be able to display type annotation on an array Reviewed-by: jjg diff -r 76537856a54e -r f10cffab99b4 src/share/classes/com/sun/javadoc/ExecutableMemberDoc.java --- 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 @exception diff -r 76537856a54e -r f10cffab99b4 src/share/classes/com/sun/javadoc/Type.java --- 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 Type representing the element type or null. + * @since 1.8 + */ + Type getElementType(); } diff -r 76537856a54e -r f10cffab99b4 src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java --- 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; diff -r 76537856a54e -r f10cffab99b4 src/share/classes/com/sun/tools/doclets/formats/html/LinkOutputImpl.java --- 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(); } diff -r 76537856a54e -r f10cffab99b4 src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java --- 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) { diff -r 76537856a54e -r f10cffab99b4 src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java --- 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); } diff -r 76537856a54e -r f10cffab99b4 src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java --- 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(); } diff -r 76537856a54e -r f10cffab99b4 src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java --- 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 */ diff -r 76537856a54e -r f10cffab99b4 src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java --- 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 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. diff -r 76537856a54e -r f10cffab99b4 src/share/classes/com/sun/tools/javadoc/PrimitiveType.java --- 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. *

diff -r 76537856a54e -r f10cffab99b4 src/share/classes/com/sun/tools/javadoc/TypeMaker.java --- 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; diff -r 76537856a54e -r f10cffab99b4 test/com/sun/javadoc/testTypeAnnotations/TestTypeAnnotations.java --- 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 @ClassExtA ParameterizedClass<" + + "@ClassExtB java.lang.String>" + }, + */ + /* @ignore 8012173 {BUG_ID + FS + "typeannos" + FS + "MyClass.html", "implements @ClassExtB java.lang.CharSequence, " + - "ParameterizedInterface<java.lang.String>" + "@ClassExtA ParameterizedInterface<" + + "@ClassExtB java.lang.String>" }, + */ + /* @ignore 8012173 {BUG_ID + FS + "typeannos" + FS + "MyInterface.html", - "extends ParameterizedInterface<java." + - "lang.String>, @ClassExtB java.lang.CharSequence" + "extends @ClassExtA " + + "ParameterizedInterface<@ClassExtA java.lang.String>, " + + "@ClassExtB java.lang.CharSequence" }, + */ // 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 java.lang.String>" }, + /* @ignore 8012173 + {BUG_ID + FS + "typeannos" + FS + "ExtendsGeneric.html", + "

 class ExtendsGeneric<K extends " +
+            "@ClassParamA Unannotated<" +
+            "@ClassParamB java.lang.String>>"
+        },
+        */
         {BUG_ID + FS + "typeannos" + FS + "TwoBounds.html",
-            "class TwoBounds<K extends  class TwoBounds<K extends " +
-            "@ClassParamA java.lang.String,V extends @ClassParamB" +
+            "@ClassParamA java.lang.String,V extends @ClassParamB" +
             " java.lang.String>"
         },
         {BUG_ID + FS + "typeannos" + FS + "Complex1.html",
@@ -89,12 +118,86 @@
             " java.lang.Runnable>"
         },
 
+        // Test for type annotations on fields (Fields.java).
+        /* @ignore 8012173
+        {BUG_ID + FS + "typeannos" + FS + "DefaultScope.html",
+            "
Parameterized<@FldA java.lang.String," +
+            "@FldB java.lang.String> bothTypeArgs
" + }, + */ + {BUG_ID + FS + "typeannos" + FS + "DefaultScope.html", + "
@FldA java.lang.String @FldB [] " +
+            "array1Deep
" + }, + {BUG_ID + FS + "typeannos" + FS + "DefaultScope.html", + "
java.lang.String[] @FldB [] array2SecondOld
" + }, + {BUG_ID + FS + "typeannos" + FS + "DefaultScope.html", + "
@FldD java.lang.String @FldC @FldA" +
+            " [] @FldC @FldB [] array2Deep
" + }, + /* @ignore 8012173 + {BUG_ID + FS + "typeannos" + FS + "ModifiedScoped.html", + "
public final Parameterized<@FldA " +
+            "Parameterized<@FldA java.lang.String," +
+            "@FldB java.lang.String>,@FldB java.lang.String> " +
+            "nestedParameterized
" + }, + */ + {BUG_ID + FS + "typeannos" + FS + "ModifiedScoped.html", + "
public final @FldA java.lang.String[][] " +
+            "array2
" + }, + // Test for type annotations on method return types (MethodReturnType.java). {BUG_ID + FS + "typeannos" + FS + "MtdDefaultScope.html", "
public <T> @MRtnA java.lang.String" +
             " method()
" }, + {BUG_ID + FS + "typeannos" + FS + "MtdDefaultScope.html", + "
@MRtnA java.lang.String @MRtnA [] " +
+            "@MRtnB [] array2Deep()
" + }, + {BUG_ID + FS + "typeannos" + FS + "MtdDefaultScope.html", + "
@MRtnA java.lang.String[][] array2()
" + }, + /* @ignore 8012173 + {BUG_ID + FS + "typeannos" + FS + "MtdModifiedScoped.html", + "
public final MtdParameterized<@MRtnA " +
+            "MtdParameterized<@MRtnA java.lang." +
+            "String,@MRtnB java.lang.String>,@MRtnB java." +
+            "lang.String> nestedMtdParameterized()
" + }, + */ // 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 java.lang.String>" + " void methodExtends()
" }, + /* @ignore 8012173 + {BUG_ID + FS + "typeannos" + FS + "UnscopedUnmodified.html", + "
<K extends @MTyParamA " +
+            "MtdTyParameterized<@MTyParamB java.lang.String" +
+            ">> void nestedExtends()
" + }, + */ {BUG_ID + FS + "typeannos" + FS + "PublicModifiedMethods.html", "
public final <K extends @MTyParamA " +
             "java.lang.String> void methodExtends()
" }, + /* @ignore 8012173 + {BUG_ID + FS + "typeannos" + FS + "PublicModifiedMethods.html", + "
public final <K extends @MTyParamA " +
+            "java.lang.String,V extends @MTyParamA " +
+            "MtdTyParameterized<@MTyParamB java.lang.String" +
+            ">> void dual()
" + }, + */ + + // Test for type annotations on parameters (Parameters.java). + {BUG_ID + FS + "typeannos" + FS + "Parameters.html", + "
void unannotated(" +
+            "ParaParameterized<java.lang.String,java.lang.String>" +
+            " a)
" + }, + /* @ignore 8012173 + {BUG_ID + FS + "typeannos" + FS + "Parameters.html", + "
void nestedParaParameterized(" +
+            "ParaParameterized<@ParamA " +
+            "ParaParameterized<@ParamA java.lang.String," +
+            "@ParamB java.lang.String>,@ParamB" +
+            " java.lang.String> a)
" + }, + */ + {BUG_ID + FS + "typeannos" + FS + "Parameters.html", + "
void array2Deep(@ParamA java.lang.String " +
+            "@ParamA [] @ParamB [] a)
" + }, // Test for type annotations on throws (Throws.java). {BUG_ID + FS + "typeannos" + FS + "ThrDefaultUnmodified.html", @@ -148,6 +303,13 @@ "annotation in typeannos\">@ThrA java.lang.Exception" }, + // Test for type annotations on type parameters (TypeParameters.java). + {BUG_ID + FS + "typeannos" + FS + "TestMethods.html", + "
<K,V extends @TyParaA java.lang.String> " +
+            "void secondAnnotated()
" + }, + // Test for type annotations on wildcard type (Wildcards.java). {BUG_ID + FS + "typeannos" + FS + "BoundTest.html", "
void wcExtends(