diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithJava.java b/compiler/tests/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithJava.java index 22ea1cf077a..ce03708e236 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithJava.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithJava.java @@ -54,6 +54,7 @@ public abstract class KotlinMultiFileTestWithJava extends KotlinTestWithEn @Override protected KotlinCoreEnvironment createEnvironment() throws Exception { + // TODO: do not create temporary directory for tests without Java sources javaFilesDir = KotlinTestUtils.tmpDir("java-files"); CompilerConfiguration configuration = KotlinTestUtils.compilerConfigurationForTests( getConfigurationKind(), @@ -93,11 +94,6 @@ public abstract class KotlinMultiFileTestWithJava extends KotlinTestWithEn return false; } - @NotNull - protected final File getJavaFilesDir() { - return javaFilesDir; - } - protected void doTest(String filePath) throws Exception { File file = new File(filePath); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxCodegenTest.java b/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxCodegenTest.java index e2b81c5b4ae..ca7df16de27 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxCodegenTest.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxCodegenTest.java @@ -45,16 +45,15 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Map; import static org.jetbrains.kotlin.codegen.CodegenTestUtil.compileJava; public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase { @Override - protected void doMultiFileTest(File file, Map modules, List files) throws Exception { + protected void doMultiFileTest(@NotNull File wholeFile, @NotNull List files, @Nullable File javaFilesDir) throws Exception { if (files.size() == 1) { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); - blackBoxFileByFullPath(file.getPath()); + blackBoxFileByFullPath(wholeFile.getPath()); } else { doTestMultiFile(files); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxInlineCodegenTest.kt b/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxInlineCodegenTest.kt index f3acec9cfb7..35cf2a652a9 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxInlineCodegenTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxInlineCodegenTest.kt @@ -16,14 +16,11 @@ package org.jetbrains.kotlin.codegen -import org.jetbrains.kotlin.checkers.KotlinMultiFileTestWithJava import org.jetbrains.kotlin.test.ConfigurationKind import java.io.File abstract class AbstractBlackBoxInlineCodegenTest : AbstractBlackBoxCodegenTest() { - override fun doMultiFileTest( - file: File, modules: Map.ModuleAndDependencies>, files: List - ) { + override fun doMultiFileTest(file: File, files: List, javaFilesDir: File?) { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.ALL) loadMultiFiles(files) blackBox() diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBytecodeTextTest.java b/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBytecodeTextTest.java index c80319b57c1..45f31b402f5 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBytecodeTextTest.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/AbstractBytecodeTextTest.java @@ -20,6 +20,7 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import kotlin.text.Charsets; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.test.ConfigurationKind; import org.jetbrains.kotlin.utils.ExceptionUtilsKt; @@ -36,15 +37,15 @@ public abstract class AbstractBytecodeTextTest extends CodegenTestCase { private static final Pattern EXPECTED_OCCURRENCES_PATTERN = Pattern.compile("^\\s*//\\s*(\\d+)\\s*(.*)$"); @Override - protected void doMultiFileTest(File file, Map modules, List files) throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.ALL, getJavaFilesDir()); + protected void doMultiFileTest(@NotNull File wholeFile, @NotNull List files, @Nullable File javaFilesDir) throws Exception { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.ALL, javaFilesDir); loadMultiFiles(files); if (isMultiFileTest(files)) { doTestMultiFile(files); } else { - List expected = readExpectedOccurrences(file.getPath()); + List expected = readExpectedOccurrences(wholeFile.getPath()); String actual = generateToText(); checkGeneratedTextAgainstExpectedOccurrences(actual, expected); } diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstInlineKotlinTest.kt b/compiler/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstInlineKotlinTest.kt index 9621edcc3dc..54ca8e63883 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstInlineKotlinTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstInlineKotlinTest.kt @@ -16,14 +16,11 @@ package org.jetbrains.kotlin.codegen -import org.jetbrains.kotlin.checkers.KotlinMultiFileTestWithJava import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import java.io.File abstract class AbstractCompileKotlinAgainstInlineKotlinTest : AbstractCompileKotlinAgainstKotlinTest() { - override fun doMultiFileTest( - file: File, modules: Map.ModuleAndDependencies>, files: List - ) { + override fun doMultiFileTest(wholeFile: File, files: List, javaFilesDir: File?) { val kotlinFiles = files.filter { it.name.endsWith(".kt") } assert(kotlinFiles.size == 2) { "There should be exactly two files in this test" } diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstKotlinTest.java b/compiler/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstKotlinTest.java index 45e912542f1..f43b1144c58 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstKotlinTest.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstKotlinTest.java @@ -20,6 +20,7 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.util.Disposer; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.cli.common.modules.ModuleBuilder; import org.jetbrains.kotlin.cli.common.output.outputUtils.OutputUtilsKt; import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; @@ -39,7 +40,6 @@ import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.List; -import java.util.Map; public abstract class AbstractCompileKotlinAgainstKotlinTest extends CodegenTestCase { private File tmpdir; @@ -57,7 +57,7 @@ public abstract class AbstractCompileKotlinAgainstKotlinTest extends CodegenTest } @Override - protected void doMultiFileTest(File file, Map modules, List files) throws Exception { + protected void doMultiFileTest(@NotNull File wholeFile, @NotNull List files, @Nullable File javaFilesDir) throws Exception { // Note that it may be beneficial to improve this test to handle many files, compiling them successively against all previous assert files.size() == 2 : "There should be exactly two files in this test"; TestFile fileA = files.get(0); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java b/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java index f66e549fbe2..734d45ef811 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java @@ -17,14 +17,17 @@ package org.jetbrains.kotlin.codegen; import com.google.common.collect.Lists; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.io.FileUtil; import com.intellij.testFramework.TestDataFile; -import com.intellij.util.SmartList; +import com.intellij.testFramework.UsefulTestCase; +import kotlin.collections.ArraysKt; +import kotlin.io.FilesKt; import kotlin.text.Charsets; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.backend.common.output.OutputFile; import org.jetbrains.kotlin.checkers.CheckerTestUtil; -import org.jetbrains.kotlin.checkers.KotlinMultiFileTestWithJava; import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.cli.jvm.config.JvmContentRootsKt; @@ -63,7 +66,7 @@ import static org.jetbrains.kotlin.codegen.CodegenTestUtil.*; import static org.jetbrains.kotlin.test.KotlinTestUtils.compilerConfigurationForTests; import static org.jetbrains.kotlin.test.KotlinTestUtils.getAnnotationsJar; -public abstract class CodegenTestCase extends KotlinMultiFileTestWithJava { +public abstract class CodegenTestCase extends UsefulTestCase { private static final String DEFAULT_TEST_FILE_NAME = "a_test"; protected KotlinCoreEnvironment myEnvironment; @@ -72,19 +75,22 @@ public abstract class CodegenTestCase extends KotlinMultiFileTestWithJava(javaSourceRoot)); + CompilerConfiguration configuration = compilerConfigurationForTests( + configurationKind, TestJdkKind.MOCK_JDK, Collections.singletonList(getAnnotationsJar()), + ArraysKt.filterNotNull(javaSourceRoots) + ); myEnvironment = KotlinCoreEnvironment.createForTests( - getTestRootDisposable(), - configuration, - EnvironmentConfigFiles.JVM_CONFIG_FILES); + getTestRootDisposable(), configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES + ); } @Override @@ -373,19 +379,42 @@ public abstract class CodegenTestCase extends KotlinMultiFileTestWithJava javaFilesDir = Ref.create(); + + List testFiles = + KotlinTestUtils.createTestFiles(file.getName(), expectedText, new KotlinTestUtils.TestFileFactoryNoModules() { + @NotNull + @Override + public TestFile create(@NotNull String fileName, @NotNull String text, @NotNull Map directives) { + if (fileName.endsWith(".java")) { + if (javaFilesDir.isNull()) { + try { + javaFilesDir.set(KotlinTestUtils.tmpDir("java-files")); + } + catch (IOException e) { + throw ExceptionUtilsKt.rethrow(e); + } + } + writeSourceFile(fileName, text, javaFilesDir.get()); + } + + return new TestFile(fileName, text); + } + + private void writeSourceFile(@NotNull String fileName, @NotNull String content, @NotNull File targetDir) { + File file = new File(targetDir, fileName); + KotlinTestUtils.mkdirs(file.getParentFile()); + FilesKt.writeText(file, content, Charsets.UTF_8); + } + }); + + doMultiFileTest(file, testFiles, javaFilesDir.get()); } - @Override - protected TestFile createTestFile(Void module, String fileName, String text, Map directives) { - return new TestFile(fileName, text); - } - - @Override - protected void doMultiFileTest(File file, Map modules, List files) throws Exception { + protected void doMultiFileTest(@NotNull File wholeFile, @NotNull List files, @Nullable File javaFilesDir) throws Exception { throw new UnsupportedOperationException("Multi-file test cases are not supported in this test"); } }