mirror of
https://github.com/openjdk/jdk.git
synced 2026-05-12 06:29:37 +00:00
8169561: jshell tool: double shift-tab on variable crashes tool
Avoid crashe for unknown HTML tags; avoid crash for non-existing documentation; fix signature for JShell variables Reviewed-by: rfield
This commit is contained in:
parent
32f54b25b5
commit
da7b11ca15
@ -246,7 +246,7 @@ public class JavadocFormatter {
|
||||
|
||||
@Override @DefinedBy(Api.COMPILER_TREE)
|
||||
public Object visitStartElement(StartElementTree node, Object p) {
|
||||
switch (HtmlTag.get(node.getName())) {
|
||||
switch (getHtmlTag(node.getName())) {
|
||||
case P:
|
||||
if (lastNode!= null && lastNode.getKind() == DocTree.Kind.START_ELEMENT &&
|
||||
HtmlTag.get(((StartElementTree) lastNode).getName()) == HtmlTag.LI) {
|
||||
@ -397,7 +397,7 @@ public class JavadocFormatter {
|
||||
}
|
||||
|
||||
private void handleEndElement(Name name) {
|
||||
switch (HtmlTag.get(name)) {
|
||||
switch (getHtmlTag(name)) {
|
||||
case BLOCKQUOTE:
|
||||
indent -= INDENT;
|
||||
break;
|
||||
@ -629,6 +629,12 @@ public class JavadocFormatter {
|
||||
}
|
||||
}
|
||||
|
||||
private static HtmlTag getHtmlTag(Name name) {
|
||||
HtmlTag tag = HtmlTag.get(name);
|
||||
|
||||
return tag != null ? tag : HtmlTag.HTML; //using HtmlTag.HTML as default no-op value
|
||||
}
|
||||
|
||||
private static Map<StartElementTree, Integer> countTableColumns(DocCommentTree dct) {
|
||||
Map<StartElementTree, Integer> result = new IdentityHashMap<>();
|
||||
|
||||
@ -639,7 +645,7 @@ public class JavadocFormatter {
|
||||
|
||||
@Override @DefinedBy(Api.COMPILER_TREE)
|
||||
public Void visitStartElement(StartElementTree node, Void p) {
|
||||
switch (HtmlTag.get(node.getName())) {
|
||||
switch (getHtmlTag(node.getName())) {
|
||||
case TABLE: currentTable = node; break;
|
||||
case TR:
|
||||
currentMaxColumns = Math.max(currentMaxColumns, currentRowColumns);
|
||||
|
||||
@ -283,9 +283,9 @@ class ConsoleIOContext extends IOContext {
|
||||
if (firstInvocation) {
|
||||
convertor = d -> d.signature();
|
||||
} else {
|
||||
convertor = d -> formatter.formatJavadoc(d.signature(),
|
||||
d.javadoc() != null ? d.javadoc()
|
||||
: repl.messageFormat("jshell.console.no.javadoc"));
|
||||
convertor = d -> formatter.formatJavadoc(d.signature(), d.javadoc()) +
|
||||
(d.javadoc() == null ? repl.messageFormat("jshell.console.no.javadoc")
|
||||
: "");
|
||||
}
|
||||
doc = repl.analysis.documentation(prefix + buffer, cursor + prefix.length(), !firstInvocation)
|
||||
.stream()
|
||||
|
||||
@ -1341,9 +1341,9 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis {
|
||||
.collect(joining(" & "));
|
||||
}
|
||||
case FIELD:
|
||||
return elementHeader(at, el.getEnclosingElement(), includeParameterNames, false) + "." + el.getSimpleName() + ":" + el.asType();
|
||||
return appendDot(elementHeader(at, el.getEnclosingElement(), includeParameterNames, false)) + el.getSimpleName() + ":" + el.asType();
|
||||
case ENUM_CONSTANT:
|
||||
return elementHeader(at, el.getEnclosingElement(), includeParameterNames, false) + "." + el.getSimpleName();
|
||||
return appendDot(elementHeader(at, el.getEnclosingElement(), includeParameterNames, false)) + el.getSimpleName();
|
||||
case EXCEPTION_PARAMETER: case LOCAL_VARIABLE: case PARAMETER: case RESOURCE_VARIABLE:
|
||||
return el.getSimpleName() + ":" + el.asType();
|
||||
case CONSTRUCTOR: case METHOD: {
|
||||
@ -1407,6 +1407,9 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis {
|
||||
return el.toString();
|
||||
}
|
||||
}
|
||||
private String appendDot(String fqn) {
|
||||
return fqn.isEmpty() ? fqn : fqn + ".";
|
||||
}
|
||||
private TypeMirror unwrapArrayType(TypeMirror arrayType) {
|
||||
if (arrayType.getKind() == TypeKind.ARRAY) {
|
||||
return ((ArrayType)arrayType).getComponentType();
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8131019
|
||||
* @bug 8131019 8169561
|
||||
* @summary Test JavadocFormatter
|
||||
* @library /tools/lib
|
||||
* @modules jdk.compiler/jdk.internal.shellsupport.doc
|
||||
@ -388,6 +388,17 @@ public class JavadocFormatterTest {
|
||||
if (!Objects.equals(actual, expected)) {
|
||||
throw new AssertionError("Incorrect output: " + actual);
|
||||
}
|
||||
|
||||
//unknown HTML tag:
|
||||
actual = new JavadocFormatter(66, false).formatJavadoc("test",
|
||||
"1234 <unknown any any>1234</unknown> 1234");
|
||||
|
||||
expected = "test\n" +
|
||||
"1234 1234 1234\n";
|
||||
|
||||
if (!Objects.equals(actual, expected)) {
|
||||
throw new AssertionError("Incorrect output: " + actual);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8131019
|
||||
* @bug 8131019 8169561
|
||||
* @summary Test Javadoc
|
||||
* @library /tools/lib
|
||||
* @modules jdk.compiler/com.sun.tools.javac.api
|
||||
@ -65,6 +65,11 @@ public class JavadocTest extends KullaTesting {
|
||||
assertJavadoc("clz.undef|");
|
||||
}
|
||||
|
||||
public void testVariableInRepl() {
|
||||
assertEval("Object o;");
|
||||
assertSignature("o|", "o:java.lang.Object");
|
||||
}
|
||||
|
||||
private void prepareZip() {
|
||||
String clazz =
|
||||
"package test;\n" +
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user