8171130: jshell tool: /edit adds empty statement to brace terminated snippet

8173007: JShell Tests: ToolFormatTest takes too long

Reviewed-by: jlahoda
This commit is contained in:
Robert Field 2017-01-19 11:17:11 -08:00
parent 99e3bceb60
commit 362b794a82
3 changed files with 100 additions and 5 deletions

View File

@ -2191,13 +2191,22 @@ public class JShellTool implements MessageHandler {
case ASSIGNMENT_SUBKIND:
case OTHER_EXPRESSION_SUBKIND:
case TEMP_VAR_EXPRESSION_SUBKIND:
case STATEMENT_SUBKIND:
case UNKNOWN_SUBKIND:
if (!src.endsWith(";")) {
src = src + ";";
}
srcSet.add(src);
break;
case STATEMENT_SUBKIND:
if (src.endsWith("}")) {
// Could end with block or, for example, new Foo() {...}
// so, we need deeper analysis to know if it needs a semicolon
src = analysis.analyzeCompletion(src).source();
} else if (!src.endsWith(";")) {
src = src + ";";
}
srcSet.add(src);
break;
default:
srcSet.add(src);
break;

View File

@ -24,7 +24,7 @@
/*
* @test
* @summary Testing external editor.
* @bug 8143955 8080843 8163816 8143006 8169828
* @bug 8143955 8080843 8163816 8143006 8169828 8171130
* @modules jdk.jshell/jdk.internal.jshell.tool
* @build ReplToolTesting CustomEditor EditorTestBase
* @run testng ExternalEditorTest
@ -50,6 +50,7 @@ import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
public class ExternalEditorTest extends EditorTestBase {
@ -119,6 +120,28 @@ public class ExternalEditorTest extends EditorTestBase {
super.testEditor(defaultStartup, args, t);
}
@Test
public void testStatementSemicolonAddition() {
testEditor(
a -> assertCommand(a, "if (true) {}", ""),
a -> assertCommand(a, "if (true) {} else {}", ""),
a -> assertCommand(a, "Object o", "o ==> null"),
a -> assertCommand(a, "if (true) o = new Object() { int x; }", ""),
a -> assertCommand(a, "if (true) o = new Object() { int y; }", ""),
a -> assertCommand(a, "System.err.flush()", ""), // test still ; for expression statement
a -> assertEditOutput(a, "/ed", "", () -> {
assertEquals(getSource(),
"if (true) {}\n" +
"if (true) {} else {}\n" +
"Object o;\n" +
"if (true) o = new Object() { int x; };\n" +
"if (true) o = new Object() { int y; };\n" +
"System.err.flush();\n");
exit();
})
);
}
private static boolean isWindows() {
return System.getProperty("os.name").startsWith("Windows");
}

View File

@ -23,7 +23,7 @@
/*
* @test
* @bug 8148316 8148317 8151755 8152246 8153551 8154812 8157261 8163840 8166637 8161969
* @bug 8148316 8148317 8151755 8152246 8153551 8154812 8157261 8163840 8166637 8161969 8173007
* @summary Tests for output customization
* @library /tools/lib
* @modules jdk.compiler/com.sun.tools.javac.api
@ -38,8 +38,6 @@ import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
@ -140,6 +138,66 @@ public class ToolFormatTest extends ReplToolTesting {
);
}
public void testSetFormatSelectorSample() {
test(
(a) -> assertCommandOutputStartsWith(a, "/set mode ate -quiet",
"| Created new feedback mode: ate"),
(a) -> assertCommand(a, "/set feedback ate", ""),
(a) -> assertCommand(a, "/set format ate display '---replaced,modified,added-primary---'", ""),
(a) -> assertCommand(a, "/set format ate display '+++replaced,modified,added-primary+++' replaced,modified,added-primary", ""),
(a) -> assertCommand(a, "\"replaced,modified,added-primary\"", "+++replaced,modified,added-primary+++"),
(a) -> assertCommand(a, "/set format ate display '---added-primary,update---'", ""),
(a) -> assertCommand(a, "/set format ate display '+++added-primary,update+++' added-primary,update", ""),
(a) -> assertCommand(a, "\"added-primary,update\"", "+++added-primary,update+++"),
(a) -> assertCommand(a, "/set format ate display '---method-replaced-primary---'", ""),
(a) -> assertCommand(a, "/set format ate display '+++method-replaced-primary+++' method-replaced-primary", ""),
(a) -> assertCommand(a, "\"method-replaced-primary\"", "---method-replaced-primary---"),
(a) -> assertCommand(a, "/set format ate display '---method-replaced-update---'", ""),
(a) -> assertCommand(a, "/set format ate display '+++method-replaced-update+++' method-replaced-update", ""),
(a) -> assertCommand(a, "\"method-replaced-update\"", "---method-replaced-update---"),
(a) -> assertCommand(a, "/set format ate display '---method-added-update---'", ""),
(a) -> assertCommand(a, "/set format ate display '+++method-added-update+++' method-added-update", ""),
(a) -> assertCommand(a, "\"method-added-update\"", "---method-added-update---"),
(a) -> assertCommand(a, "/set format ate display '---method-added---'", ""),
(a) -> assertCommand(a, "/set format ate display '+++method-added+++' method-added", ""),
(a) -> assertCommand(a, "\"method-added\"", "---method-added---"),
(a) -> assertCommand(a, "/set format ate display '---class-modified,added-primary,update---'", ""),
(a) -> assertCommand(a, "/set format ate display '+++class-modified,added-primary,update+++' class-modified,added-primary,update", ""),
(a) -> assertCommand(a, "\"class-modified,added-primary,update\"", "---class-modified,added-primary,update---"),
(a) -> assertCommand(a, "/set format ate display '---class-modified,added-primary---'", ""),
(a) -> assertCommand(a, "/set format ate display '+++class-modified,added-primary+++' class-modified,added-primary", ""),
(a) -> assertCommand(a, "\"class-modified,added-primary\"", "---class-modified,added-primary---"),
(a) -> assertCommand(a, "/set format ate display '---class-modified,added-update---'", ""),
(a) -> assertCommand(a, "/set format ate display '+++class-modified,added-update+++' class-modified,added-update", ""),
(a) -> assertCommand(a, "\"class-modified,added-update\"", "---class-modified,added-update---"),
(a) -> assertCommand(a, "/set format ate display '---replaced,added---'", ""),
(a) -> assertCommand(a, "/set format ate display '+++replaced,added+++' replaced,added", ""),
(a) -> assertCommand(a, "\"replaced,added\"", "+++replaced,added+++"),
(a) -> assertCommand(a, "/set format ate display '---replaced-primary,update---'", ""),
(a) -> assertCommand(a, "/set format ate display '+++replaced-primary,update+++' replaced-primary,update", ""),
(a) -> assertCommand(a, "\"replaced-primary,update\"", "---replaced-primary,update---"),
(a) -> assertCommandOutputStartsWith(a, "/set feedback normal", "| Feedback mode: normal")
);
}
// This test is exhaustive and takes to long for routine testing -- disabled.
// A sampling of these has been added (above: testSetFormatSelectorSample).
// See 8173007
// Save for possible future deep testing or debugging
@Test(enabled = false)
public void testSetFormatSelector() {
List<ReplTest> tests = new ArrayList<>();
tests.add((a) -> assertCommandOutputStartsWith(a, "/set mode ate -quiet",
@ -202,6 +260,11 @@ public class ToolFormatTest extends ReplToolTesting {
tests.add((a) -> assertCommand(a, "/set format ate display '" + no + "'", ""));
tests.add((a) -> assertCommand(a, "/set format ate display '" + yes + "' " + select, ""));
tests.add((a) -> assertCommand(a, "\"" + select + "\"", expect));
/**** for sample generation ****
System.err.println(" (a) -> assertCommand(a, \"/set format ate display '" + no + "'\", \"\"),");
System.err.println(" (a) -> assertCommand(a, \"/set format ate display '" + yes + "' " + select + "\", \"\"),");
System.err.println(" (a) -> assertCommand(a, \"\\\"" + select + "\\\"\", \"" + expect + "\"),\n");
****/
}
}
}