提交 211a67e6 编写于 作者: J jjg

8020313: doclint doesn't reset HTML anchors correctly

Reviewed-by: mcimadamore
上级 be2674dc
...@@ -31,9 +31,11 @@ import java.net.URI; ...@@ -31,9 +31,11 @@ import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.Deque; import java.util.Deque;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
...@@ -45,6 +47,7 @@ import javax.lang.model.element.Name; ...@@ -45,6 +47,7 @@ import javax.lang.model.element.Name;
import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeMirror;
import javax.tools.Diagnostic.Kind; import javax.tools.Diagnostic.Kind;
import javax.tools.JavaFileObject;
import com.sun.source.doctree.AttributeTree; import com.sun.source.doctree.AttributeTree;
import com.sun.source.doctree.AuthorTree; import com.sun.source.doctree.AuthorTree;
...@@ -88,9 +91,9 @@ import static com.sun.tools.doclint.Messages.Group.*; ...@@ -88,9 +91,9 @@ import static com.sun.tools.doclint.Messages.Group.*;
public class Checker extends DocTreePathScanner<Void, Void> { public class Checker extends DocTreePathScanner<Void, Void> {
final Env env; final Env env;
Set<Element> foundParams = new HashSet<Element>(); Set<Element> foundParams = new HashSet<>();
Set<TypeMirror> foundThrows = new HashSet<TypeMirror>(); Set<TypeMirror> foundThrows = new HashSet<>();
Set<String> foundAnchors = new HashSet<String>(); Map<JavaFileObject, Set<String>> foundAnchors = new HashMap<>();
boolean foundInheritDoc = false; boolean foundInheritDoc = false;
boolean foundReturn = false; boolean foundReturn = false;
...@@ -129,7 +132,7 @@ public class Checker extends DocTreePathScanner<Void, Void> { ...@@ -129,7 +132,7 @@ public class Checker extends DocTreePathScanner<Void, Void> {
Checker(Env env) { Checker(Env env) {
env.getClass(); env.getClass();
this.env = env; this.env = env;
tagStack = new LinkedList<TagStackItem>(); tagStack = new LinkedList<>();
implicitHeaderLevel = env.implicitHeaderLevel; implicitHeaderLevel = env.implicitHeaderLevel;
} }
...@@ -508,7 +511,7 @@ public class Checker extends DocTreePathScanner<Void, Void> { ...@@ -508,7 +511,7 @@ public class Checker extends DocTreePathScanner<Void, Void> {
if (!validName.matcher(value).matches()) { if (!validName.matcher(value).matches()) {
env.messages.error(HTML, tree, "dc.invalid.anchor", value); 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); env.messages.error(HTML, tree, "dc.anchor.already.defined", value);
} }
} }
...@@ -551,6 +554,14 @@ public class Checker extends DocTreePathScanner<Void, Void> { ...@@ -551,6 +554,14 @@ public class Checker extends DocTreePathScanner<Void, Void> {
return super.visitAttribute(tree, ignore); return super.visitAttribute(tree, ignore);
} }
private boolean checkAnchor(String name) {
JavaFileObject fo = env.currPath.getCompilationUnit().getSourceFile();
Set<String> 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 // http://www.w3.org/TR/html401/types.html#type-name
private static final Pattern validName = Pattern.compile("[A-Za-z][A-Za-z0-9-_:.]*"); private static final Pattern validName = Pattern.compile("[A-Za-z][A-Za-z0-9-_:.]*");
......
/*
* @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 {
/** <a name="AnchorTest2"> </a> */
public void a_name_AnchorTest2() { }
/** <a name="AnchorTest2"> </a> */
public void a_name_AnchorTest2_already_defined() { }
/** <a name="AnchorTest2a"> </a> */
public void a_name_AnchorTest2a_defined_in_other_file() { }
}
AnchorTest2.java:15: error: anchor already defined: AnchorTest2
/** <a name="AnchorTest2"> </a> */
^
1 error
/* /nodynamiccopyright/ */
/**
* <a name="AnchorTest2a"> </a>
*/
public class AnchorTest2a { }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册