diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties index 54dff68e55b..cf21120f517 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties @@ -136,6 +136,7 @@ doclet.Deprecated=Deprecated. doclet.Groupname_already_used=In -group option, groupname already used: {0} doclet.value_tag_invalid_reference={0} (referenced by @value tag) is an unknown reference. doclet.value_tag_invalid_constant=@value tag (which references {0}) can only be used in constants. +doclet.value_tag_invalid_use=@value tag cannot be used here. doclet.dest_dir_create=Creating destination directory: "{0}" doclet.in={0} in {1} doclet.Use_Table_Summary=Use table, listing {0}, and an explanation diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java index 4d7dd74da2c..b1d6f39b8b3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java @@ -105,7 +105,9 @@ public class ValueTaglet extends BaseInlineTaglet { } /** - * Given the name of the field, return the corresponding FieldDoc. + * Given the name of the field, return the corresponding FieldDoc. Return null + * due to invalid use of value tag if the name is null or empty string and if + * the value tag is not used on a field. * * @param config the current configuration of the doclet. * @param tag the value tag. @@ -114,10 +116,8 @@ public class ValueTaglet extends BaseInlineTaglet { * it is assumed that the field is in the current class. * * @return the corresponding FieldDoc. If the name is null or empty string, - * return field that the value tag was used in. - * - * @throws DocletAbortException if the value tag does not specify a name to - * a value field and it is not used within the comments of a valid field. + * return field that the value tag was used in. Return null if the name is null + * or empty string and if the value tag is not used on a field. */ private FieldDoc getFieldDoc(Configuration config, Tag tag, String name) { if (name == null || name.length() == 0) { @@ -125,8 +125,9 @@ public class ValueTaglet extends BaseInlineTaglet { if (tag.holder() instanceof FieldDoc) { return (FieldDoc) tag.holder(); } else { - //This should never ever happen. - throw new DocletAbortException("should not happen"); + // If the value tag does not specify a parameter which is a valid field and + // it is not used within the comments of a valid field, return null. + return null; } } StringTokenizer st = new StringTokenizer(name, "#"); @@ -165,9 +166,15 @@ public class ValueTaglet extends BaseInlineTaglet { FieldDoc field = getFieldDoc( writer.configuration(), tag, tag.text()); if (field == null) { - //Reference is unknown. - writer.getMsgRetriever().warning(tag.holder().position(), - "doclet.value_tag_invalid_reference", tag.text()); + if (tag.text().isEmpty()) { + //Invalid use of @value + writer.getMsgRetriever().warning(tag.holder().position(), + "doclet.value_tag_invalid_use"); + } else { + //Reference is unknown. + writer.getMsgRetriever().warning(tag.holder().position(), + "doclet.value_tag_invalid_reference", tag.text()); + } } else if (field.constantValue() != null) { return writer.valueTagOutput(field, field.constantValueExpression(), diff --git a/langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java b/langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java index ba0f291dc81..1d24a52798a 100644 --- a/langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java +++ b/langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java @@ -23,13 +23,12 @@ /* * @test - * @bug 4764045 + * @bug 4764045 8004825 * @summary This test ensures that the value tag works in all * use cases. The explainations for each test case are written below. * @author jamieh * @library ../lib/ - * @build JavadocTester - * @build TestValueTag + * @build JavadocTester TestValueTag * @run main TestValueTag */ @@ -41,11 +40,17 @@ public class TestValueTag extends JavadocTester { //Javadoc arguments. private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", BUG_ID, "-sourcepath", SRC_DIR, "-tag", "todo", "pkg1", "pkg2" }; + private static final String[] ARGS1 = + new String[] { + "-Xdoclint:none", + "-d", BUG_ID + "-1", "-sourcepath", SRC_DIR, "-tag", + "todo", "pkg1", "pkg2" + }; + //Input for string search tests. private static final String[][] TEST = { //Base case: using @value on a constant. @@ -91,16 +96,58 @@ public class TestValueTag extends JavadocTester { {BUG_ID + FS + "pkg1" + FS + "CustomTagUsage.html", "