# HG changeset patch # User rfield # Date 1471879098 25200 # Node ID 819fc588bd1954a8a58b811db8d67aac6c468cb1 # Parent fa42e80405505e1568669fc95b4db5b4a4fe9059 8164277: JShell API: Snippets are immutable and should be available for post-mortem analysis Reviewed-by: jlahoda diff -r fa42e8040550 -r 819fc588bd19 langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java Mon Aug 22 15:16:30 2016 +0200 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java Mon Aug 22 08:18:18 2016 -0700 @@ -503,10 +503,8 @@ /** * Return all snippets. * @return the snippets for all current snippets in id order. - * @throws IllegalStateException if this JShell instance is closed. */ - public Stream snippets() throws IllegalStateException { - checkIfAlive(); + public Stream snippets() { return maps.snippetList().stream(); } @@ -517,9 +515,8 @@ * {@code && snippet.kind() == Kind.VARIABLE} * and cast to {@code VarSnippet}. * @return the active declared variables. - * @throws IllegalStateException if this JShell instance is closed. */ - public Stream variables() throws IllegalStateException { + public Stream variables() { return snippets() .filter(sn -> status(sn).isActive() && sn.kind() == Snippet.Kind.VAR) .map(sn -> (VarSnippet) sn); @@ -532,9 +529,8 @@ * {@code && snippet.kind() == Kind.METHOD} * and cast to MethodSnippet. * @return the active declared methods. - * @throws IllegalStateException if this JShell instance is closed. */ - public Stream methods() throws IllegalStateException { + public Stream methods() { return snippets() .filter(sn -> status(sn).isActive() && sn.kind() == Snippet.Kind.METHOD) .map(sn -> (MethodSnippet)sn); @@ -547,9 +543,8 @@ * {@code && snippet.kind() == Kind.TYPE_DECL} * and cast to TypeDeclSnippet. * @return the active declared type declarations. - * @throws IllegalStateException if this JShell instance is closed. */ - public Stream types() throws IllegalStateException { + public Stream types() { return snippets() .filter(sn -> status(sn).isActive() && sn.kind() == Snippet.Kind.TYPE_DECL) .map(sn -> (TypeDeclSnippet) sn); @@ -562,9 +557,8 @@ * {@code && snippet.kind() == Kind.IMPORT} * and cast to ImportSnippet. * @return the active declared import declarations. - * @throws IllegalStateException if this JShell instance is closed. */ - public Stream imports() throws IllegalStateException { + public Stream imports() { return snippets() .filter(sn -> status(sn).isActive() && sn.kind() == Snippet.Kind.IMPORT) .map(sn -> (ImportSnippet) sn); diff -r fa42e8040550 -r 819fc588bd19 langtools/test/jdk/jshell/JShellQueryTest.java --- a/langtools/test/jdk/jshell/JShellQueryTest.java Mon Aug 22 15:16:30 2016 +0200 +++ b/langtools/test/jdk/jshell/JShellQueryTest.java Mon Aug 22 08:18:18 2016 -0700 @@ -28,8 +28,6 @@ * @build KullaTesting * @run testng JShellQueryTest */ -import java.util.Set; -import java.util.stream.Stream; import jdk.jshell.Snippet; import org.testng.annotations.Test; @@ -38,46 +36,39 @@ import jdk.jshell.TypeDeclSnippet; import jdk.jshell.VarSnippet; import static java.util.stream.Collectors.joining; -import static java.util.stream.Collectors.toSet; import static org.testng.Assert.assertEquals; @Test public class JShellQueryTest extends KullaTesting { - private void checkStreamMatch(Stream result, T... expected) { - Set sns = result.collect(toSet()); - Set exp = Stream.of(expected).collect(toSet()); - assertEquals(sns, exp); - } - public void testSnippets() { - checkStreamMatch(getState().snippets()); + assertStreamMatch(getState().snippets()); VarSnippet sx = varKey(assertEval("int x = 5;")); VarSnippet sfoo = varKey(assertEval("String foo;")); MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }")); MethodSnippet svv = methodKey(assertEval("void vv() { }")); - checkStreamMatch(getState().snippets(), sx, sfoo, smm, svv); + assertStreamMatch(getState().snippets(), sx, sfoo, smm, svv); TypeDeclSnippet sc = classKey(assertEval("class C { }")); TypeDeclSnippet si = classKey(assertEval("interface I { }")); ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;")); - checkStreamMatch(getState().snippets(), sx, sfoo, smm, svv, sc, si, simp); + assertStreamMatch(getState().snippets(), sx, sfoo, smm, svv, sc, si, simp); } public void testVars() { - checkStreamMatch(getState().variables()); + assertStreamMatch(getState().variables()); VarSnippet sx = varKey(assertEval("int x = 5;")); VarSnippet sfoo = varKey(assertEval("String foo;")); MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }")); MethodSnippet svv = methodKey(assertEval("void vv() { }")); - checkStreamMatch(getState().variables(), sx, sfoo); + assertStreamMatch(getState().variables(), sx, sfoo); TypeDeclSnippet sc = classKey(assertEval("class C { }")); TypeDeclSnippet si = classKey(assertEval("interface I { }")); ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;")); - checkStreamMatch(getState().variables(), sx, sfoo); + assertStreamMatch(getState().variables(), sx, sfoo); } public void testMethods() { - checkStreamMatch(getState().methods()); + assertStreamMatch(getState().methods()); VarSnippet sx = varKey(assertEval("int x = 5;")); VarSnippet sfoo = varKey(assertEval("String foo;")); MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }")); @@ -85,11 +76,11 @@ TypeDeclSnippet sc = classKey(assertEval("class C { }")); TypeDeclSnippet si = classKey(assertEval("interface I { }")); ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;")); - checkStreamMatch(getState().methods(), smm, svv); + assertStreamMatch(getState().methods(), smm, svv); } public void testTypes() { - checkStreamMatch(getState().types()); + assertStreamMatch(getState().types()); VarSnippet sx = varKey(assertEval("int x = 5;")); VarSnippet sfoo = varKey(assertEval("String foo;")); MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }")); @@ -97,11 +88,11 @@ TypeDeclSnippet sc = classKey(assertEval("class C { }")); TypeDeclSnippet si = classKey(assertEval("interface I { }")); ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;")); - checkStreamMatch(getState().types(), sc, si); + assertStreamMatch(getState().types(), sc, si); } public void testImports() { - checkStreamMatch(getState().imports()); + assertStreamMatch(getState().imports()); VarSnippet sx = varKey(assertEval("int x = 5;")); VarSnippet sfoo = varKey(assertEval("String foo;")); MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }")); @@ -109,12 +100,12 @@ TypeDeclSnippet sc = classKey(assertEval("class C { }")); TypeDeclSnippet si = classKey(assertEval("interface I { }")); ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;")); - checkStreamMatch(getState().imports(), simp); + assertStreamMatch(getState().imports(), simp); } public void testDiagnostics() { Snippet sx = varKey(assertEval("int x = 5;")); - checkStreamMatch(getState().diagnostics(sx)); + assertStreamMatch(getState().diagnostics(sx)); Snippet broken = methodKey(assertEvalFail("int m() { blah(); return \"hello\"; }")); String res = getState().diagnostics(broken) .map(d -> d.getCode()) @@ -124,8 +115,8 @@ public void testUnresolvedDependencies() { VarSnippet sx = varKey(assertEval("int x = 5;")); - checkStreamMatch(getState().unresolvedDependencies(sx)); + assertStreamMatch(getState().unresolvedDependencies(sx)); MethodSnippet unr = methodKey(getState().eval("void uu() { baz(); zips(); }")); - checkStreamMatch(getState().unresolvedDependencies(unr), "method zips()", "method baz()"); + assertStreamMatch(getState().unresolvedDependencies(unr), "method zips()", "method baz()"); } } diff -r fa42e8040550 -r 819fc588bd19 langtools/test/jdk/jshell/JShellStateClosedTest.java --- a/langtools/test/jdk/jshell/JShellStateClosedTest.java Mon Aug 22 15:16:30 2016 +0200 +++ b/langtools/test/jdk/jshell/JShellStateClosedTest.java Mon Aug 22 08:18:18 2016 -0700 @@ -22,7 +22,7 @@ */ /* - * @test + * @test 8164277 * @summary Testing IllegalStateException. * @build KullaTesting TestingInputStream JShellStateClosedTest * @run testng JShellStateClosedTest @@ -31,8 +31,11 @@ import java.util.function.Consumer; import jdk.jshell.DeclarationSnippet; +import jdk.jshell.ImportSnippet; +import jdk.jshell.MethodSnippet; import jdk.jshell.PersistentSnippet; import jdk.jshell.Snippet; +import jdk.jshell.TypeDeclSnippet; import jdk.jshell.VarSnippet; import org.testng.annotations.Test; @@ -52,19 +55,42 @@ } public void testClasses() { - testStateClosedException(() -> getState().types()); + TypeDeclSnippet sc = classKey(assertEval("class C { }")); + TypeDeclSnippet si = classKey(assertEval("interface I { }")); + getState().close(); + assertStreamMatch(getState().types(), sc, si); } public void testVariables() { - testStateClosedException(() -> getState().variables()); + VarSnippet sx = varKey(assertEval("int x = 5;")); + VarSnippet sfoo = varKey(assertEval("String foo;")); + getState().close(); + assertStreamMatch(getState().variables(), sx, sfoo); } public void testMethods() { - testStateClosedException(() -> getState().methods()); + MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }")); + MethodSnippet svv = methodKey(assertEval("void vv() { }")); + getState().close(); + assertStreamMatch(getState().methods(), smm, svv); } - public void testKeys() { - testStateClosedException(() -> getState().snippets()); + public void testImports() { + ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;")); + getState().close(); + assertStreamMatch(getState().imports(), simp); + } + + public void testSnippets() { + VarSnippet sx = varKey(assertEval("int x = 5;")); + VarSnippet sfoo = varKey(assertEval("String foo;")); + MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }")); + MethodSnippet svv = methodKey(assertEval("void vv() { }")); + TypeDeclSnippet sc = classKey(assertEval("class C { }")); + TypeDeclSnippet si = classKey(assertEval("interface I { }")); + ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;")); + getState().close(); + assertStreamMatch(getState().snippets(), sx, sfoo, smm, svv, sc, si, simp); } public void testEval() { diff -r fa42e8040550 -r 819fc588bd19 langtools/test/jdk/jshell/KullaTesting.java --- a/langtools/test/jdk/jshell/KullaTesting.java Mon Aug 22 15:16:30 2016 +0200 +++ b/langtools/test/jdk/jshell/KullaTesting.java Mon Aug 22 08:18:18 2016 -0700 @@ -71,6 +71,7 @@ import jdk.jshell.Diag; import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toSet; import static jdk.jshell.Snippet.Status.*; import static org.testng.Assert.*; import static jdk.jshell.Snippet.SubKind.METHOD_SUBKIND; @@ -358,6 +359,12 @@ return checkEvents(() -> getState().eval(input), "eval(" + input + ")", diagMain, diagUpdates, eventChains); } + void assertStreamMatch(Stream result, T... expected) { + Set sns = result.collect(toSet()); + Set exp = Stream.of(expected).collect(toSet()); + assertEquals(sns, exp); + } + private Map closure(List events) { Map transitions = new HashMap<>(); for (SnippetEvent event : events) {