# 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 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.
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", + "" }, + /* @ignore 8012173 + {BUG_ID + FS + "typeannos" + FS + "UnscopedUnmodified.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()
<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(