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 810dc7d21c4..5cbf8842700 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 @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.test.model.FrontendKinds import org.jetbrains.kotlin.test.model.ResultingArtifact import org.jetbrains.kotlin.test.model.TestFile import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest -import org.jetbrains.kotlin.test.runners.TransformersFunctions.Android +import org.jetbrains.kotlin.test.utils.TransformersFunctions.Android import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.JvmEnvironmentConfigurator diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index eb46ad428a1..e32bb099640 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.test.runners.codegen; import com.intellij.testFramework.TestDataPath; import org.jetbrains.kotlin.test.util.KtTestUtil; import org.jetbrains.kotlin.test.TargetBackend; -import org.jetbrains.kotlin.test.runners.TransformersFunctions; +import org.jetbrains.kotlin.test.utils.TransformersFunctions; import org.jetbrains.kotlin.test.TestMetadata; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; diff --git a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/GlobalMetadataInfoHandler.kt b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/GlobalMetadataInfoHandler.kt index 85f4da53413..e7383183fa4 100644 --- a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/GlobalMetadataInfoHandler.kt +++ b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/GlobalMetadataInfoHandler.kt @@ -51,7 +51,7 @@ class GlobalMetadataInfoHandler( infos += codeMetaInfos } - fun compareAllMetaDataInfos(expectedTransformer: ((String) -> String)?) { + fun compareAllMetaDataInfos() { // TODO: adapt to multiple testdata files val moduleStructure = testServices.moduleStructure val builder = StringBuilder() @@ -66,18 +66,15 @@ class GlobalMetadataInfoHandler( codeMetaInfos, testServices.sourceFileProvider.getContentOfSourceFile(file) ) - builder.append(fileBuilder.stripAdditionalEmptyLines(file)) + val reverseTransformers = testServices.sourceFileProvider.preprocessors.filterIsInstance() + val initialFileContent = fileBuilder.stripAdditionalEmptyLines(file).toString() + val actualFileContent = + reverseTransformers.foldRight(initialFileContent) { transformer, source -> transformer.revert(file, source) } + builder.append(actualFileContent) } } val actualText = builder.toString() - val expectedFile = moduleStructure.originalTestDataFiles.single() - if (expectedTransformer != null) { - val expectedContent = expectedFile.readText().let(expectedTransformer) - val message = "Actual data differs from transformed content of file $expectedFile" - testServices.assertions.assertEquals(expectedContent, actualText) { message } - } else { - testServices.assertions.assertEqualsToFile(expectedFile, actualText) - } + testServices.assertions.assertEqualsToFile(moduleStructure.originalTestDataFiles.single(), actualText) } private fun StringBuilder.stripAdditionalEmptyLines(file: TestFile): CharSequence { diff --git a/compiler/testData/codegen/box/inlineClasses/boxResultInlineClassOfConstructorCall.kt b/compiler/testData/codegen/box/inlineClasses/boxResultInlineClassOfConstructorCall.kt index e2d67b49e1e..f961ea84527 100644 --- a/compiler/testData/codegen/box/inlineClasses/boxResultInlineClassOfConstructorCall.kt +++ b/compiler/testData/codegen/box/inlineClasses/boxResultInlineClassOfConstructorCall.kt @@ -1,6 +1,6 @@ // WITH_STDLIB // WORKS_WHEN_VALUE_CLASS -// !LANGUAGE: +ValueClasses +// LANGUAGE: +ValueClasses OPTIONAL_JVM_INLINE_ANNOTATION value class Result(val a: Any?) diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 29ccbe1ee06..c4cc8e33738 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.test.runners.codegen; import com.intellij.testFramework.TestDataPath; import org.jetbrains.kotlin.test.util.KtTestUtil; import org.jetbrains.kotlin.test.TargetBackend; -import org.jetbrains.kotlin.test.runners.TransformersFunctions; +import org.jetbrains.kotlin.test.utils.TransformersFunctions; import org.jetbrains.kotlin.test.TestMetadata; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 8dc3c374434..2985900cc4f 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.test.runners.codegen; import com.intellij.testFramework.TestDataPath; import org.jetbrains.kotlin.test.util.KtTestUtil; import org.jetbrains.kotlin.test.TargetBackend; -import org.jetbrains.kotlin.test.runners.TransformersFunctions; +import org.jetbrains.kotlin.test.utils.TransformersFunctions; import org.jetbrains.kotlin.test.TestMetadata; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractKotlinCompilerTest.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractKotlinCompilerTest.kt index 9caa9ec2d4e..ed624ff2153 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractKotlinCompilerTest.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractKotlinCompilerTest.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.test.model.TestFile import org.jetbrains.kotlin.test.preprocessors.MetaInfosCleanupPreprocessor import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.test.services.impl.TemporaryDirectoryManagerImpl +import org.jetbrains.kotlin.test.utils.ReplacingSourceTransformer import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.FlexibleTypeImpl import org.junit.jupiter.api.BeforeEach @@ -81,18 +82,17 @@ abstract class AbstractKotlinCompilerTest { testRunner(filePath, configuration).runTest(filePath) } - @JvmOverloads open fun runTest( @TestDataFile filePath: String, - actualContentModifier: (String) -> String, - expectedContentModifier: ((String) -> String)? = actualContentModifier + contentModifier: ReplacingSourceTransformer, ) { - class SourceTransformer(testServices: TestServices) : SourceFilePreprocessor(testServices) { - override fun process(file: TestFile, content: String): String = content.let(actualContentModifier) + class SourceTransformer(testServices: TestServices) : ReversibleSourceFilePreprocessor(testServices) { + override fun process(file: TestFile, content: String): String = contentModifier.invokeForTestFile(file, content) + override fun revert(file: TestFile, actualContent: String): String = contentModifier.revertForFile(file, actualContent) } testRunner(filePath) { - configuration.let { it() } // property configuration, not method - useSourcePreprocessor({ SourceTransformer(it) }) - }.runTest(filePath, expectedFileTransformer = expectedContentModifier) + configuration.invoke(this) + useSourcePreprocessor(::SourceTransformer) + }.runTest(filePath) } } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/utils/ReplacingSourceTransformer.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/utils/ReplacingSourceTransformer.kt new file mode 100644 index 00000000000..fb60a4755fa --- /dev/null +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/utils/ReplacingSourceTransformer.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.test.utils + +import org.jetbrains.kotlin.test.model.TestFile +import java.util.function.Function + +class ReplacingSourceTransformer(val from: String, val to: String) : Function, (String) -> String { + init { + require(from.isNotEmpty()) { "Cannot replace empty string" } + require(from.lines().size == 1) { "Multiline text cannot be replaced yet" } + require(to.lines().size == from.lines().size) { "Number of lines cannot change" } + } + + private val replacements: MutableMap>> = mutableMapOf() + + fun invokeForTestFile(testFile: TestFile?, source: String): String { + val value = source.lines().map { it.split(from) } + replacements[testFile?.relativePath] = value + return value.joinToString("\n") { it.joinToString(to) } + } + + fun revertForFile(testFile: TestFile?, actual: String): String = actual.lines().mapIndexed { index, line -> + val partition = replacements[testFile?.relativePath]?.elementAtOrNull(index) ?: return@mapIndexed line + if (partition.joinToString(to) == line) partition.joinToString(from) else line + }.joinToString("\n") + + override fun apply(source: String): String = invokeForTestFile(null, source) + override fun invoke(source: String): String = invokeForTestFile(null, source) +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/TransformersFunctions.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/utils/TransformersFunctions.kt similarity index 95% rename from compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/TransformersFunctions.kt rename to compiler/tests-common-new/tests/org/jetbrains/kotlin/test/utils/TransformersFunctions.kt index ccd686d3549..1f947da40fa 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/TransformersFunctions.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/utils/TransformersFunctions.kt @@ -3,7 +3,7 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.kotlin.test.runners +package org.jetbrains.kotlin.test.utils import java.io.File diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/generators/impl/TestGeneratorImpl.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/generators/impl/TestGeneratorImpl.kt index c4fda6fbb41..d84073af5d6 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/generators/impl/TestGeneratorImpl.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/generators/impl/TestGeneratorImpl.kt @@ -126,7 +126,7 @@ private class TestGeneratorImplInstance( for (clazz in testClassModels.flatMapTo(mutableSetOf()) { classModel -> classModel.imports }) { val realName = when (clazz) { TransformingTestMethodModel.TransformerFunctionsClassPlaceHolder::class.java -> - "org.jetbrains.kotlin.test.runners.TransformersFunctions" + "org.jetbrains.kotlin.test.utils.TransformersFunctions" else -> clazz.name } p.println("import $realName;") diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index e14cad1b7f1..56453e78588 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.test.util.KtTestUtil; import org.jetbrains.kotlin.test.TargetBackend; -import org.jetbrains.kotlin.test.runners.TransformersFunctions; +import org.jetbrains.kotlin.test.utils.TransformersFunctions; import org.jetbrains.kotlin.test.TestMetadata; import org.junit.runner.RunWith; diff --git a/generators/test-generator/tests/org/jetbrains/kotlin/generators/NewTestGeneratorImpl.kt b/generators/test-generator/tests/org/jetbrains/kotlin/generators/NewTestGeneratorImpl.kt index a69df5d4c49..12731a9e763 100644 --- a/generators/test-generator/tests/org/jetbrains/kotlin/generators/NewTestGeneratorImpl.kt +++ b/generators/test-generator/tests/org/jetbrains/kotlin/generators/NewTestGeneratorImpl.kt @@ -131,7 +131,7 @@ object NewTestGeneratorImpl : TestGenerator(METHOD_GENERATORS) { for (clazz in testClassModels.flatMapTo(mutableSetOf()) { classModel -> classModel.imports }) { val realName = when (clazz) { TransformingTestMethodModel.TransformerFunctionsClassPlaceHolder::class.java -> - "org.jetbrains.kotlin.test.runners.TransformersFunctions" + "org.jetbrains.kotlin.test.utils.TransformersFunctions" else -> clazz.name } p.println("import $realName;") diff --git a/generators/test-generator/tests/org/jetbrains/kotlin/generators/impl/TransformingTestMethodGenerator.kt b/generators/test-generator/tests/org/jetbrains/kotlin/generators/impl/TransformingTestMethodGenerator.kt index 902f214bfc5..bee4dea5a64 100644 --- a/generators/test-generator/tests/org/jetbrains/kotlin/generators/impl/TransformingTestMethodGenerator.kt +++ b/generators/test-generator/tests/org/jetbrains/kotlin/generators/impl/TransformingTestMethodGenerator.kt @@ -23,14 +23,21 @@ object TransformingTestMethodGenerator : MethodGenerator 1) { + p.println("/*") + p.println(" $message:") + lines.forEach { p.println(" $it") } + p.println("*/") + } else { + val restOfLine = lines.firstOrNull()?.takeIf { it.isNotBlank() }?.let { ": $it" } ?: "" + p.println("// $message$restOfLine") + } + } val filePath = KtTestUtil.getFilePath(source.file) + if (source.file.isDirectory) "/" else "" p.println("${RunTestMethodModel.METHOD_NAME}(\"$filePath\"${if (registerInConstructor) "" else ", $transformer"});") - if (registerInConstructor) { - p.println("/*") - p.println(" There is a registered source transformer for the testcase:") - transformer.lines().forEach { p.println(" $it") } - p.println("*/") - } } } } diff --git a/generators/test-generator/tests/org/jetbrains/kotlin/generators/util/MethodModelLocator.kt b/generators/test-generator/tests/org/jetbrains/kotlin/generators/util/MethodModelLocator.kt index 8de465e6a25..103b26693ea 100644 --- a/generators/test-generator/tests/org/jetbrains/kotlin/generators/util/MethodModelLocator.kt +++ b/generators/test-generator/tests/org/jetbrains/kotlin/generators/util/MethodModelLocator.kt @@ -10,9 +10,13 @@ import org.jetbrains.kotlin.test.TargetBackend import java.io.File import java.util.regex.Pattern +const val WORKS_WHEN_VALUE_CLASS = "WORKS_WHEN_VALUE_CLASS" +// will replace OPTIONAL_JVM_INLINE_ANNOTATION with @JvmInline or remove it depending on compiler backend +// for JVM IR both ones are generated according to value classes feature (https://github.com/Kotlin/KEEP/issues/237) + fun TestEntityModel.containsWithoutJvmInline(): Boolean = when (this) { is ClassModel -> methods.any { it.containsWithoutJvmInline() } || innerTestClasses.any { it.containsWithoutJvmInline() } - is SimpleTestMethodModel -> file.isFile && file.readLines().any { Regex("^\\s*//\\s*WORKS_WHEN_VALUE_CLASS\\s*$").matches(it) } + is SimpleTestMethodModel -> file.isFile && file.readLines().any { Regex("^\\s*//\\s*$WORKS_WHEN_VALUE_CLASS\\s*$").matches(it) } else -> false } diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index 45931495ea6..046429c57f0 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.js.test; import com.intellij.testFramework.TestDataPath; import org.jetbrains.kotlin.test.util.KtTestUtil; import org.jetbrains.kotlin.test.TargetBackend; -import org.jetbrains.kotlin.test.runners.TransformersFunctions; +import org.jetbrains.kotlin.test.utils.TransformersFunctions; import org.jetbrains.kotlin.test.TestMetadata; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index a437d2968be..eaad87a4063 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.js.test.ir; import com.intellij.testFramework.TestDataPath; import org.jetbrains.kotlin.test.util.KtTestUtil; import org.jetbrains.kotlin.test.TargetBackend; -import org.jetbrains.kotlin.test.runners.TransformersFunctions; +import org.jetbrains.kotlin.test.utils.TransformersFunctions; import org.jetbrains.kotlin.test.TestMetadata; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 13da6d13049..be6da78299e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.test.util.KtTestUtil; import org.jetbrains.kotlin.test.TargetBackend; -import org.jetbrains.kotlin.test.runners.TransformersFunctions; +import org.jetbrains.kotlin.test.utils.TransformersFunctions; import org.jetbrains.kotlin.test.TestMetadata; import org.junit.runner.RunWith; diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java index d757d7a3daf..a7e7b624a87 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.test.util.KtTestUtil; import org.jetbrains.kotlin.konan.blackboxtest.support.group.NativeBlackBoxTestCaseGroupProvider; import org.jetbrains.kotlin.konan.blackboxtest.support.group.ExtTestCaseGroupProvider; import org.jetbrains.kotlin.test.TargetBackend; -import org.jetbrains.kotlin.test.runners.TransformersFunctions; +import org.jetbrains.kotlin.test.utils.TransformersFunctions; import org.jetbrains.kotlin.test.TestMetadata; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -15705,11 +15705,8 @@ public class NativeExtBlackBoxTestGenerated extends AbstractNativeBlackBoxTest { @Test @TestMetadata("boxResultInlineClassOfConstructorCall.kt") public void testBoxResultInlineClassOfConstructorCall() throws Exception { + // There is a registered source transformer for the testcase: TransformersFunctions::removeOptionalJvmInlineAnnotation runTest("compiler/testData/codegen/box/inlineClasses/boxResultInlineClassOfConstructorCall.kt"); - /* - There is a registered source transformer for the testcase: - TransformersFunctions::removeOptionalJvmInlineAnnotation - */ } @Test