From c9b14c5a453f9f302c374272078e4b0991b505f3 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 11 Jul 2017 13:08:28 +0300 Subject: [PATCH] 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) --- .../kotlin/codegen/CodegenTestCase.java | 44 +++++++++++-------- .../forTestCompile/ForTestCompileRuntime.java | 2 +- .../AbstractBlackBoxAgainstJavaCodegenTest.kt | 7 ++- .../GenerateNotNullAssertionsTest.java | 26 +++++------ .../synthetic/test/AbstractAndroidBoxTest.kt | 8 +++- 5 files changed, 50 insertions(+), 37 deletions(-) diff --git a/compiler/tests-common/org/jetbrains/kotlin/codegen/CodegenTestCase.java b/compiler/tests-common/org/jetbrains/kotlin/codegen/CodegenTestCase.java index 84b23bbb3ea..1009df95a98 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/codegen/CodegenTestCase.java +++ b/compiler/tests-common/org/jetbrains/kotlin/codegen/CodegenTestCase.java @@ -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 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 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); } } diff --git a/compiler/tests-common/org/jetbrains/kotlin/codegen/forTestCompile/ForTestCompileRuntime.java b/compiler/tests-common/org/jetbrains/kotlin/codegen/forTestCompile/ForTestCompileRuntime.java index 1360acb963e..f0aaa84cb1a 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/codegen/forTestCompile/ForTestCompileRuntime.java +++ b/compiler/tests-common/org/jetbrains/kotlin/codegen/forTestCompile/ForTestCompileRuntime.java @@ -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; diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxAgainstJavaCodegenTest.kt b/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxAgainstJavaCodegenTest.kt index 3c302c6e6cc..6892b73b836 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxAgainstJavaCodegenTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxAgainstJavaCodegenTest.kt @@ -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, 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): ConfigurationKind { diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/GenerateNotNullAssertionsTest.java b/compiler/tests/org/jetbrains/kotlin/codegen/GenerateNotNullAssertionsTest.java index 8140bf106f0..9016267957d 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/GenerateNotNullAssertionsTest.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/GenerateNotNullAssertionsTest.java @@ -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(); diff --git a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/synthetic/test/AbstractAndroidBoxTest.kt b/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/synthetic/test/AbstractAndroidBoxTest.kt index 9c6c7ad13a7..9eae68ac946 100755 --- a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/synthetic/test/AbstractAndroidBoxTest.kt +++ b/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/synthetic/test/AbstractAndroidBoxTest.kt @@ -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 { + return myEnvironment.configuration.jvmClasspathRoots.map { it.toURI().toURL() }.toTypedArray() + } + private fun getFakeFiles(path: String): Collection { return FileUtil.findFilesByMask(Pattern.compile("^Fake.*\\.kt$"), File(path.replace(getTestName(true), ""))).map { relativePath(it) } } @@ -102,4 +108,4 @@ abstract class AbstractAndroidBoxTest : AbstractBlackBoxCodegenTest() { ) blackBox() } -} \ No newline at end of file +}