summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSasha Smundak <asmundak@google.com>2022-08-16 20:25:10 -0700
committerSasha Smundak <asmundak@google.com>2022-08-16 20:25:10 -0700
commitec3c03c56ef345b4dc379d6d6f8913cfd1d78e3d (patch)
treee00ec0860e7283d074f74757dcb3f631196c753d
parent8a2bb4d4c8d9d122fe6e2e3373bca43f8a9a45a7 (diff)
downloadkythe-ec3c03c56ef345b4dc379d6d6f8913cfd1d78e3d.tar.gz
Accommodate JDK17
The signatures of com.sun.tools.javac.main.CommandLine.parse and com.sun.tools.javac.main.Arguments.init methods changed between JDK14 and JDK17, call these methods via reflection to accomodadte both. Bug: 240421813 Test: build java extractor and use it Change-Id: I5db0a22bf9f837826f234e228f9652d422d94f20
-rw-r--r--kythe/java/com/google/devtools/kythe/extractors/java/standalone/AbstractJavacWrapper.java23
-rw-r--r--kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java24
2 files changed, 45 insertions, 2 deletions
diff --git a/kythe/java/com/google/devtools/kythe/extractors/java/standalone/AbstractJavacWrapper.java b/kythe/java/com/google/devtools/kythe/extractors/java/standalone/AbstractJavacWrapper.java
index 189ebe990..0c883ac6d 100644
--- a/kythe/java/com/google/devtools/kythe/extractors/java/standalone/AbstractJavacWrapper.java
+++ b/kythe/java/com/google/devtools/kythe/extractors/java/standalone/AbstractJavacWrapper.java
@@ -34,6 +34,8 @@ import com.google.devtools.kythe.util.JsonUtil;
import com.sun.tools.javac.main.CommandLine;
import java.io.File;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -148,7 +150,26 @@ public abstract class AbstractJavacWrapper {
private static String[] getCleanedUpArguments(String[] args) throws IOException {
// Expand all @file arguments
- List<String> expandedArgs = Lists.newArrayList(CommandLine.parse(args));
+ // JDK changed the signature of the CommandLine.parse method in JDK15,
+ // support both versions
+ List<String> expandedArgs = null;
+ try {
+ try {
+ // JDK15+: the signature is
+ // List<String> parse(List<String> args);
+ expandedArgs = (List<String>)CommandLine.class.getMethod("parse", List.class).invoke(null, (Object)Arrays.asList(args));
+ } catch (NoSuchMethodException nsme) {
+ // pre-JDK15:
+ // String[] parse(String[]);
+ expandedArgs = Arrays.asList((String[])CommandLine.class.getMethod("parse", String[].class).invoke(null, (Object)args));
+ }
+ } catch (NoSuchMethodException ns2) {
+ System.err.printf("Cannot locate com.sun.tools.javac.main.CommandLine.parse method, JDK version %s\n", System.getProperty("java.version"));
+ System.exit(2);
+ } catch (InvocationTargetException|IllegalAccessException ex) {
+ System.err.printf("Cannot call com.sun.tools.javac.main.CommandLine.parse (JDK version %s):\n%s\n", System.getProperty("java.version"), ex);
+ System.exit(2);
+ }
// We skip some arguments that would normally be passed to javac:
// -J, these are flags to the java environment running javac.
diff --git a/kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java b/kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java
index 1394f4e5a..31bc66a7b 100644
--- a/kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java
+++ b/kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java
@@ -28,6 +28,8 @@ import com.sun.tools.javac.main.Option;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.Options;
import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumSet;
@@ -46,7 +48,27 @@ public class Javac9Wrapper extends AbstractJavacWrapper {
JavacFileManager fileManager = new JavacFileManager(context, true, null);
Arguments args = Arguments.instance(context);
- args.init("kythe_javac", arguments);
+ // JDK changed the signature of Arguments.init method, support both
+ try {
+ try {
+ // JDK15+: the signature is
+ // init(String, Iterable<String> args);
+ Arguments.class.getMethod("init", String.class, Iterable.class)
+ .invoke(args, "kythe_javac", (Object) Arrays.asList(arguments));
+ } catch (NoSuchMethodException nsme) {
+ // pre-JDK15:
+ // init(String, String...);
+ Arguments.class.getMethod("init", String.class,String[].class)
+ .invoke(args, "kythe_javac", (Object)arguments);
+ }
+ } catch (NoSuchMethodException ns2) {
+ System.err.printf("Cannot locate com.sun.tools.javac.main.Arguments.init method, JDK version %s\n", System.getProperty("java.version"));
+ System.exit(2);
+ } catch (InvocationTargetException|IllegalAccessException ex) {
+ System.err.printf("Cannot call com.sun.tools.javac.main.Arguments.init (JDK version %s):\n%s\n", System.getProperty("java.version"), ex);
+ System.exit(2);
+ }
+
fileManager.handleOptions(args.getDeferredFileManagerOptions());
Options options = Options.instance(context);