Skip to content

Commit fb7d25d

Browse files
author
Dan Smith
committed
8373909: JSpec and ToolGuide taglets use incorrect relative path
Reviewed-by: liach Backport-of: 0b27124
1 parent d4cf305 commit fb7d25d

File tree

4 files changed

+46
-66
lines changed

4 files changed

+46
-66
lines changed

make/Docs.gmk

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,12 @@ JAVADOC_DISABLED_DOCLINT_WARNINGS := missing
9393
JAVADOC_DISABLED_DOCLINT_PACKAGES := org.w3c.* javax.smartcardio
9494

9595
# The initial set of options for javadoc
96+
# -XDaccessInternalAPI is a temporary workaround, see 8373909
9697
JAVADOC_OPTIONS := -use -keywords -notimestamp \
9798
-serialwarn -encoding utf-8 -docencoding utf-8 -breakiterator \
9899
-splitIndex --system none -javafx --expand-requires transitive \
99-
--override-methods=summary
100+
--override-methods=summary \
101+
-XDaccessInternalAPI
100102

101103
# The reference options must stay stable to allow for comparisons across the
102104
# development cycle.

make/jdk/src/classes/build/tools/taglet/JSpec.java

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,9 @@
3131
import java.util.regex.Matcher;
3232
import java.util.regex.Pattern;
3333
import java.util.stream.Collectors;
34+
import java.lang.reflect.Field;
3435

3536
import javax.lang.model.element.Element;
36-
import javax.lang.model.element.PackageElement;
37-
import javax.lang.model.element.TypeElement;
3837

3938
import com.sun.source.doctree.DocTree;
4039
import com.sun.source.doctree.LiteralTree;
@@ -160,9 +159,10 @@ public String toString(List<? extends DocTree> tags, Element elem) {
160159
if (m.find()) {
161160
String chapter = m.group("chapter");
162161
String section = m.group("section");
162+
String rootParent = currentPath().replaceAll("[^/]+", "..");
163163

164-
String url = String.format("%1$s/../specs/%2$s/%2$s-%3$s.html#%2$s-%3$s%4$s",
165-
docRoot(elem), idPrefix, chapter, section);
164+
String url = String.format("%1$s/specs/%2$s/%2$s-%3$s.html#%2$s-%3$s%4$s",
165+
rootParent, idPrefix, chapter, section);
166166

167167
sb.append("<a href=\"")
168168
.append(url)
@@ -183,6 +183,22 @@ public String toString(List<? extends DocTree> tags, Element elem) {
183183
return sb.toString();
184184
}
185185

186+
private static ThreadLocal<String> CURRENT_PATH = null;
187+
188+
private String currentPath() {
189+
if (CURRENT_PATH == null) {
190+
try {
191+
Field f = Class.forName("jdk.javadoc.internal.doclets.formats.html.HtmlDocletWriter")
192+
.getField("CURRENT_PATH");
193+
@SuppressWarnings("unchecked")
194+
ThreadLocal<String> tl = (ThreadLocal<String>) f.get(null);
195+
CURRENT_PATH = tl;
196+
} catch (ReflectiveOperationException e) {
197+
throw new RuntimeException("Cannot determine current path", e);
198+
}
199+
}
200+
return CURRENT_PATH.get();
201+
}
186202

187203
private String expand(List<? extends DocTree> trees) {
188204
return (new SimpleDocTreeVisitor<StringBuilder, StringBuilder>() {
@@ -209,34 +225,4 @@ private String escape(String s) {
209225
}).visit(trees, new StringBuilder()).toString();
210226
}
211227

212-
private String docRoot(Element elem) {
213-
switch (elem.getKind()) {
214-
case MODULE:
215-
return "..";
216-
217-
case PACKAGE:
218-
PackageElement pe = (PackageElement)elem;
219-
String pkgPart = pe.getQualifiedName()
220-
.toString()
221-
.replace('.', '/')
222-
.replaceAll("[^/]+", "..");
223-
return pe.getEnclosingElement() != null
224-
? "../" + pkgPart
225-
: pkgPart;
226-
227-
case CLASS, ENUM, RECORD, INTERFACE, ANNOTATION_TYPE:
228-
TypeElement te = (TypeElement)elem;
229-
return te.getQualifiedName()
230-
.toString()
231-
.replace('.', '/')
232-
.replaceAll("[^/]+", "..");
233-
234-
default:
235-
var enclosing = elem.getEnclosingElement();
236-
if (enclosing == null)
237-
throw new IllegalArgumentException(elem.getKind().toString());
238-
return docRoot(enclosing);
239-
}
240-
}
241-
242228
}

make/jdk/src/classes/build/tools/taglet/ToolGuide.java

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,9 @@
3131
import java.util.regex.Matcher;
3232
import java.util.regex.Pattern;
3333
import java.util.stream.Collectors;
34+
import java.lang.reflect.Field;
3435

3536
import javax.lang.model.element.Element;
36-
import javax.lang.model.element.PackageElement;
37-
import javax.lang.model.element.TypeElement;
3837

3938
import com.sun.source.doctree.DocTree;
4039
import com.sun.source.doctree.UnknownBlockTagTree;
@@ -68,7 +67,7 @@ public class ToolGuide implements Taglet {
6867

6968
static final String TAG_NAME = "toolGuide";
7069

71-
static final String BASE_URL = "../specs/man";
70+
static final String BASE_URL = "specs/man";
7271

7372
static final Pattern TAG_PATTERN = Pattern.compile("(?s)(?<name>[A-Za-z0-9]+)\\s*(?<label>.*)$");
7473

@@ -119,9 +118,10 @@ public String toString(List<? extends DocTree> tags, Element elem) {
119118
if (label.isEmpty()) {
120119
label = name;
121120
}
121+
String rootParent = currentPath().replaceAll("[^/]+", "..");
122122

123123
String url = String.format("%s/%s/%s.html",
124-
docRoot(elem), BASE_URL, name);
124+
rootParent, BASE_URL, name);
125125

126126
if (needComma) {
127127
sb.append(",\n");
@@ -142,33 +142,21 @@ public String toString(List<? extends DocTree> tags, Element elem) {
142142
return sb.toString();
143143
}
144144

145-
private String docRoot(Element elem) {
146-
switch (elem.getKind()) {
147-
case MODULE:
148-
return "..";
149-
150-
case PACKAGE:
151-
PackageElement pe = (PackageElement)elem;
152-
String pkgPart = pe.getQualifiedName()
153-
.toString()
154-
.replace('.', '/')
155-
.replaceAll("[^/]+", "..");
156-
return pe.getEnclosingElement() != null
157-
? "../" + pkgPart
158-
: pkgPart;
159-
160-
case CLASS, ENUM, RECORD, INTERFACE, ANNOTATION_TYPE:
161-
TypeElement te = (TypeElement)elem;
162-
return te.getQualifiedName()
163-
.toString()
164-
.replace('.', '/')
165-
.replaceAll("[^/]+", "..");
166-
167-
default:
168-
var enclosing = elem.getEnclosingElement();
169-
if (enclosing == null)
170-
throw new IllegalArgumentException(elem.getKind().toString());
171-
return docRoot(enclosing);
145+
private static ThreadLocal<String> CURRENT_PATH = null;
146+
147+
private String currentPath() {
148+
if (CURRENT_PATH == null) {
149+
try {
150+
Field f = Class.forName("jdk.javadoc.internal.doclets.formats.html.HtmlDocletWriter")
151+
.getField("CURRENT_PATH");
152+
@SuppressWarnings("unchecked")
153+
ThreadLocal<String> tl = (ThreadLocal<String>) f.get(null);
154+
CURRENT_PATH = tl;
155+
} catch (ReflectiveOperationException e) {
156+
throw new RuntimeException("Cannot determine current path", e);
157+
}
172158
}
159+
return CURRENT_PATH.get();
173160
}
161+
174162
}

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,12 @@ protected HtmlDocletWriter(HtmlConfiguration configuration, DocPath path, boolea
243243
if (generating) {
244244
writeGenerating();
245245
}
246+
CURRENT_PATH.set(path.getPath());
246247
}
247248

249+
/** Temporary workaround to share current path with taglets, see 8373909 */
250+
public static final ThreadLocal<String> CURRENT_PATH = new ThreadLocal<>();
251+
248252
/**
249253
* The top-level method to generate and write the page represented by this writer.
250254
*

0 commit comments

Comments
 (0)