8025246: [doclint] doclint is showing error on anchor already defined when it's not
Reviewed-by: bpatel
--- a/langtools/src/share/classes/com/sun/tools/doclint/Checker.java Tue Sep 24 10:48:11 2013 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclint/Checker.java Tue Sep 24 10:51:28 2013 -0700
@@ -93,7 +93,7 @@
Set<Element> foundParams = new HashSet<>();
Set<TypeMirror> foundThrows = new HashSet<>();
- Map<JavaFileObject, Set<String>> foundAnchors = new HashMap<>();
+ Map<Element, Set<String>> foundAnchors = new HashMap<>();
boolean foundInheritDoc = false;
boolean foundReturn = false;
@@ -576,13 +576,30 @@
}
private boolean checkAnchor(String name) {
- JavaFileObject fo = env.currPath.getCompilationUnit().getSourceFile();
- Set<String> set = foundAnchors.get(fo);
+ Element e = getEnclosingPackageOrClass(env.currElement);
+ if (e == null)
+ return true;
+ Set<String> set = foundAnchors.get(e);
if (set == null)
- foundAnchors.put(fo, set = new HashSet<>());
+ foundAnchors.put(e, set = new HashSet<>());
return set.add(name);
}
+ private Element getEnclosingPackageOrClass(Element e) {
+ while (e != null) {
+ switch (e.getKind()) {
+ case CLASS:
+ case ENUM:
+ case INTERFACE:
+ case PACKAGE:
+ return e;
+ default:
+ e = e.getEnclosingElement();
+ }
+ }
+ return e;
+ }
+
// http://www.w3.org/TR/html401/types.html#type-name
private static final Pattern validName = Pattern.compile("[A-Za-z][A-Za-z0-9-_:.]*");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/anchorTests/p/Test.java Tue Sep 24 10:51:28 2013 -0700
@@ -0,0 +1,53 @@
+/* @test /nodynamiccopyright/
+ * @bug 8025246
+ * @summary doclint is showing error on anchor already defined when it's not
+ * @library ../..
+ * @build DocLintTester
+ * @run main DocLintTester -ref Test.out Test.java
+ * @compile/fail/ref=Test.javac.out -XDrawDiagnostics -Werror -Xdoclint:all Test.java
+ */
+
+package p;
+
+/**
+ * <a name="dupTest">dupTest</a>
+ * <a name="dupTest">dupTest again</a>
+ *
+ * <a name="dupTestField">dupTestField</a>
+ * <a name="dupTestMethod">dupTestMethod</a>
+
+ * <a name="okClass">okClass</a>
+ * <a name="okField">okField</a>
+ * <a name="okMethod">okMethod</a>
+ */
+public class Test {
+ /** <a name="dupTestField">dupTestField again</a> */
+ public int f;
+
+ /** <a name="dupTestMethod">dupTestMethod again</a> */
+ public void m() { }
+
+ /**
+ * <a name="dupNested">dupNested</a>
+ * <a name="dupNested">dupNested again</a>
+ * <a name="dupNestedField">dupNestedField</a>
+ * <a name="dupNestedMethod">dupNestedMethod</a>
+ *
+ * <a name="okClass">okClass again</a>
+ */
+ public class Nested {
+ /**
+ * <a name="dupNestedField">dupNestedField</a>
+ *
+ * <a name="okField">okField again</a>
+ */
+ public int f;
+
+ /**
+ * <a name="dupNestedMethod">dupNestedMethod</a>
+ *
+ * <a name="okMethod">okMethod again</a>
+ */
+ public void m() { }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/anchorTests/p/Test.javac.out Tue Sep 24 10:51:28 2013 -0700
@@ -0,0 +1,7 @@
+Test.java:14:7: compiler.err.proc.messager: anchor already defined: dupTest
+Test.java:24:12: compiler.err.proc.messager: anchor already defined: dupTestField
+Test.java:27:12: compiler.err.proc.messager: anchor already defined: dupTestMethod
+Test.java:32:11: compiler.err.proc.messager: anchor already defined: dupNested
+Test.java:40:15: compiler.err.proc.messager: anchor already defined: dupNestedField
+Test.java:47:15: compiler.err.proc.messager: anchor already defined: dupNestedMethod
+6 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/anchorTests/p/Test.out Tue Sep 24 10:51:28 2013 -0700
@@ -0,0 +1,19 @@
+Test.java:14: error: anchor already defined: dupTest
+ * <a name="dupTest">dupTest again</a>
+ ^
+Test.java:24: error: anchor already defined: dupTestField
+ /** <a name="dupTestField">dupTestField again</a> */
+ ^
+Test.java:27: error: anchor already defined: dupTestMethod
+ /** <a name="dupTestMethod">dupTestMethod again</a> */
+ ^
+Test.java:32: error: anchor already defined: dupNested
+ * <a name="dupNested">dupNested again</a>
+ ^
+Test.java:40: error: anchor already defined: dupNestedField
+ * <a name="dupNestedField">dupNestedField</a>
+ ^
+Test.java:47: error: anchor already defined: dupNestedMethod
+ * <a name="dupNestedMethod">dupNestedMethod</a>
+ ^
+6 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/anchorTests/p/package-info.java Tue Sep 24 10:51:28 2013 -0700
@@ -0,0 +1,15 @@
+/* @test /nodynamiccopyright/
+ * @bug 8025246
+ * @summary doclint is showing error on anchor already defined when it's not
+ * @library ../..
+ * @build DocLintTester
+ * @run main DocLintTester -ref package-info.out package-info.java
+ * @compile/fail/ref=package-info.javac.out -XDrawDiagnostics -Werror -Xdoclint:all package-info.java
+ */
+
+/**
+ * <a name=here>here</a>
+ * <a name=here>here again</a>
+ */
+package p;
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/anchorTests/p/package-info.javac.out Tue Sep 24 10:51:28 2013 -0700
@@ -0,0 +1,2 @@
+package-info.java:12:7: compiler.err.proc.messager: anchor already defined: here
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/anchorTests/p/package-info.out Tue Sep 24 10:51:28 2013 -0700
@@ -0,0 +1,4 @@
+package-info.java:12: error: anchor already defined: here
+ * <a name=here>here again</a>
+ ^
+1 error