From 71ba8e3ad0f485d2cfe9f3b8159af8b284af6456 Mon Sep 17 00:00:00 2001 From: baratynskiy Date: Fri, 5 May 2017 16:30:01 +0300 Subject: [PATCH] Add tools.jar for command line compiler if -Xuse-javac is specified --- .../kotlin/preloading/Preloader.java | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/compiler/preloader/src/org/jetbrains/kotlin/preloading/Preloader.java b/compiler/preloader/src/org/jetbrains/kotlin/preloading/Preloader.java index a3f2047034a..e83a18b5e2c 100644 --- a/compiler/preloader/src/org/jetbrains/kotlin/preloading/Preloader.java +++ b/compiler/preloader/src/org/jetbrains/kotlin/preloading/Preloader.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.preloading; import org.jetbrains.kotlin.preloading.instrumentation.Instrumenter; import java.io.File; +import java.io.IOException; import java.io.PrintStream; import java.lang.reflect.Method; import java.net.MalformedURLException; @@ -74,6 +75,13 @@ public class Preloader { ClassLoader parent = Preloader.class.getClassLoader(); List instrumenters = options.instrumenters; + if (options.arguments.contains("-Xuse-javac")) { + File toolsJar = getJdkToolsJar(); + if (toolsJar != null) { + instrumenters.add(toolsJar); + } + } + if (instrumenters.isEmpty()) return parent; URL[] classpath = new URL[instrumenters.size()]; @@ -84,11 +92,35 @@ public class Preloader { return new URLClassLoader(classpath, parent); } + private static File getJdkToolsJar() { + try { + String javaHomePath = System.getProperty("java.home"); + if (javaHomePath == null || javaHomePath.isEmpty()) { + return null; + } + File javaHome = new File(javaHomePath); + File toolsJar = new File(javaHome, "lib/tools.jar"); + if (toolsJar.exists()) { + return toolsJar.getCanonicalFile(); + } + + // We might be inside jre. + if (javaHome.getName().equals("jre")) { + toolsJar = new File(javaHome.getParent(), "lib/tools.jar"); + if (toolsJar.exists()) { + return toolsJar.getCanonicalFile(); + } + } + } catch (IOException ignored) {} + + return null; + } + @SuppressWarnings("AssignmentToForLoopParameter") private static Options parseOptions(String[] args) throws Exception { List classpath = Collections.emptyList(); boolean measure = false; - List instrumenters = Collections.emptyList(); + List instrumenters = new ArrayList<>(); int estimate = DEFAULT_CLASS_NUMBER_ESTIMATE; String mainClass = null; List arguments = new ArrayList<>(); -- GitLab