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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+3
-4
@@ -16,15 +16,14 @@
|
||||
|
||||
package org.jetbrains.kotlin.codegen
|
||||
|
||||
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
|
||||
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoot
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
import org.jetbrains.kotlin.test.ConfigurationKind
|
||||
import java.io.File
|
||||
|
||||
abstract class AbstractBlackBoxAgainstJavaCodegenTest : AbstractBlackBoxCodegenTest() {
|
||||
private lateinit var javaOutputDir: File
|
||||
override fun doMultiFileTest(wholeFile: File, files: MutableList<TestFile>, javaFilesDir: File?) {
|
||||
javaOutputDir = javaFilesDir!!.let { directory ->
|
||||
javaClassesOutputDirectory = javaFilesDir!!.let { directory ->
|
||||
CodegenTestUtil.compileJava(findJavaSourcesInDirectory(directory), emptyList(), extractJavacOptions(files))
|
||||
}
|
||||
|
||||
@@ -32,7 +31,7 @@ abstract class AbstractBlackBoxAgainstJavaCodegenTest : AbstractBlackBoxCodegenT
|
||||
}
|
||||
|
||||
override fun updateConfiguration(configuration: CompilerConfiguration) {
|
||||
configuration.addJvmClasspathRoots(listOf(javaOutputDir))
|
||||
configuration.addJvmClasspathRoot(javaClassesOutputDirectory)
|
||||
}
|
||||
|
||||
override fun extractConfigurationKind(files: MutableList<TestFile>): ConfigurationKind {
|
||||
|
||||
@@ -47,7 +47,8 @@ public class GenerateNotNullAssertionsTest extends CodegenTestCase {
|
||||
return "notNullAssertions";
|
||||
}
|
||||
|
||||
private void setUpEnvironment(boolean disableCallAssertions, boolean disableParamAssertions, File... extraClassPath) {
|
||||
private void setUpEnvironment(boolean disableCallAssertions, boolean disableParamAssertions) {
|
||||
File[] extraClassPath = javaClassesOutputDirectory != null ? new File[] {javaClassesOutputDirectory} : new File[0];
|
||||
CompilerConfiguration configuration =
|
||||
KotlinTestUtils.newConfiguration(ConfigurationKind.JDK_ONLY, TestJdkKind.MOCK_JDK, extraClassPath);
|
||||
|
||||
@@ -62,9 +63,8 @@ public class GenerateNotNullAssertionsTest extends CodegenTestCase {
|
||||
loadFileByFullPath(KotlinTestUtils.getTestDataPathBase() + "/codegen/" + getPrefix() + "/" + fileName);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private File compileJava0(@NotNull String fileName) {
|
||||
return CodegenTestUtil.compileJava(
|
||||
private void compileJava(@NotNull String fileName) {
|
||||
javaClassesOutputDirectory = CodegenTestUtil.compileJava(
|
||||
Collections.singletonList(KotlinTestUtils.getTestDataPathBase() + "/codegen/" + getPrefix() + "/" + fileName),
|
||||
Collections.emptyList(),
|
||||
Collections.emptyList()
|
||||
@@ -72,8 +72,8 @@ public class GenerateNotNullAssertionsTest extends CodegenTestCase {
|
||||
}
|
||||
|
||||
private void doTestCallAssertions(boolean disableCallAssertions) throws Exception {
|
||||
File javaOut = compileJava0("A.java");
|
||||
setUpEnvironment(disableCallAssertions, true, javaOut);
|
||||
compileJava("A.java");
|
||||
setUpEnvironment(disableCallAssertions, true);
|
||||
|
||||
loadSource("AssertionChecker.kt");
|
||||
generateFunction("checkAssertions").invoke(null, !disableCallAssertions);
|
||||
@@ -99,18 +99,18 @@ public class GenerateNotNullAssertionsTest extends CodegenTestCase {
|
||||
setUpEnvironment(false, true);
|
||||
loadSource("noAssertionsForKotlin.kt");
|
||||
OutputFileCollection outputFiles = generateClassesInFile();
|
||||
File compiledDirectory = new File(FileUtil.getTempDirectory(), "kotlin-classes");
|
||||
OutputUtilsKt.writeAllTo(outputFiles, compiledDirectory);
|
||||
javaClassesOutputDirectory = new File(FileUtil.getTempDirectory(), "kotlin-classes");
|
||||
OutputUtilsKt.writeAllTo(outputFiles, javaClassesOutputDirectory);
|
||||
|
||||
setUpEnvironment(false, true, compiledDirectory);
|
||||
setUpEnvironment(false, true);
|
||||
loadSource("noAssertionsForKotlinMain.kt");
|
||||
|
||||
assertNoIntrinsicsMethodIsCalledInMyClasses(false);
|
||||
}
|
||||
|
||||
public void testGenerateParamAssertions() throws Exception {
|
||||
File javaOut = compileJava0("doGenerateParamAssertions.java");
|
||||
setUpEnvironment(true, false, javaOut);
|
||||
compileJava("doGenerateParamAssertions.java");
|
||||
setUpEnvironment(true, false);
|
||||
|
||||
loadSource("doGenerateParamAssertions.kt");
|
||||
generateFunction().invoke(null);
|
||||
@@ -143,8 +143,8 @@ public class GenerateNotNullAssertionsTest extends CodegenTestCase {
|
||||
}
|
||||
|
||||
public void testJavaMultipleSubstitutions() {
|
||||
File javaOut = compileJava0("javaMultipleSubstitutions.java");
|
||||
setUpEnvironment(false, false, javaOut);
|
||||
compileJava("javaMultipleSubstitutions.java");
|
||||
setUpEnvironment(false, false);
|
||||
|
||||
loadSource("javaMultipleSubstitutions.kt");
|
||||
String text = generateToText();
|
||||
|
||||
+7
-1
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.android.synthetic.test
|
||||
import com.intellij.openapi.util.io.FileUtil
|
||||
import com.intellij.util.ArrayUtil
|
||||
import com.intellij.util.Processor
|
||||
import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots
|
||||
import org.jetbrains.kotlin.codegen.AbstractBlackBoxCodegenTest
|
||||
import org.jetbrains.kotlin.codegen.CodegenTestFiles
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
@@ -26,6 +27,7 @@ import org.jetbrains.kotlin.test.ConfigurationKind
|
||||
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||
import org.jetbrains.kotlin.test.TestJdkKind
|
||||
import java.io.File
|
||||
import java.net.URL
|
||||
import java.util.*
|
||||
import java.util.regex.Pattern
|
||||
|
||||
@@ -56,6 +58,10 @@ abstract class AbstractAndroidBoxTest : AbstractBlackBoxCodegenTest() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun getClassPathURLs(): Array<URL> {
|
||||
return myEnvironment.configuration.jvmClasspathRoots.map { it.toURI().toURL() }.toTypedArray()
|
||||
}
|
||||
|
||||
private fun getFakeFiles(path: String): Collection<String> {
|
||||
return FileUtil.findFilesByMask(Pattern.compile("^Fake.*\\.kt$"), File(path.replace(getTestName(true), ""))).map { relativePath(it) }
|
||||
}
|
||||
@@ -102,4 +108,4 @@ abstract class AbstractAndroidBoxTest : AbstractBlackBoxCodegenTest() {
|
||||
)
|
||||
blackBox()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user