8020313: doclint doesn't reset HTML anchors correctly
Reviewed-by: mcimadamore
This commit is contained in:
parent
89197f0946
commit
772640d4e8
langtools
src/share/classes/com/sun/tools/doclint
test/tools/doclint
@ -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;
|
|||||||
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.*;
|
|||||||
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> {
|
|||||||
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> {
|
|||||||
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> {
|
|||||||
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-_:.]*");
|
||||||
|
|
||||||
|
20
langtools/test/tools/doclint/AnchorTest2.java
Normal file
20
langtools/test/tools/doclint/AnchorTest2.java
Normal file
@ -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 {
|
||||||
|
/** <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() { }
|
||||||
|
}
|
4
langtools/test/tools/doclint/AnchorTest2.out
Normal file
4
langtools/test/tools/doclint/AnchorTest2.out
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
AnchorTest2.java:15: error: anchor already defined: AnchorTest2
|
||||||
|
/** <a name="AnchorTest2"> </a> */
|
||||||
|
^
|
||||||
|
1 error
|
7
langtools/test/tools/doclint/AnchorTest2a.java
Normal file
7
langtools/test/tools/doclint/AnchorTest2a.java
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
/* /nodynamiccopyright/ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <a name="AnchorTest2a"> </a>
|
||||||
|
*/
|
||||||
|
public class AnchorTest2a { }
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user