# HG changeset patch # User jjg # Date 1374113523 25200 # Node ID 7766f69bffc7ad7885175705ab99c4cfb4e74c38 # Parent 3c2e9a2bbed6ab09dca91f8f594cdd16efbddd9f 8020313: doclint doesn't reset HTML anchors correctly Reviewed-by: mcimadamore diff -r 3c2e9a2bbed6 -r 7766f69bffc7 langtools/src/share/classes/com/sun/tools/doclint/Checker.java --- a/langtools/src/share/classes/com/sun/tools/doclint/Checker.java Wed Jul 17 18:18:45 2013 -0700 +++ b/langtools/src/share/classes/com/sun/tools/doclint/Checker.java Wed Jul 17 19:12:03 2013 -0700 @@ -31,9 +31,11 @@ import java.net.URISyntaxException; import java.util.Deque; import java.util.EnumSet; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -45,6 +47,7 @@ import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.tools.Diagnostic.Kind; +import javax.tools.JavaFileObject; import com.sun.source.doctree.AttributeTree; import com.sun.source.doctree.AuthorTree; @@ -88,9 +91,9 @@ public class Checker extends DocTreePathScanner { final Env env; - Set foundParams = new HashSet(); - Set foundThrows = new HashSet(); - Set foundAnchors = new HashSet(); + Set foundParams = new HashSet<>(); + Set foundThrows = new HashSet<>(); + Map> foundAnchors = new HashMap<>(); boolean foundInheritDoc = false; boolean foundReturn = false; @@ -129,7 +132,7 @@ Checker(Env env) { env.getClass(); this.env = env; - tagStack = new LinkedList(); + tagStack = new LinkedList<>(); implicitHeaderLevel = env.implicitHeaderLevel; } @@ -508,7 +511,7 @@ if (!validName.matcher(value).matches()) { env.messages.error(HTML, tree, "dc.invalid.anchor", value); } - if (!foundAnchors.add(value)) { + if (!checkAnchor(value)) { env.messages.error(HTML, tree, "dc.anchor.already.defined", value); } } @@ -551,6 +554,14 @@ return super.visitAttribute(tree, ignore); } + private boolean checkAnchor(String name) { + JavaFileObject fo = env.currPath.getCompilationUnit().getSourceFile(); + Set set = foundAnchors.get(fo); + if (set == null) + foundAnchors.put(fo, set = new HashSet<>()); + return set.add(name); + } + // http://www.w3.org/TR/html401/types.html#type-name private static final Pattern validName = Pattern.compile("[A-Za-z][A-Za-z0-9-_:.]*"); diff -r 3c2e9a2bbed6 -r 7766f69bffc7 langtools/test/tools/doclint/AnchorTest2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/doclint/AnchorTest2.java Wed Jul 17 19:12:03 2013 -0700 @@ -0,0 +1,20 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8020313 + * @summary doclint doesn't reset HTML anchors correctly + * @build DocLintTester + * @run main DocLintTester -ref AnchorTest2.out AnchorTest2.java AnchorTest2a.java + * @run main DocLintTester -ref AnchorTest2.out AnchorTest2a.java AnchorTest2.java + */ + +/** */ +public class AnchorTest2 { + /** */ + public void a_name_AnchorTest2() { } + + /** */ + public void a_name_AnchorTest2_already_defined() { } + + /** */ + public void a_name_AnchorTest2a_defined_in_other_file() { } +} diff -r 3c2e9a2bbed6 -r 7766f69bffc7 langtools/test/tools/doclint/AnchorTest2.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/doclint/AnchorTest2.out Wed Jul 17 19:12:03 2013 -0700 @@ -0,0 +1,4 @@ +AnchorTest2.java:15: error: anchor already defined: AnchorTest2 + /** */ + ^ +1 error diff -r 3c2e9a2bbed6 -r 7766f69bffc7 langtools/test/tools/doclint/AnchorTest2a.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/doclint/AnchorTest2a.java Wed Jul 17 19:12:03 2013 -0700 @@ -0,0 +1,7 @@ +/* /nodynamiccopyright/ */ + +/** + * + */ +public class AnchorTest2a { } +