8009686: Generated javadoc documentation should be able to display type annotation on an array
Reviewed-by: jjg
--- a/langtools/src/share/classes/com/sun/javadoc/ExecutableMemberDoc.java Sat Apr 13 12:25:44 2013 +0100
+++ b/langtools/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>@exception</code>
--- a/langtools/src/share/classes/com/sun/javadoc/Type.java Sat Apr 13 12:25:44 2013 +0100
+++ b/langtools/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/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java Sat Apr 13 12:25:44 2013 +0100
+++ b/langtools/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/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkOutputImpl.java Sat Apr 13 12:25:44 2013 +0100
+++ b/langtools/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/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java Sat Apr 13 12:25:44 2013 +0100
+++ b/langtools/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/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java Sat Apr 13 12:25:44 2013 +0100
+++ b/langtools/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/langtools/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java Sat Apr 13 12:25:44 2013 +0100
+++ b/langtools/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/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java Sat Apr 13 12:25:44 2013 +0100
+++ b/langtools/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/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java Sat Apr 13 12:25:44 2013 +0100
+++ b/langtools/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/langtools/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java Sat Apr 13 12:25:44 2013 +0100
+++ b/langtools/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/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java Sat Apr 13 12:25:44 2013 +0100
+++ b/langtools/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/langtools/test/com/sun/javadoc/testTypeAnnotations/TestTypeAnnotations.java Sat Apr 13 12:25:44 2013 +0100
+++ b/langtools/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><<a href=\"" +
+ "../typeannos/ClassExtB.html\" title=\"annotation in typeannos\">" +
+ "@ClassExtB</a> java.lang.String>"
+ },
+ */
+ /* @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><java.lang.String></pre>"
+ "<a href=\"../typeannos/ClassExtA.html\" title=\"annotation in " +
+ "typeannos\">@ClassExtA</a> <a href=\"../typeannos/ParameterizedInterface.html\" " +
+ "title=\"interface in typeannos\">ParameterizedInterface</a><" +
+ "<a href=\"../typeannos/ClassExtB.html\" title=\"annotation in " +
+ "typeannos\">@ClassExtB</a> java.lang.String></pre>"
},
+ */
+ /* @ignore 8012173
{BUG_ID + FS + "typeannos" + FS + "MyInterface.html",
- "extends <a href=\"../typeannos/ParameterizedInterface.html\" title" +
- "=\"interface in typeannos\">ParameterizedInterface</a><java." +
- "lang.String>, <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><<a href=\"../typeannos/ClassExtA.html\" " +
+ "title=\"annotation in typeannos\">@ClassExtA</a> java.lang.String>, " +
+ "<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></span>"
},
+ /* @ignore 8012173
+ {BUG_ID + FS + "typeannos" + FS + "ExtendsGeneric.html",
+ "<pre> class <span class=\"strong\">ExtendsGeneric<K extends " +
+ "<a href=\"../typeannos/ClassParamA.html\" title=\"annotation in " +
+ "typeannos\">@ClassParamA</a> <a href=\"../typeannos/Unannotated.html\" " +
+ "title=\"class in typeannos\">Unannotated</a><<a href=\"" +
+ "../typeannos/ClassParamB.html\" title=\"annotation in typeannos\">" +
+ "@ClassParamB</a> java.lang.String>></span>"
+ },
+ */
{BUG_ID + FS + "typeannos" + FS + "TwoBounds.html",
- "class <span class=\"strong\">TwoBounds<K extends <a href=\"" +
+ "<pre> class <span class=\"strong\">TwoBounds<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></span>"
},
{BUG_ID + FS + "typeannos" + FS + "Complex1.html",
@@ -89,12 +118,86 @@
"</a> java.lang.Runnable></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><<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> 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 <a href=\"../typeannos/Parameterized.html\" " +
+ "title=\"class in typeannos\">Parameterized</a><<a href=\"../" +
+ "typeannos/FldA.html\" title=\"annotation in typeannos\">@FldA</a> " +
+ "<a href=\"../typeannos/Parameterized.html\" title=\"class in " +
+ "typeannos\">Parameterized</a><<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>,<a href=\"../typeannos/FldB.html\" " +
+ "title=\"annotation in typeannos\">@FldB</a> java.lang.String> " +
+ "nestedParameterized</pre>"
+ },
+ */
+ {BUG_ID + FS + "typeannos" + FS + "ModifiedScoped.html",
+ "<pre>public final <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 <T> <a href=\"../typeannos/MRtnA.html\" " +
"title=\"annotation in typeannos\">@MRtnA</a> java.lang.String" +
" 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> [] array2Deep()</pre>"
+ },
+ {BUG_ID + FS + "typeannos" + FS + "MtdDefaultScope.html",
+ "<pre><a href=\"../typeannos/MRtnA.html\" title=\"annotation in " +
+ "typeannos\">@MRtnA</a> java.lang.String[][] array2()</pre>"
+ },
+ /* @ignore 8012173
+ {BUG_ID + FS + "typeannos" + FS + "MtdModifiedScoped.html",
+ "<pre>public final <a href=\"../typeannos/MtdParameterized.html\" " +
+ "title=\"class in typeannos\">MtdParameterized</a><<a href=\"../" +
+ "typeannos/MRtnA.html\" title=\"annotation in typeannos\">@MRtnA</a> " +
+ "<a href=\"../typeannos/MtdParameterized.html\" title=\"class in " +
+ "typeannos\">MtdParameterized</a><<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>,<a href=\"../typeannos/" +
+ "MRtnB.html\" title=\"annotation in typeannos\">@MRtnB</a> java." +
+ "lang.String> 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>" +
" void methodExtends()</pre>"
},
+ /* @ignore 8012173
+ {BUG_ID + FS + "typeannos" + FS + "UnscopedUnmodified.html",
+ "<pre><K extends <a href=\"../typeannos/MTyParamA.html\" title=\"" +
+ "annotation in typeannos\">@MTyParamA</a> <a href=\"../typeannos/" +
+ "MtdTyParameterized.html\" title=\"class in typeannos\">" +
+ "MtdTyParameterized</a><<a href=\"../typeannos/MTyParamB.html\" " +
+ "title=\"annotation in typeannos\">@MTyParamB</a> java.lang.String" +
+ ">> void nestedExtends()</pre>"
+ },
+ */
{BUG_ID + FS + "typeannos" + FS + "PublicModifiedMethods.html",
"<pre>public final <K extends <a href=\"../typeannos/" +
"MTyParamA.html\" title=\"annotation in typeannos\">@MTyParamA</a> " +
"java.lang.String> void methodExtends()</pre>"
},
+ /* @ignore 8012173
+ {BUG_ID + FS + "typeannos" + FS + "PublicModifiedMethods.html",
+ "<pre>public final <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><<a href=\"../typeannos/MTyParamB.html\" " +
+ "title=\"annotation in typeannos\">@MTyParamB</a> java.lang.String" +
+ ">> void dual()</pre>"
+ },
+ */
+
+ // Test for type annotations on parameters (Parameters.java).
+ {BUG_ID + FS + "typeannos" + FS + "Parameters.html",
+ "<pre>void unannotated(<a href=\"../typeannos/" +
+ "ParaParameterized.html\" title=\"class in typeannos\">" +
+ "ParaParameterized</a><java.lang.String,java.lang.String>" +
+ " a)</pre>"
+ },
+ /* @ignore 8012173
+ {BUG_ID + FS + "typeannos" + FS + "Parameters.html",
+ "<pre>void nestedParaParameterized(<a href=\"../typeannos/" +
+ "ParaParameterized.html\" title=\"class in typeannos\">" +
+ "ParaParameterized</a><<a href=\"../typeannos/ParamA.html\" " +
+ "title=\"annotation in typeannos\">@ParamA</a> <a href=\"../" +
+ "typeannos/ParaParameterized.html\" title=\"class in typeannos\">" +
+ "ParaParameterized</a><<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>,<a href=\"../" +
+ "typeannos/ParamB.html\" title=\"annotation in typeannos\">@ParamB" +
+ "</a> java.lang.String> a)</pre>"
+ },
+ */
+ {BUG_ID + FS + "typeannos" + FS + "Parameters.html",
+ "<pre>void 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> [] 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><K,V extends <a href=\"../typeannos/TyParaA.html\" title=\"" +
+ "annotation in typeannos\">@TyParaA</a> java.lang.String> " +
+ "void secondAnnotated()</pre>"
+ },
+
// Test for type annotations on wildcard type (Wildcards.java).
{BUG_ID + FS + "typeannos" + FS + "BoundTest.html",
"<pre>void wcExtends(<a href=\"../typeannos/MyList.html\" " +
--- a/langtools/test/com/sun/javadoc/testTypeAnnotations/typeannos/Fields.java Sat Apr 13 12:25:44 2013 +0100
+++ b/langtools/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 { }