diff --git a/compiler/android-tests/tests/org/jetbrains/kotlin/android/tests/CodegenTestsOnAndroidGenerator.kt b/compiler/android-tests/tests/org/jetbrains/kotlin/android/tests/CodegenTestsOnAndroidGenerator.kt index bcb6443e111..271752dcb65 100644 --- a/compiler/android-tests/tests/org/jetbrains/kotlin/android/tests/CodegenTestsOnAndroidGenerator.kt +++ b/compiler/android-tests/tests/org/jetbrains/kotlin/android/tests/CodegenTestsOnAndroidGenerator.kt @@ -243,7 +243,7 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager expectedText, object : TestFiles.TestFileFactoryNoModules() { override fun create(fileName: String, text: String, directives: Map): TestFile { - return TestFile(fileName, text) + return TestFile(fileName, text, directives) } }, false, "kotlin.coroutines" diff --git a/compiler/testData/codegen/boxInline/assert/jvmAssertInlineFunctionAssertionsDisabled.kt b/compiler/testData/codegen/boxInline/assert/jvmAssertInlineFunctionAssertionsDisabled.kt index d723f73771d..90f80821001 100644 --- a/compiler/testData/codegen/boxInline/assert/jvmAssertInlineFunctionAssertionsDisabled.kt +++ b/compiler/testData/codegen/boxInline/assert/jvmAssertInlineFunctionAssertionsDisabled.kt @@ -1,5 +1,5 @@ -// FILE: inline.kt // KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm +// FILE: inline.kt // WITH_RUNTIME // FULL_JDK // TARGET_BACKEND: JVM @@ -11,7 +11,6 @@ inline fun inlineMe() { } // FILE: inlineSite.kt -// KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm import test.* diff --git a/compiler/testData/codegen/boxInline/assert/jvmAssertInlineFunctionAssertionsEnabled.kt b/compiler/testData/codegen/boxInline/assert/jvmAssertInlineFunctionAssertionsEnabled.kt index 88c506453a4..5a3c2e7cd52 100644 --- a/compiler/testData/codegen/boxInline/assert/jvmAssertInlineFunctionAssertionsEnabled.kt +++ b/compiler/testData/codegen/boxInline/assert/jvmAssertInlineFunctionAssertionsEnabled.kt @@ -11,7 +11,6 @@ inline fun inlineMe() { } // FILE: inlineSite.kt -// KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm import test.* diff --git a/compiler/testData/codegen/boxInline/assert/jvmAssertInlineLambda.kt b/compiler/testData/codegen/boxInline/assert/jvmAssertInlineLambda.kt index 3c5cd965972..236cc73f0d7 100644 --- a/compiler/testData/codegen/boxInline/assert/jvmAssertInlineLambda.kt +++ b/compiler/testData/codegen/boxInline/assert/jvmAssertInlineLambda.kt @@ -1,6 +1,6 @@ // TARGET_BACKEND: JVM -// FILE: inline.kt // KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm +// FILE: inline.kt // WITH_RUNTIME // NO_CHECK_LAMBDA_INLINING @@ -11,7 +11,6 @@ inline fun call(c: () -> Unit) { } // FILE: inlineSite.kt -// KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm import test.* diff --git a/compiler/testData/codegen/boxInline/assert/jvmClassInitializer.kt b/compiler/testData/codegen/boxInline/assert/jvmClassInitializer.kt index 484b4213f64..a8f683ca521 100644 --- a/compiler/testData/codegen/boxInline/assert/jvmClassInitializer.kt +++ b/compiler/testData/codegen/boxInline/assert/jvmClassInitializer.kt @@ -12,7 +12,6 @@ class A { } // FILE: inlineSite.kt -// KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm import test.* class B { diff --git a/compiler/testData/codegen/boxInline/assert/jvmCompanion.kt b/compiler/testData/codegen/boxInline/assert/jvmCompanion.kt index 666681aeffe..5a9cc78e9be 100644 --- a/compiler/testData/codegen/boxInline/assert/jvmCompanion.kt +++ b/compiler/testData/codegen/boxInline/assert/jvmCompanion.kt @@ -17,7 +17,6 @@ class State { } // FILE: inlineSite.kt -// KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm import test.* class CheckerJvmAssertInlineFunctionAssertionsEnabled { diff --git a/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambda.kt b/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambda.kt index 580a9e8626f..eaec865e991 100644 --- a/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambda.kt +++ b/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambda.kt @@ -1,6 +1,6 @@ // TARGET_BACKEND: JVM -// FILE: inline.kt // KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm +// FILE: inline.kt // WITH_RUNTIME // NO_CHECK_LAMBDA_INLINING @@ -14,7 +14,6 @@ object CrossinlineLambdaContainer { } // FILE: inlineSite.kt -// KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm import test.CrossinlineLambdaContainer.call diff --git a/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambda2.kt b/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambda2.kt index ad6b24bb068..a18624e0d19 100644 --- a/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambda2.kt +++ b/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambda2.kt @@ -1,6 +1,6 @@ // TARGET_BACKEND: JVM -// FILE: inline.kt // KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm +// FILE: inline.kt // WITH_RUNTIME // NO_CHECK_LAMBDA_INLINING @@ -17,7 +17,6 @@ object CrossinlineLambdaContainer { } // FILE: inlineSite.kt -// KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm import test.CrossinlineLambdaContainer.call diff --git a/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambdaDeclarationSite.kt b/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambdaDeclarationSite.kt index 503a113b98f..0433feeaea0 100644 --- a/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambdaDeclarationSite.kt +++ b/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambdaDeclarationSite.kt @@ -1,6 +1,6 @@ // TARGET_BACKEND: JVM -// FILE: inline.kt // KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm +// FILE: inline.kt // WITH_RUNTIME // NO_CHECK_LAMBDA_INLINING @@ -17,7 +17,6 @@ object CrossinlineLambdaContainer { } // FILE: inlineSite.kt -// KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm import test.CrossinlineLambdaContainer.call diff --git a/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambdaDeclarationSiteOnly.kt b/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambdaDeclarationSiteOnly.kt index 6823c055992..9c5503be500 100644 --- a/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambdaDeclarationSiteOnly.kt +++ b/compiler/testData/codegen/boxInline/assert/jvmCrossinlineLambdaDeclarationSiteOnly.kt @@ -14,7 +14,6 @@ object CrossinlineLambdaContainer { } // FILE: inlineSite.kt -// KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm import test.CrossinlineLambdaContainer.call diff --git a/compiler/testData/codegen/boxInline/assert/jvmCrossinlineSAMDeclarationSite.kt b/compiler/testData/codegen/boxInline/assert/jvmCrossinlineSAMDeclarationSite.kt index 08061538965..c1e7be54172 100644 --- a/compiler/testData/codegen/boxInline/assert/jvmCrossinlineSAMDeclarationSite.kt +++ b/compiler/testData/codegen/boxInline/assert/jvmCrossinlineSAMDeclarationSite.kt @@ -13,7 +13,6 @@ object CrossinlineLambdaContainer { } // FILE: inlineSite.kt -// KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm import test.CrossinlineLambdaContainer.call diff --git a/compiler/testData/codegen/boxInline/assert/jvmDoubleInline.kt b/compiler/testData/codegen/boxInline/assert/jvmDoubleInline.kt index 649e1f76645..76954785e4e 100644 --- a/compiler/testData/codegen/boxInline/assert/jvmDoubleInline.kt +++ b/compiler/testData/codegen/boxInline/assert/jvmDoubleInline.kt @@ -19,7 +19,6 @@ class B { } // FILE: inlineSite.kt -// KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm import test.* class Checker { diff --git a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/defaultCallInDefaultLambda.kt b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/defaultCallInDefaultLambda.kt index 42ce6e1de9d..d63787b9e0d 100644 --- a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/defaultCallInDefaultLambda.kt +++ b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/defaultCallInDefaultLambda.kt @@ -1,12 +1,12 @@ +// TODO: split SKIP_INLINE_CHECK_IN by files +// SKIP_INLINE_CHECK_IN: bar$default, foo$default // FILE: 1.kt -// SKIP_INLINE_CHECK_IN: bar$default package test inline fun bar(f: () -> String = { "OK" }) = f() // FILE: 2.kt import test.* -// SKIP_INLINE_CHECK_IN: foo$default inline fun foo(f: () -> String = { bar() }) = f() fun box(): String { diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/asJava/AbstractCompilerLightClassTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/asJava/AbstractCompilerLightClassTest.kt index 7c3c4345f74..443d19bd3d8 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/asJava/AbstractCompilerLightClassTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/asJava/AbstractCompilerLightClassTest.kt @@ -57,8 +57,8 @@ abstract class AbstractCompilerLightClassTest : KotlinMultiFileTestWithJava - ): TestFile = TestFile(fileName, text) + directives: Map + ): TestFile = TestFile(fileName, text, directives) companion object { fun findLightClass(allowFrontendExceptions: Boolean, environment: KotlinCoreEnvironment, fqname: String): PsiClass? { diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/BaseDiagnosticsTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/BaseDiagnosticsTest.kt index 7d6fb8c574a..68e12c9e8da 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/BaseDiagnosticsTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/BaseDiagnosticsTest.kt @@ -83,7 +83,7 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava): TestFile = + override fun createTestFile(module: TestModule?, fileName: String, text: String, directives: Map): TestFile = TestFile(module, fileName, text, directives) @@ -138,8 +138,8 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava - ) : KotlinBaseTest.TestFile(fileName, textWithMarkers) { + directives: Map + ) : KotlinBaseTest.TestFile(fileName, textWithMarkers, directives) { val diagnosedRanges: MutableList = mutableListOf() private val diagnosedRangesToDiagnosticNames: MutableMap> = mutableMapOf() val actualDiagnostics: MutableList = mutableListOf() @@ -411,7 +411,7 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava|") fun parseDiagnosticFilterDirective( - directiveMap: Map, + directiveMap: Map, allowUnderscoreUsage: Boolean ): Condition { val directives = directiveMap[DIAGNOSTICS_DIRECTIVE] @@ -499,7 +499,7 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava) = directiveMap[JVM_TARGET]?.let { JvmTarget.fromString(it) } + private fun parseJvmTarget(directiveMap: Map) = directiveMap[JVM_TARGET]?.let { JvmTarget.fromString(it) } protected fun parseModulePlatformByName(moduleName: String): TargetPlatform? { val nameSuffix = moduleName.substringAfterLast("-", "").toUpperCase() diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/CompilerTestLanguageVersionSettings.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/CompilerTestLanguageVersionSettings.kt index 5413210611a..96c77eba463 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/CompilerTestLanguageVersionSettings.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/CompilerTestLanguageVersionSettings.kt @@ -53,7 +53,7 @@ private fun specificFeaturesForTests(): Map): CompilerTestLanguageVersionSettings = parseLanguageVersionSettings(directiveMap) ?: defaultLanguageVersionSettings() -fun parseLanguageVersionSettings(directives: Map): CompilerTestLanguageVersionSettings? { +fun parseLanguageVersionSettings(directives: Map): CompilerTestLanguageVersionSettings? { val apiVersionString = directives[API_VERSION_DIRECTIVE] val languageFeaturesString = directives[LANGUAGE_DIRECTIVE] diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithJava.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithJava.kt index 2673f0c2d19..7ec1693bb9c 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithJava.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithJava.kt @@ -119,7 +119,7 @@ abstract class KotlinMultiFileTestWithJava, friends: List): M? - protected abstract fun createTestFile(module: M?, fileName: String, text: String, directives: Map): F + protected abstract fun createTestFile(module: M?, fileName: String, text: String, directives: Map): F protected open fun createTestFiles( file: File, diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxInlineCodegenTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxInlineCodegenTest.kt index 0c5b6430ed6..ca87087d2e0 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxInlineCodegenTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxInlineCodegenTest.kt @@ -22,7 +22,7 @@ abstract class AbstractBlackBoxInlineCodegenTest : AbstractBlackBoxCodegenTest() override fun doMultiFileTest(wholeFile: File, files: List) { super.doMultiFileTest(wholeFile, files) try { - InlineTestUtil.checkNoCallsToInline(initializedClassLoader.allGeneratedFiles.filterClassFiles(), myFiles.psiFiles) + InlineTestUtil.checkNoCallsToInline(initializedClassLoader.allGeneratedFiles.filterClassFiles(), files) SMAPTestUtil.checkSMAP(files, generateClassesInFile().getClassFiles(), false) } catch (e: Throwable) { println(generateToText()) diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstInlineKotlinTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstInlineKotlinTest.kt index fff79fffcb8..4d388bb2839 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstInlineKotlinTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstInlineKotlinTest.kt @@ -29,7 +29,7 @@ abstract class AbstractCompileKotlinAgainstInlineKotlinTest : AbstractCompileKot try { val allGeneratedFiles = factory1.asList() + factory2.asList() val sourceFiles = factory1.inputFiles + factory2.inputFiles - InlineTestUtil.checkNoCallsToInline(allGeneratedFiles.filterClassFiles(), sourceFiles) + InlineTestUtil.checkNoCallsToInline(allGeneratedFiles.filterClassFiles(), files) SMAPTestUtil.checkSMAP(files, allGeneratedFiles.filterClassFiles(), true) } catch (e: Throwable) { if (!isIgnored) { diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstKotlinTest.java b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstKotlinTest.java index 7b77de463b7..6a7577c580f 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstKotlinTest.java +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstKotlinTest.java @@ -83,6 +83,11 @@ public abstract class AbstractCompileKotlinAgainstKotlinTest extends CodegenTest callBoxMethodAndCheckResult(createGeneratedClassLoader(), className); } + @Override + protected boolean parseDirectivesPerFiles() { + return true; + } + @NotNull private URLClassLoader createGeneratedClassLoader() throws Exception { return new URLClassLoader( diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java index ddde9c6276e..089cb5d9ab4 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java @@ -70,6 +70,7 @@ import static org.jetbrains.kotlin.cli.common.output.OutputUtilsKt.writeAllTo; import static org.jetbrains.kotlin.codegen.CodegenTestUtil.*; import static org.jetbrains.kotlin.codegen.TestUtilsKt.extractUrls; import static org.jetbrains.kotlin.test.KotlinTestUtils.getAnnotationsJar; +import static org.jetbrains.kotlin.test.KotlinTestUtils.parseDirectivesAndFlags; import static org.jetbrains.kotlin.test.clientserver.TestProcessServerKt.getBoxMethodOrNull; import static org.jetbrains.kotlin.test.clientserver.TestProcessServerKt.getGeneratedClass; @@ -131,7 +132,7 @@ public abstract class CodegenTestCase extends KotlinBaseTest testFilesWithConfigurationDirectives, @NotNull CompilerConfiguration configuration ) { - updateConfigurationByDirectivesInTestFiles(testFilesWithConfigurationDirectives, configuration, ""); + updateConfigurationByDirectivesInTestFiles(testFilesWithConfigurationDirectives, configuration, "", false); } private static void updateConfigurationByDirectivesInTestFiles( @NotNull List testFilesWithConfigurationDirectives, @NotNull CompilerConfiguration configuration, - @NotNull String coroutinesPackage + @NotNull String coroutinesPackage, + boolean usePreparsedDirectives ) { LanguageVersionSettings explicitLanguageVersionSettings = null; boolean disableReleaseCoroutines = false; @@ -158,17 +160,22 @@ public abstract class CodegenTestCase extends KotlinBaseTest kotlinConfigurationFlags = new ArrayList<>(0); for (TestFile testFile : testFilesWithConfigurationDirectives) { - kotlinConfigurationFlags.addAll(InTextDirectivesUtils.findListWithPrefixes(testFile.content, "// KOTLIN_CONFIGURATION_FLAGS:")); + String content = testFile.content; + Map directives = usePreparsedDirectives ? testFile.directives : parseDirectivesAndFlags(content); - List lines = InTextDirectivesUtils.findLinesWithPrefixesRemoved(testFile.content, "// JVM_TARGET:"); - if (!lines.isEmpty()) { - String targetString = CollectionsKt.single(lines); + String configurationFlags = directives.get("KOTLIN_CONFIGURATION_FLAGS"); + if (configurationFlags != null) { + kotlinConfigurationFlags.addAll(InTextDirectivesUtils.splitValues(new ArrayList<>(), configurationFlags)); + } + + String targetString = directives.get("JVM_TARGET"); + if (targetString != null) { JvmTarget jvmTarget = JvmTarget.Companion.fromString(targetString); assert jvmTarget != null : "Unknown target: " + targetString; configuration.put(JVMConfigurationKeys.JVM_TARGET, jvmTarget); } - String version = InTextDirectivesUtils.findStringWithPrefixes(testFile.content, "// LANGUAGE_VERSION:"); + String version = directives.get("LANGUAGE_VERSION"); if (version != null) { throw new AssertionError( "Do not use LANGUAGE_VERSION directive in compiler tests because it's prone to limiting the test\n" + @@ -178,20 +185,18 @@ public abstract class CodegenTestCase extends KotlinBaseTest directives = KotlinTestUtils.parseDirectives(testFile.content); - LanguageVersionSettings fileLanguageVersionSettings = parseLanguageVersionSettings(directives); if (fileLanguageVersionSettings != null) { assert explicitLanguageVersionSettings == null : "Should not specify !LANGUAGE directive twice"; @@ -770,20 +775,24 @@ public abstract class CodegenTestCase extends KotlinBaseTest createTestFilesFromFile(File file, String expectedText) { + protected List createTestFilesFromFile(File file, @NotNull String expectedText) { List testFiles = TestFiles.createTestFiles(file.getName(), expectedText, new TestFiles.TestFileFactoryNoModules() { @NotNull @Override public TestFile create(@NotNull String fileName, @NotNull String text, @NotNull Map directives) { - return new TestFile(fileName, text); + return new TestFile(fileName, text, directives); } - }, coroutinesPackage); + }, false, coroutinesPackage, parseDirectivesPerFiles()); if (InTextDirectivesUtils.isDirectiveDefined(expectedText, "WITH_HELPERS")) { testFiles.add(new TestFile("CodegenTestHelpers.kt", TestHelperGeneratorKt.createTextForCodegenTestHelpers(getBackend()))); } return testFiles; } + protected boolean parseDirectivesPerFiles() { + return false; + } + @NotNull protected File getJavaSourcesOutputDirectory() { return createTempDirectory("java-files"); diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/InlineTestUtil.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/InlineTestUtil.kt index bef1c2b5d79..b47295b7ae5 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/InlineTestUtil.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/InlineTestUtil.kt @@ -27,12 +27,13 @@ import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.InTextDirectivesUtils +import org.jetbrains.kotlin.test.KotlinBaseTest import org.jetbrains.org.objectweb.asm.* import org.jetbrains.org.objectweb.asm.tree.MethodNode import java.util.* object InlineTestUtil { - fun checkNoCallsToInline(outputFiles: Iterable, sourceFiles: List) { + fun checkNoCallsToInline(outputFiles: Iterable, files: List) { val inlineInfo = obtainInlineInfo(outputFiles) val inlineMethods = inlineInfo.inlineMethods assert(inlineMethods.isNotEmpty()) { "There are no inline methods" } @@ -40,12 +41,12 @@ object InlineTestUtil { val notInlinedCalls = checkInlineMethodNotInvoked(outputFiles, inlineMethods) assert(notInlinedCalls.isEmpty()) { "All inline methods should be inlined but:\n" + notInlinedCalls.joinToString("\n") } - val skipParameterChecking = sourceFiles.any { - InTextDirectivesUtils.isDirectiveDefined(it.text, "NO_CHECK_LAMBDA_INLINING") + val skipParameterChecking = files.any { + it.directives.containsKey("NO_CHECK_LAMBDA_INLINING") } || !doLambdaInliningCheck(outputFiles, inlineInfo) if (!skipParameterChecking) { - val notInlinedParameters = checkParametersInlined(outputFiles, inlineInfo, sourceFiles) + val notInlinedParameters = checkParametersInlined(outputFiles, inlineInfo, files) assert(notInlinedParameters.isEmpty()) { "All inline parameters should be inlined but:\n${notInlinedParameters.joinToString("\n")}\n" + "but if you have not inlined lambdas or anonymous objects enable NO_CHECK_LAMBDA_INLINING directive" @@ -167,11 +168,11 @@ object InlineTestUtil { } private fun checkParametersInlined( - outputFiles: Iterable, inlineInfo: InlineInfo, sourceFiles: List + outputFiles: Iterable, inlineInfo: InlineInfo, files: List ): ArrayList { val skipMethods = - sourceFiles.flatMap { - InTextDirectivesUtils.findLinesWithPrefixesRemoved(it.text, "// SKIP_INLINE_CHECK_IN: ") + files.flatMap { + it.getListDirectiveIfPresent("SKIP_INLINE_CHECK_IN") ?: emptyList() }.toSet() val inlinedMethods = inlineInfo.inlineMethods diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/test/InTextDirectivesUtils.java b/compiler/tests-common/tests/org/jetbrains/kotlin/test/InTextDirectivesUtils.java index f3e6f5cb460..32e266d1b02 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/test/InTextDirectivesUtils.java +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/test/InTextDirectivesUtils.java @@ -62,21 +62,26 @@ public final class InTextDirectivesUtils { List result = new ArrayList<>(); for (String line : findLinesWithPrefixesRemoved(fileText, prefixes)) { - String unquoted = StringUtil.unquoteString(line); - if (!unquoted.equals(line)) { - result.add(unquoted); - } - else{ - String[] variants = line.split(","); - for (String variant : variants) { - result.add(variant.trim()); - } - } + splitValues(result, line); } return result; } + public static List splitValues(List result, String line) { + String unquoted = StringUtil.unquoteString(line); + if (!unquoted.equals(line)) { + result.add(unquoted); + } + else{ + String[] variants = line.split(","); + for (String variant : variants) { + result.add(variant.trim()); + } + } + return result; + } + public static boolean isDirectiveDefined(String fileText, String directive) { return !findListWithPrefixes(fileText, directive).isEmpty(); } diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinBaseTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinBaseTest.kt index d4405db4168..be60f85d68e 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinBaseTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinBaseTest.kt @@ -70,7 +70,11 @@ abstract class KotlinBaseTest : KtUsefulTestCase() } - open class TestFile(@JvmField val name: String, @JvmField val content: String) : Comparable { + open class TestFile @JvmOverloads constructor( + @JvmField val name: String, + @JvmField val content: String, + @JvmField val directives: Map = emptyMap() + ) : Comparable { override operator fun compareTo(other: TestFile): Int { return name.compareTo(other.name) } @@ -86,6 +90,12 @@ abstract class KotlinBaseTest : KtUsefulTestCase() override fun toString(): String { return name } + + fun getListDirectiveIfPresent(name: String): List? { + return directives[name]?.let { + InTextDirectivesUtils.splitValues(arrayListOf(), it) + } ?: emptyList() + } } open class TestModule( diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinTestUtils.java b/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinTestUtils.java index f8a0769cb45..614718a1d1e 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinTestUtils.java +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinTestUtils.java @@ -98,6 +98,7 @@ public class KotlinTestUtils { private static final List filesToDelete = new ArrayList<>(); static final Pattern DIRECTIVE_PATTERN = Pattern.compile("^//\\s*!([\\w_]+)(:\\s*(.*)$)?", Pattern.MULTILINE); + static final Pattern BACKEND_DIRECTIVE_PATTERN = Pattern.compile("^//\\s*(FULL_JDK|JVM_TARGET|KOTLIN_CONFIGURATION_FLAGS|LANGUAGE_VERSION|COMMON_COROUTINES_TEST|COROUTINES_PACKAGE|WITH_RUNTIME|WITH_REFLECT|NO_CHECK_LAMBDA_INLINING|SKIP_INLINE_CHECK_IN)(:[ \\t]*(.*)$)?", Pattern.MULTILINE); private KotlinTestUtils() { } @@ -526,16 +527,27 @@ public class KotlinTestUtils { @NotNull public static Map parseDirectives(String expectedText) { Map directives = new HashMap<>(); - Matcher directiveMatcher = DIRECTIVE_PATTERN.matcher(expectedText); + return parseByRegexp(DIRECTIVE_PATTERN, expectedText, directives); + } + + private static Map parseByRegexp(Pattern pattern, String expectedText, Map directives) { + Matcher directiveMatcher = pattern.matcher(expectedText); while (directiveMatcher.find()) { String name = directiveMatcher.group(1); String value = directiveMatcher.group(3); String oldValue = directives.put(name, value); - Assert.assertNull("Directive overwritten: " + name + " old value: " + oldValue + " new value: " + value, oldValue); + Assert.assertNull("Directive or flag overwritten: " + name + " old value: " + oldValue + " new value: " + value, oldValue); } return directives; } + @NotNull + public static Map parseDirectivesAndFlags(String expectedText) { + Map directiveAndFlags = parseDirectives(expectedText); + parseByRegexp(BACKEND_DIRECTIVE_PATTERN, expectedText, directiveAndFlags); + return directiveAndFlags; + } + public static List loadBeforeAfterText(String filePath) { String content; diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/test/TestFiles.java b/compiler/tests-common/tests/org/jetbrains/kotlin/test/TestFiles.java index 744d395a3f9..74f634c609d 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/test/TestFiles.java +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/test/TestFiles.java @@ -19,6 +19,8 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import static org.jetbrains.kotlin.test.InTextDirectivesUtils.isDirectiveDefined; +import static org.jetbrains.kotlin.test.KotlinTestUtils.parseDirectives; +import static org.jetbrains.kotlin.test.KotlinTestUtils.parseDirectivesAndFlags; public class TestFiles { /** @@ -51,19 +53,30 @@ public class TestFiles { @NotNull public static List createTestFiles(String testFileName, String expectedText, TestFileFactory factory, boolean preserveLocations, String coroutinesPackage) { - Map directives = KotlinTestUtils.parseDirectives(expectedText); + return createTestFiles(testFileName, expectedText, factory, preserveLocations, coroutinesPackage, false); + } + + @NotNull + public static List createTestFiles(String testFileName, String expectedText, TestFileFactory factory, + boolean preserveLocations, String coroutinesPackage, boolean parseDirectivesPerFile) { Map modules = new HashMap<>(); List testFiles = Lists.newArrayList(); Matcher matcher = FILE_OR_MODULE_PATTERN.matcher(expectedText); boolean hasModules = false; + String commonPrefixOrWholeFile; if (!matcher.find()) { assert testFileName != null : "testFileName should not be null if no FILE directive defined"; // One file - testFiles.add(factory.createFile(null, testFileName, expectedText, directives)); + testFiles.add(factory.createFile(null, testFileName, expectedText, parseDirectivesAndFlags(expectedText))); + commonPrefixOrWholeFile = expectedText; } else { + Map allFilesOrCommonPrefixDirectives = parseDirectivesPerFile ? null : parseDirectivesAndFlags(expectedText); int processedChars = 0; M module = null; + boolean firstFileProcessed = false; + commonPrefixOrWholeFile = expectedText.substring(0, matcher.start()); + // Many files while (true) { String moduleName = matcher.group(1); @@ -91,10 +104,14 @@ public class TestFiles { String fileText = preserveLocations ? substringKeepingLocations(expectedText, start, end) : expectedText.substring(start,end); + + + testFiles.add(factory.createFile(module, fileName, fileText, + parseDirectivesPerFile ? + parseDirectivesAndFlags(firstFileProcessed ? commonPrefixOrWholeFile + fileText : fileText) + : allFilesOrCommonPrefixDirectives)); processedChars = end; - - testFiles.add(factory.createFile(module, fileName, fileText, directives)); - + firstFileProcessed = true; if (!nextFileExists) break; } assert processedChars == expectedText.length() : "Characters skipped from " + @@ -123,7 +140,7 @@ public class TestFiles { "CoroutineUtil.kt", TestHelperGeneratorKt.createTextForCoroutineHelpers( isReleaseCoroutines, checkStateMachine, checkTailCallOptimization), - directives + parseDirectives(commonPrefixOrWholeFile) )); } diff --git a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/AbstractVisualizer.kt b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/AbstractVisualizer.kt index 601c300e752..035e62e7053 100644 --- a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/AbstractVisualizer.kt +++ b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/AbstractVisualizer.kt @@ -5,11 +5,9 @@ package org.jetbrains.kotlin.visualizer -import org.jetbrains.kotlin.test.KotlinBaseTest import org.jetbrains.kotlin.checkers.KotlinMultiFileTestWithJava import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.test.ConfigurationKind -import org.jetbrains.kotlin.test.TestJdkKind +import org.jetbrains.kotlin.test.KotlinBaseTest import java.io.File abstract class AbstractVisualizer : KotlinMultiFileTestWithJava() { @@ -22,8 +20,8 @@ abstract class AbstractVisualizer : KotlinMultiFileTestWithJava): TestFile = - TestFile(fileName, text) + override fun createTestFile(module: TestModule?, fileName: String, text: String, directives: Map): TestFile = + TestFile(fileName, text, directives) override fun doMultiFileTest(wholeFile: File, files: List) { diff --git a/idea/jvm-debugger/jvm-debugger-test/test/org/jetbrains/kotlin/idea/debugger/test/KotlinDescriptorTestCase.kt b/idea/jvm-debugger/jvm-debugger-test/test/org/jetbrains/kotlin/idea/debugger/test/KotlinDescriptorTestCase.kt index de59bba44ce..0b324e5a4cf 100644 --- a/idea/jvm-debugger/jvm-debugger-test/test/org/jetbrains/kotlin/idea/debugger/test/KotlinDescriptorTestCase.kt +++ b/idea/jvm-debugger/jvm-debugger-test/test/org/jetbrains/kotlin/idea/debugger/test/KotlinDescriptorTestCase.kt @@ -129,8 +129,8 @@ abstract class KotlinDescriptorTestCase : DescriptorTestCase() { wholeFile.name, wholeFileContents, object : org.jetbrains.kotlin.test.TestFiles.TestFileFactoryNoModules() { - override fun create(fileName: String, text: String, directives: Map): TestFile { - return TestFile(fileName, text) + override fun create(fileName: String, text: String, directives: Map): TestFile { + return TestFile(fileName, text, directives) } } ) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/AbstractJsLineNumberTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/AbstractJsLineNumberTest.kt index 59fc38e3ed2..297559da514 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/AbstractJsLineNumberTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/AbstractJsLineNumberTest.kt @@ -147,7 +147,7 @@ abstract class AbstractJsLineNumberTest : KotlinTestWithEnvironment() { KotlinTestUtils.mkdirs(temporaryFile.parentFile) temporaryFile.writeText(text, Charsets.UTF_8) - return TestFile(temporaryFile.absolutePath, text, currentModule) + return TestFile(temporaryFile.absolutePath, text, currentModule, directives) } override fun createModule(name: String, dependencies: List, friends: List) = TestModule(name, dependencies, friends) @@ -165,7 +165,8 @@ abstract class AbstractJsLineNumberTest : KotlinTestWithEnvironment() { val files = mutableListOf() } - private class TestFile(val fileName: String, content: String, val module: TestModule) : KotlinBaseTest.TestFile(fileName, content) { + private class TestFile(val fileName: String, content: String, val module: TestModule, directives: Map) : + KotlinBaseTest.TestFile(fileName, content, directives) { init { module.files += this }