From 04a088039cd81c0d9fef6d1919472236525cdd2a Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Mon, 6 Mar 2023 16:14:44 +0100 Subject: [PATCH] [K2] Add support for running Kotlinp tests with K2. The tests fail spectacularly at this point in time. --- .../kotlinp/test/AbstractK1KotlinpTest.kt | 10 + .../kotlinp/test/AbstractK2KotlinpTest.kt | 10 + .../kotlinp/test/AbstractKotlinpTest.kt | 11 +- .../kotlinp/test/GenerateKotlinpTests.kt | 5 +- ...rated.java => K1KotlinpTestGenerated.java} | 11 +- .../kotlinp/test/K2KotlinpTestGenerated.java | 202 ++++++++++++++++++ .../test/KotlinpCompilerTestDataTest.kt | 2 +- .../kotlin/kotlinp/test/KotlinpTestUtils.kt | 17 +- .../tools/kotlinp/testData/Delegation.kt | 7 + .../tools/kotlinp/testData/Delegation.txt | 25 +++ 10 files changed, 290 insertions(+), 10 deletions(-) create mode 100644 libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/AbstractK1KotlinpTest.kt create mode 100644 libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/AbstractK2KotlinpTest.kt rename libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/{KotlinpTestGenerated.java => K1KotlinpTestGenerated.java} (95%) create mode 100644 libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/K2KotlinpTestGenerated.java create mode 100644 libraries/tools/kotlinp/testData/Delegation.kt create mode 100644 libraries/tools/kotlinp/testData/Delegation.txt diff --git a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/AbstractK1KotlinpTest.kt b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/AbstractK1KotlinpTest.kt new file mode 100644 index 00000000000..fb498292820 --- /dev/null +++ b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/AbstractK1KotlinpTest.kt @@ -0,0 +1,10 @@ +/* + * Copyright 2010-2023 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.kotlinp.test + +abstract class AbstractK1KotlinpTest : AbstractKotlinpTest() { + override fun useK2() = false +} \ No newline at end of file diff --git a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/AbstractK2KotlinpTest.kt b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/AbstractK2KotlinpTest.kt new file mode 100644 index 00000000000..2912086d5a8 --- /dev/null +++ b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/AbstractK2KotlinpTest.kt @@ -0,0 +1,10 @@ +/* + * Copyright 2010-2023 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.kotlinp.test + +abstract class AbstractK2KotlinpTest: AbstractKotlinpTest() { + override fun useK2() = true +} \ No newline at end of file diff --git a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/AbstractKotlinpTest.kt b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/AbstractKotlinpTest.kt index 83ddbbe6523..aaf8a89294a 100644 --- a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/AbstractKotlinpTest.kt +++ b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/AbstractKotlinpTest.kt @@ -9,7 +9,16 @@ import org.jetbrains.kotlin.test.TestCaseWithTmpdir import java.io.File abstract class AbstractKotlinpTest : TestCaseWithTmpdir() { + abstract fun useK2(): Boolean + protected fun doTest(fileName: String) { - compileAndPrintAllFiles(File(fileName), testRootDisposable, tmpdir, compareWithTxt = true, readWriteAndCompare = true) + compileAndPrintAllFiles( + File(fileName), + testRootDisposable, + tmpdir, + compareWithTxt = true, + readWriteAndCompare = true, + useK2 = useK2() + ) } } diff --git a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/GenerateKotlinpTests.kt b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/GenerateKotlinpTests.kt index 39ecb0dd840..4bda9231be3 100644 --- a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/GenerateKotlinpTests.kt +++ b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/GenerateKotlinpTests.kt @@ -12,7 +12,10 @@ fun main(args: Array) { generateTestGroupSuite(args) { testGroup("libraries/tools/kotlinp/test", "libraries/tools/kotlinp/testData") { - testClass { + testClass { + model("") + } + testClass { model("") } } diff --git a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestGenerated.java b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/K1KotlinpTestGenerated.java similarity index 95% rename from libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestGenerated.java rename to libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/K1KotlinpTestGenerated.java index bafd3b9b093..74ed7a5518e 100644 --- a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestGenerated.java +++ b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/K1KotlinpTestGenerated.java @@ -20,7 +20,7 @@ import java.util.regex.Pattern; @TestMetadata("libraries/tools/kotlinp/testData") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) -public class KotlinpTestGenerated extends AbstractKotlinpTest { +public class K1KotlinpTestGenerated extends AbstractK1KotlinpTest { private void runTest(String testDataFilePath) throws Exception { KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); } @@ -44,6 +44,11 @@ public class KotlinpTestGenerated extends AbstractKotlinpTest { runTest("libraries/tools/kotlinp/testData/Contracts.kt"); } + @TestMetadata("Delegation.kt") + public void testDelegation() throws Exception { + runTest("libraries/tools/kotlinp/testData/Delegation.kt"); + } + @TestMetadata("EnumEntries.kt") public void testEnumEntries() throws Exception { runTest("libraries/tools/kotlinp/testData/EnumEntries.kt"); @@ -132,7 +137,7 @@ public class KotlinpTestGenerated extends AbstractKotlinpTest { @TestMetadata("libraries/tools/kotlinp/testData/jvmDefault") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) - public static class JvmDefault extends AbstractKotlinpTest { + public static class JvmDefault extends AbstractK1KotlinpTest { private void runTest(String testDataFilePath) throws Exception { KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); } @@ -165,7 +170,7 @@ public class KotlinpTestGenerated extends AbstractKotlinpTest { @TestMetadata("libraries/tools/kotlinp/testData/localClasses") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) - public static class LocalClasses extends AbstractKotlinpTest { + public static class LocalClasses extends AbstractK1KotlinpTest { private void runTest(String testDataFilePath) throws Exception { KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); } diff --git a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/K2KotlinpTestGenerated.java b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/K2KotlinpTestGenerated.java new file mode 100644 index 00000000000..c0dfcad3302 --- /dev/null +++ b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/K2KotlinpTestGenerated.java @@ -0,0 +1,202 @@ +/* + * Copyright 2010-2023 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.kotlinp.test; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.kotlinp.test.GenerateKotlinpTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("libraries/tools/kotlinp/testData") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class K2KotlinpTestGenerated extends AbstractK2KotlinpTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInTestData() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("libraries/tools/kotlinp/testData"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @TestMetadata("Annotations.kt") + public void testAnnotations() throws Exception { + runTest("libraries/tools/kotlinp/testData/Annotations.kt"); + } + + @TestMetadata("ContextReceivers.kt") + public void testContextReceivers() throws Exception { + runTest("libraries/tools/kotlinp/testData/ContextReceivers.kt"); + } + + @TestMetadata("Contracts.kt") + public void testContracts() throws Exception { + runTest("libraries/tools/kotlinp/testData/Contracts.kt"); + } + + @TestMetadata("Delegation.kt") + public void testDelegation() throws Exception { + runTest("libraries/tools/kotlinp/testData/Delegation.kt"); + } + + @TestMetadata("EnumEntries.kt") + public void testEnumEntries() throws Exception { + runTest("libraries/tools/kotlinp/testData/EnumEntries.kt"); + } + + @TestMetadata("FunInterface.kt") + public void testFunInterface() throws Exception { + runTest("libraries/tools/kotlinp/testData/FunInterface.kt"); + } + + @TestMetadata("IntersectionTypeInLambdaLiteralAndDelegatedProperty.kt") + public void testIntersectionTypeInLambdaLiteralAndDelegatedProperty() throws Exception { + runTest("libraries/tools/kotlinp/testData/IntersectionTypeInLambdaLiteralAndDelegatedProperty.kt"); + } + + @TestMetadata("Lambda.kt") + public void testLambda() throws Exception { + runTest("libraries/tools/kotlinp/testData/Lambda.kt"); + } + + @TestMetadata("LocalDelegatedProperties.kt") + public void testLocalDelegatedProperties() throws Exception { + runTest("libraries/tools/kotlinp/testData/LocalDelegatedProperties.kt"); + } + + @TestMetadata("MultiFileClass.kt") + public void testMultiFileClass() throws Exception { + runTest("libraries/tools/kotlinp/testData/MultiFileClass.kt"); + } + + @TestMetadata("NestedClasses.kt") + public void testNestedClasses() throws Exception { + runTest("libraries/tools/kotlinp/testData/NestedClasses.kt"); + } + + @TestMetadata("NotEnumWithEnumEntriesEnabled.kt") + public void testNotEnumWithEnumEntriesEnabled() throws Exception { + runTest("libraries/tools/kotlinp/testData/NotEnumWithEnumEntriesEnabled.kt"); + } + + @TestMetadata("OptionalAnnotation.kt") + public void testOptionalAnnotation() throws Exception { + runTest("libraries/tools/kotlinp/testData/OptionalAnnotation.kt"); + } + + @TestMetadata("PlatformType.kt") + public void testPlatformType() throws Exception { + runTest("libraries/tools/kotlinp/testData/PlatformType.kt"); + } + + @TestMetadata("Properties.kt") + public void testProperties() throws Exception { + runTest("libraries/tools/kotlinp/testData/Properties.kt"); + } + + @TestMetadata("SimpleClass.kt") + public void testSimpleClass() throws Exception { + runTest("libraries/tools/kotlinp/testData/SimpleClass.kt"); + } + + @TestMetadata("SimplePackage.kt") + public void testSimplePackage() throws Exception { + runTest("libraries/tools/kotlinp/testData/SimplePackage.kt"); + } + + @TestMetadata("SyntheticClass.kt") + public void testSyntheticClass() throws Exception { + runTest("libraries/tools/kotlinp/testData/SyntheticClass.kt"); + } + + @TestMetadata("TypeParameters.kt") + public void testTypeParameters() throws Exception { + runTest("libraries/tools/kotlinp/testData/TypeParameters.kt"); + } + + @TestMetadata("ValueClass.kt") + public void testValueClass() throws Exception { + runTest("libraries/tools/kotlinp/testData/ValueClass.kt"); + } + + @TestMetadata("VersionRequirement.kt") + public void testVersionRequirement() throws Exception { + runTest("libraries/tools/kotlinp/testData/VersionRequirement.kt"); + } + + @TestMetadata("libraries/tools/kotlinp/testData/jvmDefault") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class JvmDefault extends AbstractK2KotlinpTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + @TestMetadata("All.kt") + public void testAll() throws Exception { + runTest("libraries/tools/kotlinp/testData/jvmDefault/All.kt"); + } + + @TestMetadata("AllCompatibility.kt") + public void testAllCompatibility() throws Exception { + runTest("libraries/tools/kotlinp/testData/jvmDefault/AllCompatibility.kt"); + } + + public void testAllFilesPresentInJvmDefault() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("libraries/tools/kotlinp/testData/jvmDefault"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @TestMetadata("withCompatibility.kt") + public void testWithCompatibility() throws Exception { + runTest("libraries/tools/kotlinp/testData/jvmDefault/withCompatibility.kt"); + } + + @TestMetadata("withoutCompatibility.kt") + public void testWithoutCompatibility() throws Exception { + runTest("libraries/tools/kotlinp/testData/jvmDefault/withoutCompatibility.kt"); + } + } + + @TestMetadata("libraries/tools/kotlinp/testData/localClasses") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class LocalClasses extends AbstractK2KotlinpTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInLocalClasses() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("libraries/tools/kotlinp/testData/localClasses"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @TestMetadata("AnonymousObject.kt") + public void testAnonymousObject() throws Exception { + runTest("libraries/tools/kotlinp/testData/localClasses/AnonymousObject.kt"); + } + + @TestMetadata("DeepInnerLocalChain.kt") + public void testDeepInnerLocalChain() throws Exception { + runTest("libraries/tools/kotlinp/testData/localClasses/DeepInnerLocalChain.kt"); + } + + @TestMetadata("LocalClassInConstructor.kt") + public void testLocalClassInConstructor() throws Exception { + runTest("libraries/tools/kotlinp/testData/localClasses/LocalClassInConstructor.kt"); + } + + @TestMetadata("LocalClassInSignature.kt") + public void testLocalClassInSignature() throws Exception { + runTest("libraries/tools/kotlinp/testData/localClasses/LocalClassInSignature.kt"); + } + } +} diff --git a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpCompilerTestDataTest.kt b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpCompilerTestDataTest.kt index 9e4e4b0f1ef..7a90aab2775 100644 --- a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpCompilerTestDataTest.kt +++ b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpCompilerTestDataTest.kt @@ -25,7 +25,7 @@ class KotlinpCompilerTestDataTest(private val file: File) { val disposable = TestDisposable() try { - compileAndPrintAllFiles(file, disposable, tmpdir, compareWithTxt = false, readWriteAndCompare = true) + compileAndPrintAllFiles(file, disposable, tmpdir, compareWithTxt = false, readWriteAndCompare = true, useK2 = false) } finally { Disposer.dispose(disposable) } diff --git a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestUtils.kt b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestUtils.kt index 1a9e59f38f1..ae39668be12 100644 --- a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestUtils.kt +++ b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestUtils.kt @@ -14,10 +14,11 @@ import org.jetbrains.kotlin.checkers.setupLanguageVersionSettingsForCompilerTest import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.codegen.GenerationUtils -import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.jvm.compiler.AbstractLoadJavaTest import org.jetbrains.kotlin.kotlinp.Kotlinp import org.jetbrains.kotlin.kotlinp.KotlinpSettings +import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState import org.jetbrains.kotlin.test.ConfigurationKind import org.jetbrains.kotlin.test.InTextDirectivesUtils import org.jetbrains.kotlin.test.KotlinTestUtils @@ -26,7 +27,14 @@ import org.jetbrains.kotlin.test.util.KtTestUtil import java.io.File import kotlin.test.fail -fun compileAndPrintAllFiles(file: File, disposable: Disposable, tmpdir: File, compareWithTxt: Boolean, readWriteAndCompare: Boolean) { +fun compileAndPrintAllFiles( + file: File, + disposable: Disposable, + tmpdir: File, + compareWithTxt: Boolean, + readWriteAndCompare: Boolean, + useK2: Boolean +) { val main = StringBuilder() val afterVisitors = StringBuilder() val afterNodes = StringBuilder() @@ -34,7 +42,7 @@ fun compileAndPrintAllFiles(file: File, disposable: Disposable, tmpdir: File, co val kotlinp = Kotlinp(KotlinpSettings(isVerbose = true)) @OptIn(UnstableMetadataApi::class) - compile(file, disposable, tmpdir) { outputFile -> + compile(file, disposable, tmpdir, useK2) { outputFile -> when (outputFile.extension) { "kotlin_module" -> { val moduleFile = kotlinp.readModuleFile(outputFile)!! @@ -74,10 +82,11 @@ fun compileAndPrintAllFiles(file: File, disposable: Disposable, tmpdir: File, co } } -private fun compile(file: File, disposable: Disposable, tmpdir: File, forEachOutputFile: (File) -> Unit) { +private fun compile(file: File, disposable: Disposable, tmpdir: File, useK2: Boolean, forEachOutputFile: (File) -> Unit) { val content = file.readText() val configuration = KotlinTestUtils.newConfiguration(ConfigurationKind.ALL, TestJdkKind.MOCK_JDK) configuration.put(JVMConfigurationKeys.IR, true) + configuration.put(CommonConfigurationKeys.USE_FIR, useK2) AbstractLoadJavaTest.updateConfigurationWithDirectives(content, configuration) val environment = KotlinCoreEnvironment.createForTests(disposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) setupLanguageVersionSettingsForCompilerTests(content, environment) diff --git a/libraries/tools/kotlinp/testData/Delegation.kt b/libraries/tools/kotlinp/testData/Delegation.kt new file mode 100644 index 00000000000..41ed3c6ec5d --- /dev/null +++ b/libraries/tools/kotlinp/testData/Delegation.kt @@ -0,0 +1,7 @@ +interface I { + fun foo() +} + +class A(i: I): I by i { + +} \ No newline at end of file diff --git a/libraries/tools/kotlinp/testData/Delegation.txt b/libraries/tools/kotlinp/testData/Delegation.txt new file mode 100644 index 00000000000..f3f607d9272 --- /dev/null +++ b/libraries/tools/kotlinp/testData/Delegation.txt @@ -0,0 +1,25 @@ +// A.class +// ------------------------------------------ +public final class A : I { + + // signature: (LI;)V + public constructor(i: I) + + // signature: foo()V + public open /* delegation */ fun foo(): kotlin/Unit + + // module name: test-module +} +// I.class +// ------------------------------------------ +public abstract interface I : kotlin/Any { + + // signature: foo()V + public abstract fun foo(): kotlin/Unit + + // module name: test-module +} +// META-INF/test-module.kotlin_module +// ------------------------------------------ +module { +}