Reduce classpath for class loader in CodegenTestCase

There's no point in adding JDK (mock or full) roots to it, as well as
stdlib/reflect/test (they are loaded by the parent class loader, created
in ForTestCompileRuntime)
This commit is contained in:
Alexander Udalov
2017-07-11 13:08:28 +03:00
parent 743278d456
commit c9b14c5a45
5 changed files with 50 additions and 37 deletions
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.codegen;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Ref;
@@ -37,17 +36,17 @@ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys;
import org.jetbrains.kotlin.cli.common.output.outputUtils.OutputUtilsKt;
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles;
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
import org.jetbrains.kotlin.cli.jvm.config.JvmContentRootsKt;
import org.jetbrains.kotlin.test.clientserver.TestProxy;
import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime;
import org.jetbrains.kotlin.config.*;
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.script.KotlinScriptExternalImportsProvider;
import org.jetbrains.kotlin.test.ConfigurationKind;
import org.jetbrains.kotlin.test.InTextDirectivesUtils;
import org.jetbrains.kotlin.test.KotlinTestUtils;
import org.jetbrains.kotlin.test.TestJdkKind;
import org.jetbrains.kotlin.test.clientserver.TestProxy;
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase;
import org.jetbrains.kotlin.utils.ExceptionUtilsKt;
import org.jetbrains.org.objectweb.asm.ClassReader;
@@ -84,14 +83,15 @@ import static org.jetbrains.kotlin.test.KotlinTestUtils.getAnnotationsJar;
public abstract class CodegenTestCase extends KtUsefulTestCase {
private static final String DEFAULT_TEST_FILE_NAME = "a_test";
public static final String DEFAULT_JVM_TARGET_FOR_TEST = "kotlin.test.default.jvm.target";
public static final String JAVA_COMPILATION_TARGET = "kotlin.test.java.compilation.target";
private static final String DEFAULT_JVM_TARGET_FOR_TEST = "kotlin.test.default.jvm.target";
private static final String JAVA_COMPILATION_TARGET = "kotlin.test.java.compilation.target";
public static final String RUN_BOX_TEST_IN_SEPARATE_PROCESS_PORT = "kotlin.test.box.in.separate.process.port";
protected KotlinCoreEnvironment myEnvironment;
protected CodegenTestFiles myFiles;
protected ClassFileFactory classFileFactory;
protected GeneratedClassLoader initializedClassLoader;
protected File javaClassesOutputDirectory = null;
protected ConfigurationKind configurationKind = ConfigurationKind.JDK_ONLY;
private final String defaultJvmTarget = System.getProperty(DEFAULT_JVM_TARGET_FOR_TEST);
@@ -355,18 +355,28 @@ public abstract class CodegenTestCase extends KtUsefulTestCase {
}
@NotNull
private URL[] getClassPathURLs() {
List<URL> urls = Lists.newArrayList();
for (File file : JvmContentRootsKt.getJvmClasspathRoots(myEnvironment.getConfiguration())) {
try {
urls.add(file.toURI().toURL());
}
catch (MalformedURLException e) {
throw new RuntimeException(e);
}
protected URL[] getClassPathURLs() {
List<File> files = new ArrayList<>();
if (javaClassesOutputDirectory != null) {
files.add(javaClassesOutputDirectory);
}
return urls.toArray(new URL[urls.size()]);
KotlinScriptExternalImportsProvider externalImportsProvider =
KotlinScriptExternalImportsProvider.Companion.getInstance(myEnvironment.getProject());
if (externalImportsProvider != null) {
files.addAll(externalImportsProvider.getCombinedClasspathFor(myEnvironment.getSourceFiles()));
}
try {
URL[] result = new URL[files.size()];
for (int i = 0; i < files.size(); i++) {
result[i] = files.get(i).toURI().toURL();
}
return result;
}
catch (MalformedURLException e) {
throw ExceptionUtilsKt.rethrow(e);
}
}
@NotNull
@@ -565,11 +575,9 @@ public abstract class CodegenTestCase extends KtUsefulTestCase {
OutputUtilsKt.writeAllTo(classFileFactory, kotlinOut);
File output = CodegenTestUtil.compileJava(
javaClassesOutputDirectory = CodegenTestUtil.compileJava(
findJavaSourcesInDirectory(javaSourceDir), Collections.singletonList(kotlinOut.getPath()), javacOptions
);
// Add javac output to classpath so that the created class loader can find generated Java classes
JvmContentRootsKt.addJvmClasspathRoot(configuration, output);
}
}
@@ -100,7 +100,7 @@ public class ForTestCompileRuntime {
public static synchronized ClassLoader runtimeJarClassLoader() {
ClassLoader loader = runtimeJarClassLoader.get();
if (loader == null) {
loader = createClassLoader(runtimeJarForTests(), scriptRuntimeJarForTests());
loader = createClassLoader(runtimeJarForTests(), scriptRuntimeJarForTests(), kotlinTestJarForTests());
runtimeJarClassLoader = new SoftReference<>(loader);
}
return loader;