Tue, 24 Sep 2013 10:51:28 -0700
8025246: [doclint] doclint is showing error on anchor already defined when it's not
Reviewed-by: bpatel
1.1 --- a/src/share/classes/com/sun/tools/doclint/Checker.java Tue Sep 24 10:48:11 2013 -0700 1.2 +++ b/src/share/classes/com/sun/tools/doclint/Checker.java Tue Sep 24 10:51:28 2013 -0700 1.3 @@ -93,7 +93,7 @@ 1.4 1.5 Set<Element> foundParams = new HashSet<>(); 1.6 Set<TypeMirror> foundThrows = new HashSet<>(); 1.7 - Map<JavaFileObject, Set<String>> foundAnchors = new HashMap<>(); 1.8 + Map<Element, Set<String>> foundAnchors = new HashMap<>(); 1.9 boolean foundInheritDoc = false; 1.10 boolean foundReturn = false; 1.11 1.12 @@ -576,13 +576,30 @@ 1.13 } 1.14 1.15 private boolean checkAnchor(String name) { 1.16 - JavaFileObject fo = env.currPath.getCompilationUnit().getSourceFile(); 1.17 - Set<String> set = foundAnchors.get(fo); 1.18 + Element e = getEnclosingPackageOrClass(env.currElement); 1.19 + if (e == null) 1.20 + return true; 1.21 + Set<String> set = foundAnchors.get(e); 1.22 if (set == null) 1.23 - foundAnchors.put(fo, set = new HashSet<>()); 1.24 + foundAnchors.put(e, set = new HashSet<>()); 1.25 return set.add(name); 1.26 } 1.27 1.28 + private Element getEnclosingPackageOrClass(Element e) { 1.29 + while (e != null) { 1.30 + switch (e.getKind()) { 1.31 + case CLASS: 1.32 + case ENUM: 1.33 + case INTERFACE: 1.34 + case PACKAGE: 1.35 + return e; 1.36 + default: 1.37 + e = e.getEnclosingElement(); 1.38 + } 1.39 + } 1.40 + return e; 1.41 + } 1.42 + 1.43 // http://www.w3.org/TR/html401/types.html#type-name 1.44 private static final Pattern validName = Pattern.compile("[A-Za-z][A-Za-z0-9-_:.]*"); 1.45
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/test/tools/doclint/anchorTests/p/Test.java Tue Sep 24 10:51:28 2013 -0700 2.3 @@ -0,0 +1,53 @@ 2.4 +/* @test /nodynamiccopyright/ 2.5 + * @bug 8025246 2.6 + * @summary doclint is showing error on anchor already defined when it's not 2.7 + * @library ../.. 2.8 + * @build DocLintTester 2.9 + * @run main DocLintTester -ref Test.out Test.java 2.10 + * @compile/fail/ref=Test.javac.out -XDrawDiagnostics -Werror -Xdoclint:all Test.java 2.11 + */ 2.12 + 2.13 +package p; 2.14 + 2.15 +/** 2.16 + * <a name="dupTest">dupTest</a> 2.17 + * <a name="dupTest">dupTest again</a> 2.18 + * 2.19 + * <a name="dupTestField">dupTestField</a> 2.20 + * <a name="dupTestMethod">dupTestMethod</a> 2.21 + 2.22 + * <a name="okClass">okClass</a> 2.23 + * <a name="okField">okField</a> 2.24 + * <a name="okMethod">okMethod</a> 2.25 + */ 2.26 +public class Test { 2.27 + /** <a name="dupTestField">dupTestField again</a> */ 2.28 + public int f; 2.29 + 2.30 + /** <a name="dupTestMethod">dupTestMethod again</a> */ 2.31 + public void m() { } 2.32 + 2.33 + /** 2.34 + * <a name="dupNested">dupNested</a> 2.35 + * <a name="dupNested">dupNested again</a> 2.36 + * <a name="dupNestedField">dupNestedField</a> 2.37 + * <a name="dupNestedMethod">dupNestedMethod</a> 2.38 + * 2.39 + * <a name="okClass">okClass again</a> 2.40 + */ 2.41 + public class Nested { 2.42 + /** 2.43 + * <a name="dupNestedField">dupNestedField</a> 2.44 + * 2.45 + * <a name="okField">okField again</a> 2.46 + */ 2.47 + public int f; 2.48 + 2.49 + /** 2.50 + * <a name="dupNestedMethod">dupNestedMethod</a> 2.51 + * 2.52 + * <a name="okMethod">okMethod again</a> 2.53 + */ 2.54 + public void m() { } 2.55 + } 2.56 +}
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/test/tools/doclint/anchorTests/p/Test.javac.out Tue Sep 24 10:51:28 2013 -0700 3.3 @@ -0,0 +1,7 @@ 3.4 +Test.java:14:7: compiler.err.proc.messager: anchor already defined: dupTest 3.5 +Test.java:24:12: compiler.err.proc.messager: anchor already defined: dupTestField 3.6 +Test.java:27:12: compiler.err.proc.messager: anchor already defined: dupTestMethod 3.7 +Test.java:32:11: compiler.err.proc.messager: anchor already defined: dupNested 3.8 +Test.java:40:15: compiler.err.proc.messager: anchor already defined: dupNestedField 3.9 +Test.java:47:15: compiler.err.proc.messager: anchor already defined: dupNestedMethod 3.10 +6 errors
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/test/tools/doclint/anchorTests/p/Test.out Tue Sep 24 10:51:28 2013 -0700 4.3 @@ -0,0 +1,19 @@ 4.4 +Test.java:14: error: anchor already defined: dupTest 4.5 + * <a name="dupTest">dupTest again</a> 4.6 + ^ 4.7 +Test.java:24: error: anchor already defined: dupTestField 4.8 + /** <a name="dupTestField">dupTestField again</a> */ 4.9 + ^ 4.10 +Test.java:27: error: anchor already defined: dupTestMethod 4.11 + /** <a name="dupTestMethod">dupTestMethod again</a> */ 4.12 + ^ 4.13 +Test.java:32: error: anchor already defined: dupNested 4.14 + * <a name="dupNested">dupNested again</a> 4.15 + ^ 4.16 +Test.java:40: error: anchor already defined: dupNestedField 4.17 + * <a name="dupNestedField">dupNestedField</a> 4.18 + ^ 4.19 +Test.java:47: error: anchor already defined: dupNestedMethod 4.20 + * <a name="dupNestedMethod">dupNestedMethod</a> 4.21 + ^ 4.22 +6 errors
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 5.2 +++ b/test/tools/doclint/anchorTests/p/package-info.java Tue Sep 24 10:51:28 2013 -0700 5.3 @@ -0,0 +1,15 @@ 5.4 +/* @test /nodynamiccopyright/ 5.5 + * @bug 8025246 5.6 + * @summary doclint is showing error on anchor already defined when it's not 5.7 + * @library ../.. 5.8 + * @build DocLintTester 5.9 + * @run main DocLintTester -ref package-info.out package-info.java 5.10 + * @compile/fail/ref=package-info.javac.out -XDrawDiagnostics -Werror -Xdoclint:all package-info.java 5.11 + */ 5.12 + 5.13 +/** 5.14 + * <a name=here>here</a> 5.15 + * <a name=here>here again</a> 5.16 + */ 5.17 +package p; 5.18 +
6.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 6.2 +++ b/test/tools/doclint/anchorTests/p/package-info.javac.out Tue Sep 24 10:51:28 2013 -0700 6.3 @@ -0,0 +1,2 @@ 6.4 +package-info.java:12:7: compiler.err.proc.messager: anchor already defined: here 6.5 +1 error
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 7.2 +++ b/test/tools/doclint/anchorTests/p/package-info.out Tue Sep 24 10:51:28 2013 -0700 7.3 @@ -0,0 +1,4 @@ 7.4 +package-info.java:12: error: anchor already defined: here 7.5 + * <a name=here>here again</a> 7.6 + ^ 7.7 +1 error