# HG changeset patch # User lana # Date 1475169850 0 # Node ID 0dea223af562653f8de28544bc18fba0bf4b29bd # Parent ab4c47485fb8ad7d14541e016d90a3e4c93e63ba# Parent 8c2aab77c2d214e817e68f5239d470b83fb0478c Merge diff -r ab4c47485fb8 -r 0dea223af562 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java Thu Sep 29 16:45:12 2016 +0000 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java Thu Sep 29 17:24:10 2016 +0000 @@ -415,10 +415,10 @@ if (!isSameMemberWhenErased(dest, impl, impl_erasure)) return true; - // If the erasure of the return type is different, a - // bridge is needed. - return !types.isSameType(impl_erasure.getReturnType(), - method_erasure.getReturnType()); + /* Bottom line: A bridge is needed if the erasure of the implementation + is different from that of the method that it overrides. + */ + return !types.isSameType(impl_erasure, method_erasure); } else { // method and impl are the same... if ((method.flags() & ABSTRACT) != 0) { diff -r ab4c47485fb8 -r 0dea223af562 langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Thu Sep 29 16:45:12 2016 +0000 +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Thu Sep 29 17:24:10 2016 +0000 @@ -199,6 +199,7 @@ private boolean feedbackInitialized = false; private String commandLineFeedbackMode = null; private List remoteVMOptions = new ArrayList<>(); + private List compilerOptions = new ArrayList<>(); SourceCodeAnalysis analysis; JShell state = null; @@ -558,9 +559,14 @@ parser.accepts("s"); parser.accepts("v"); OptionSpec r = parser.accepts("R").withRequiredArg(); + OptionSpec c = parser.accepts("C").withRequiredArg(); parser.acceptsAll(asList("h", "help")); parser.accepts("version"); parser.accepts("full-version"); + + parser.accepts("X"); + OptionSpec addExports = parser.accepts("add-exports").withRequiredArg(); + NonOptionArgumentSpec loadFileSpec = parser.nonOptions(); OptionSet options; @@ -585,6 +591,10 @@ printUsage(); return null; } + if (options.has("X")) { + printUsageX(); + return null; + } if (options.has("version")) { cmdout.printf("jshell %s\n", version()); return null; @@ -630,7 +640,19 @@ commandLineFeedbackMode = "verbose"; } if (options.has(r)) { - remoteVMOptions = options.valuesOf(r); + remoteVMOptions.addAll(options.valuesOf(r)); + } + if (options.has(c)) { + compilerOptions.addAll(options.valuesOf(c)); + } + + if (options.has(addExports)) { + List exports = options.valuesOf(addExports).stream() + .map(mp -> mp + "=ALL-UNNAMED") + .flatMap(mp -> Stream.of("--add-exports", mp)) + .collect(toList()); + remoteVMOptions.addAll(exports); + compilerOptions.addAll(exports); } return options.valuesOf(loadFileSpec); @@ -640,6 +662,10 @@ cmdout.print(getResourceString("help.usage")); } + private void printUsageX() { + cmdout.print(getResourceString("help.usage.x")); + } + /** * Message handler to use during initial start-up. */ @@ -683,7 +709,8 @@ .idGenerator((sn, i) -> (currentNameSpace == startNamespace || state.status(sn).isActive()) ? currentNameSpace.tid(sn) : errorNamespace.tid(sn)) - .remoteVMOptions(remoteVMOptions.toArray(new String[remoteVMOptions.size()])) + .remoteVMOptions(remoteVMOptions.stream().toArray(String[]::new)) + .compilerOptions(compilerOptions.stream().toArray(String[]::new)) .build(); shutdownSubscription = state.onShutdown((JShell deadState) -> { if (deadState == state) { diff -r ab4c47485fb8 -r 0dea223af562 langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties Thu Sep 29 16:45:12 2016 +0000 +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties Thu Sep 29 17:24:10 2016 +0000 @@ -164,8 +164,15 @@ \ Use one -J for each runtime flag or flag argument\n\ \ -R Pass to the remote runtime system.\n\ \ Use one -R for each remote flag or flag argument\n\ +\ -C Pass to the compiler.\n\ +\ Use one -C for each compiler flag or flag argument\n\ \ --help Print this synopsis of standard options\n\ -\ --version Version information\n +\ --version Version information\n\ +\ -X Print help on non-standard options\n +help.usage.x = \ +\ --add-exports / Export specified module-private package to snippets\n\ +\ \n\ +\These options are non-standard and subject to change without notice.\n help.list.summary = list the source you have typed help.list.args = [|-all|-start] diff -r ab4c47485fb8 -r 0dea223af562 langtools/test/jdk/jshell/HistoryTest.java --- a/langtools/test/jdk/jshell/HistoryTest.java Thu Sep 29 16:45:12 2016 +0000 +++ b/langtools/test/jdk/jshell/HistoryTest.java Thu Sep 29 17:24:10 2016 +0000 @@ -23,6 +23,7 @@ /* * @test + * @bug 8166744 * @summary Test Completion * @modules jdk.internal.le/jdk.internal.jline.extra * jdk.jshell/jdk.internal.jshell.tool @@ -75,6 +76,44 @@ }); } + public void test8166744() { + test( + a -> {if (!a) setCommandInput("class C {\n");}, + a -> {if (!a) setCommandInput("void f() {\n");}, + a -> {if (!a) setCommandInput("}\n");}, + a -> {assertCommand(a, "}", "| created class C");}, + a -> { + if (!a) { + try { + previousAndAssert(getHistory(), "}"); + previousAndAssert(getHistory(), "}"); + previousAndAssert(getHistory(), "void f() {"); + previousAndAssert(getHistory(), "class C {"); + getHistory().add("class C{"); + } catch (Exception ex) { + throw new IllegalStateException(ex); + } + } + assertCommand(a, "int dummy;", "dummy ==> 0"); + }); + test( + a -> {if (!a) setCommandInput("class C {\n");}, + a -> {if (!a) setCommandInput("void f() {\n");}, + a -> {if (!a) setCommandInput("}\n");}, + a -> {assertCommand(a, "}", "| created class C");}, + a -> { + if (!a) { + try { + previousSnippetAndAssert(getHistory(), "class C {"); + getHistory().add("class C{"); + } catch (Exception ex) { + throw new IllegalStateException(ex); + } + } + assertCommand(a, "int dummy;", "dummy ==> 0"); + }); + } + private EditingHistory getHistory() throws Exception { Field input = repl.getClass().getDeclaredField("input"); input.setAccessible(true); diff -r ab4c47485fb8 -r 0dea223af562 langtools/test/jdk/jshell/ToolBasicTest.java --- a/langtools/test/jdk/jshell/ToolBasicTest.java Thu Sep 29 16:45:12 2016 +0000 +++ b/langtools/test/jdk/jshell/ToolBasicTest.java Thu Sep 29 17:24:10 2016 +0000 @@ -23,7 +23,7 @@ /* * @test - * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953 8080347 + * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953 8080347 8154714 * @summary Tests for Basic tests for REPL tool * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -574,4 +574,20 @@ } } + public void testAddExports() { + test(false, new String[]{"--no-startup"}, + a -> assertCommandOutputStartsWith(a, "import jdk.internal.misc.VM;", "| Error:") + ); + test(false, new String[]{"--no-startup", + "-R--add-exports", "-Rjava.base/jdk.internal.misc=ALL-UNNAMED", + "-C--add-exports", "-Cjava.base/jdk.internal.misc=ALL-UNNAMED"}, + a -> assertImport(a, "import jdk.internal.misc.VM;", "", "jdk.internal.misc.VM"), + a -> assertCommand(a, "System.err.println(VM.isBooted())", "", "", null, "", "true\n") + ); + test(false, new String[]{"--no-startup", "--add-exports", "java.base/jdk.internal.misc"}, + a -> assertImport(a, "import jdk.internal.misc.VM;", "", "jdk.internal.misc.VM"), + a -> assertCommand(a, "System.err.println(VM.isBooted())", "", "", null, "", "true\n") + ); + } + } diff -r ab4c47485fb8 -r 0dea223af562 langtools/test/tools/javac/generics/bridges/ReorderedBoundsTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/bridges/ReorderedBoundsTest.java Thu Sep 29 17:24:10 2016 +0000 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8166363 + * @summary Method with reordered type parameter bounds compiles with Override annotation but does not actually override superclass method. + * @run main ReorderedBoundsTest + */ + +import java.io.Serializable; + +public class ReorderedBoundsTest { + public static class Parent { + public String printClassName(T t) { + return "Parent"; + } + } + + public static class OrderedChild extends Parent { + @Override + public String printClassName(T t) { + return "OrderedChild"; + } + } + + public static class ReorderedChild extends Parent { + @Override + public String printClassName(T t) { + return "ReorderedChild"; + } + } + + public static void main(String[] args) { + + String s; + Parent p = new OrderedChild(); + if (!(s = p.printClassName(new StringBuilder())).equals("OrderedChild")) + throw new AssertionError("Bad output: " + s); + + p = new ReorderedChild(); + if (!(s = p.printClassName(new StringBuilder())).equals("ReorderedChild")) + throw new AssertionError("Bad output: " + s); + } +} \ No newline at end of file