提交 2d41274b 编写于 作者: B bpatel

8009686: Generated javadoc documentation should be able to display type annotation on an array

Reviewed-by: jjg
上级 479dd6d4
......@@ -95,15 +95,6 @@ public interface ExecutableMemberDoc extends MemberDoc {
*/
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.
*
......
......@@ -160,4 +160,13 @@ public interface Type {
* @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();
}
......@@ -157,9 +157,9 @@ public class LinkFactoryImpl extends LinkFactory {
if (!isFirst) {
linkInfo.displayLength += 1;
output.append(" ");
isFirst = false;
}
output.append(anno);
isFirst = false;
}
if (!annos.isEmpty()) {
linkInfo.displayLength += 1;
......
......@@ -60,6 +60,13 @@ public class LinkOutputImpl implements LinkOutput {
(String) o : ((LinkOutputImpl)o).toString());
}
/**
* {@inheritDoc}
*/
public void insert(int offset, Object o) {
output.insert(offset, o.toString());
}
/**
* {@inheritDoc}
*/
......
......@@ -61,7 +61,7 @@ public abstract class LinkFactory {
//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 @@ public abstract class LinkFactory {
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) {
......
......@@ -44,4 +44,12 @@ public interface LinkOutput {
* @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);
}
......@@ -61,6 +61,10 @@ abstract class AbstractTypeImpl implements com.sun.javadoc.Type {
return type.tsym.getQualifiedName().toString();
}
public com.sun.javadoc.Type getElementType() {
return null;
}
public String simpleTypeName() {
return type.tsym.name.toString();
}
......
......@@ -108,6 +108,10 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc {
this.tsym = sym;
}
public com.sun.javadoc.Type getElementType() {
return null;
}
/**
* Returns the flags in terms of javac's flags
*/
......
......@@ -210,24 +210,6 @@ public abstract class ExecutableMemberDocImpl
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.
......
......@@ -63,6 +63,10 @@ class PrimitiveType implements com.sun.javadoc.Type {
return name;
}
public com.sun.javadoc.Type getElementType() {
return null;
}
/**
* Return qualified name of type excluding any dimension information.
*<p>
......
......@@ -222,6 +222,10 @@ public class TypeMaker {
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;
......
......@@ -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 @@ public class TestTypeAnnotations extends JavadocTester {
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 @@ public class TestTypeAnnotations extends JavadocTester {
"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 @@ public class TestTypeAnnotations extends JavadocTester {
"</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 @@ public class TestTypeAnnotations extends JavadocTester {
"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 @@ public class TestTypeAnnotations extends JavadocTester {
"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\" " +
......
......@@ -40,7 +40,7 @@ class DefaultScope {
@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 @@ class Parameterized<K, V> { }
@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 { }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册