diff options
author | Sasha Smundak <asmundak@google.com> | 2022-08-16 20:25:10 -0700 |
---|---|---|
committer | Sasha Smundak <asmundak@google.com> | 2022-08-16 20:25:10 -0700 |
commit | ec3c03c56ef345b4dc379d6d6f8913cfd1d78e3d (patch) | |
tree | e00ec0860e7283d074f74757dcb3f631196c753d | |
parent | 8a2bb4d4c8d9d122fe6e2e3373bca43f8a9a45a7 (diff) | |
download | kythe-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.java | 23 | ||||
-rw-r--r-- | kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java | 24 |
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); |