diff -r 265017792980 -r e8f487b79e24 langtools/test/jdk/jshell/CompletionSuggestionTest.java --- a/langtools/test/jdk/jshell/CompletionSuggestionTest.java Mon Oct 17 15:02:46 2016 +0100 +++ b/langtools/test/jdk/jshell/CompletionSuggestionTest.java Mon Oct 17 23:23:11 2016 +0900 @@ -23,8 +23,8 @@ /* * @test - * @bug 8131025 8141092 8153761 - * @summary Test Completion + * @bug 8131025 8141092 8153761 8145263 + * @summary Test Completion and Documentation * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main * jdk.jdeps/com.sun.tools.javap @@ -43,6 +43,8 @@ import java.util.Collections; import java.util.Set; import java.util.HashSet; +import java.util.function.BiFunction; +import java.util.function.Function; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; @@ -304,35 +306,35 @@ public void testDocumentation() throws Exception { dontReadParameterNamesFromClassFile(); assertDocumentation("System.getProperty(|", - "java.lang.System.getProperty(java.lang.String key)", - "java.lang.System.getProperty(java.lang.String key, java.lang.String def)"); + "String System.getProperty(String key)", + "String System.getProperty(String key, String def)"); assertEval("char[] chars = null;"); assertDocumentation("new String(chars, |", - "java.lang.String(char[] arg0, int arg1, int arg2)"); + "String(char[], int, int)"); assertDocumentation("String.format(|", - "java.lang.String.format(java.lang.String arg0, java.lang.Object... arg1)", - "java.lang.String.format(java.util.Locale arg0, java.lang.String arg1, java.lang.Object... arg2)"); - assertDocumentation("\"\".getBytes(\"\"|", "java.lang.String.getBytes(int arg0, int arg1, byte[] arg2, int arg3)", - "java.lang.String.getBytes(java.lang.String arg0)", - "java.lang.String.getBytes(java.nio.charset.Charset arg0)"); - assertDocumentation("\"\".getBytes(\"\" |", "java.lang.String.getBytes(int arg0, int arg1, byte[] arg2, int arg3)", - "java.lang.String.getBytes(java.lang.String arg0)", - "java.lang.String.getBytes(java.nio.charset.Charset arg0)"); + "String String.format(String, Object...)", + "String String.format(java.util.Locale, String, Object...)"); + assertDocumentation("\"\".getBytes(\"\"|", "void String.getBytes(int, int, byte[], int)", + "byte[] String.getBytes(String) throws java.io.UnsupportedEncodingException", + "byte[] String.getBytes(java.nio.charset.Charset)"); + assertDocumentation("\"\".getBytes(\"\" |", "void String.getBytes(int, int, byte[], int)", + "byte[] String.getBytes(String) throws java.io.UnsupportedEncodingException", + "byte[] String.getBytes(java.nio.charset.Charset)"); } public void testMethodsWithNoArguments() throws Exception { dontReadParameterNamesFromClassFile(); assertDocumentation("System.out.println(|", - "java.io.PrintStream.println()", - "java.io.PrintStream.println(boolean arg0)", - "java.io.PrintStream.println(char arg0)", - "java.io.PrintStream.println(int arg0)", - "java.io.PrintStream.println(long arg0)", - "java.io.PrintStream.println(float arg0)", - "java.io.PrintStream.println(double arg0)", - "java.io.PrintStream.println(char[] arg0)", - "java.io.PrintStream.println(java.lang.String arg0)", - "java.io.PrintStream.println(java.lang.Object arg0)"); + "void java.io.PrintStream.println()", + "void java.io.PrintStream.println(boolean)", + "void java.io.PrintStream.println(char)", + "void java.io.PrintStream.println(int)", + "void java.io.PrintStream.println(long)", + "void java.io.PrintStream.println(float)", + "void java.io.PrintStream.println(double)", + "void java.io.PrintStream.println(char[])", + "void java.io.PrintStream.println(String)", + "void java.io.PrintStream.println(Object)"); } public void testErroneous() { @@ -472,14 +474,14 @@ public void testDocumentationOfUserDefinedMethods() { assertEval("void f() {}"); - assertDocumentation("f(|", "f()"); + assertDocumentation("f(|", "void f()"); assertEval("void f(int i) {}"); - assertDocumentation("f(|", "f()", "f(int i)"); + assertDocumentation("f(|", "void f()", "void f(int i)"); assertEval(" void f(T... ts) {}", DiagCheck.DIAG_WARNING, DiagCheck.DIAG_OK); - assertDocumentation("f(|", "f()", "f(int i)", "f(T... ts)"); + assertDocumentation("f(|", "void f()", "void f(int i)", "void f(T... ts)"); assertEval("class A {}"); assertEval("void f(A a) {}"); - assertDocumentation("f(|", "f()", "f(int i)", "f(T... ts)", "f(A a)"); + assertDocumentation("f(|", "void f()", "void f(int i)", "void f(T... ts)", "void f(A a)"); } public void testDocumentationOfUserDefinedConstructors() { @@ -489,25 +491,25 @@ ste(MAIN_SNIPPET, VALID, VALID, true, null), ste(a, VALID, OVERWRITTEN, false, MAIN_SNIPPET))); assertDocumentation("new A(|", "A()", "A(int i)"); - assertEval("class A { A(T t) {} A(int i) {}}", + assertEval("class A { A(T a) {} A(int i) {} A(T t, U u) {}}", ste(MAIN_SNIPPET, VALID, VALID, true, null), ste(a2, VALID, OVERWRITTEN, false, MAIN_SNIPPET)); - assertDocumentation("new A(|", "A(T t)", "A(int i)"); + assertDocumentation("new A(|", "A(T a)", "A(int i)", " A(T t, U u)"); } public void testDocumentationOfOverriddenMethods() throws Exception { dontReadParameterNamesFromClassFile(); assertDocumentation("\"\".wait(|", - "java.lang.Object.wait(long arg0)", - "java.lang.Object.wait(long arg0, int arg1)", - "java.lang.Object.wait()"); + "void Object.wait(long) throws InterruptedException", + "void Object.wait(long, int) throws InterruptedException", + "void Object.wait() throws InterruptedException"); assertEval("class Base {void method() {}}"); Snippet e = classKey(assertEval("class Extend extends Base {}")); - assertDocumentation("new Extend().method(|", "Base.method()"); + assertDocumentation("new Extend().method(|", "void Base.method()"); assertEval("class Extend extends Base {void method() {}}", ste(MAIN_SNIPPET, VALID, VALID, true, null), ste(e, VALID, OVERWRITTEN, false, MAIN_SNIPPET)); - assertDocumentation("new Extend().method(|", "Extend.method()"); + assertDocumentation("new Extend().method(|", "void Extend.method()"); } public void testDocumentationOfInvisibleMethods() { @@ -534,13 +536,67 @@ assertEval("void method(int n, Object o) { }"); assertEval("void method(Object n, int o) { }"); assertDocumentation("method(primitive,|", - "method(int n, java.lang.Object o)", - "method(java.lang.Object n, int o)"); + "void method(int n, Object o)", + "void method(Object n, int o)"); assertDocumentation("method(boxed,|", - "method(int n, java.lang.Object o)", - "method(java.lang.Object n, int o)"); + "void method(int n, Object o)", + "void method(Object n, int o)"); assertDocumentation("method(object,|", - "method(java.lang.Object n, int o)"); + "void method(Object n, int o)"); + } + + public void testDocumentationWithGenerics() { + class TestDocumentationWithGenerics { + private final Function codeFacotry; + private final BiFunction evalFormatter; + private final BiFunction docFormatter; + int count; + + TestDocumentationWithGenerics( + Function codeFactory, + BiFunction evalFormatter, + BiFunction documentationFormatter) { + this.codeFacotry = codeFactory; + this.evalFormatter = evalFormatter; + this.docFormatter = documentationFormatter; + } + + void assertDoc(String generics) { + assertDoc(generics, generics); + } + + void assertDoc(String generics, String expectedGenerics) { + assertEval(evalFormatter.apply(generics, count)); + assertDocumentation(codeFacotry.apply(count), docFormatter.apply(expectedGenerics, count)); + count++; + } + } + + TestDocumentationWithGenerics[] tests = { + new TestDocumentationWithGenerics( + i -> "f" + i + "(|", + (g, i) -> "<" + g + "> void f" + i + "() {}", + (g, i) -> "void <" + g + ">f" + i + "()" + ), + new TestDocumentationWithGenerics( + i -> "new C" + i + "().f(|", + (g, i) -> "class C" + i + "<" + g + "> { void f() {} }", + (g, i) -> "void C" + i + "<" + g + ">.f()" + ) + }; + + Arrays.stream(tests).forEach(t -> { + t.assertDoc("T"); + t.assertDoc("T extends Object", + "T"); + t.assertDoc("T extends String"); + t.assertDoc("T extends java.lang.String", + "T extends String"); + t.assertDoc("T extends Number & Comparable"); + t.assertDoc("T extends java.io.Serializable & CharSequence"); + t.assertDoc("K, D, M extends java.util.Map", + "K, D, M extends java.util.Map"); + }); } public void testVarArgs() {