Merge
authorlana
Thu, 29 Sep 2016 17:24:10 +0000
changeset 41250 0dea223af562
parent 41246 ab4c47485fb8 (current diff)
parent 41249 8c2aab77c2d2 (diff)
child 41251 6112540cd0c1
Merge
--- 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) {
--- 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<String> remoteVMOptions = new ArrayList<>();
+    private List<String> compilerOptions = new ArrayList<>();
 
     SourceCodeAnalysis analysis;
     JShell state = null;
@@ -558,9 +559,14 @@
         parser.accepts("s");
         parser.accepts("v");
         OptionSpec<String> r = parser.accepts("R").withRequiredArg();
+        OptionSpec<String> c = parser.accepts("C").withRequiredArg();
         parser.acceptsAll(asList("h", "help"));
         parser.accepts("version");
         parser.accepts("full-version");
+
+        parser.accepts("X");
+        OptionSpec<String> addExports = parser.accepts("add-exports").withRequiredArg();
+
         NonOptionArgumentSpec<String> 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<String> 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) {
--- 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<flag>              Pass <flag> to the remote runtime system.\n\
 \                            Use one -R for each remote flag or flag argument\n\
+\    -C<flag>              Pass <flag> 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 <module>/<package>   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 = [<name or id>|-all|-start]
--- 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);
--- 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")
+        );
+    }
+
 }
--- /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 <T extends Appendable & Serializable> String printClassName(T t) {
+      return "Parent";
+    }
+  }
+
+  public static class OrderedChild extends Parent {
+    @Override
+    public <T extends Appendable & Serializable> String printClassName(T t) {
+      return "OrderedChild";
+    }
+  }
+
+  public static class ReorderedChild extends Parent {
+    @Override
+    public <T extends Serializable & Appendable> 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