diff --git a/build.gradle.kts b/build.gradle.kts index 9206e85..29040ac 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,7 @@ plugins { alias(libs.plugins.kotlin.jvm) apply false alias(libs.plugins.kotlin.multiplatform) apply false + alias(libs.plugins.node.gradle) apply false alias(libs.plugins.kotlin.binary.compatibility.validator) apply false alias(libs.plugins.buildconfig) apply false } diff --git a/compiler-plugin/build.gradle.kts b/compiler-plugin/build.gradle.kts index d64f3cf..23fbbb1 100644 --- a/compiler-plugin/build.gradle.kts +++ b/compiler-plugin/build.gradle.kts @@ -2,6 +2,7 @@ plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.buildconfig) alias(libs.plugins.gradle.java.test.fixtures) + alias(libs.plugins.node.gradle) alias(libs.plugins.gradle.idea) } @@ -24,6 +25,7 @@ idea { } val annotationsRuntimeClasspath: Configuration by configurations.creating { isTransitive = false } +val testArtifacts: Configuration by configurations.creating dependencies { compileOnly(libs.kotlin.compiler) @@ -35,11 +37,15 @@ dependencies { annotationsRuntimeClasspath(project(":plugin-annotations")) // Dependencies required to run the internal test framework. - testRuntimeOnly(libs.junit) - testRuntimeOnly(libs.kotlin.reflect) - testRuntimeOnly(libs.kotlin.test) - testRuntimeOnly(libs.kotlin.script.runtime) - testRuntimeOnly(libs.kotlin.annotations.jvm) + testArtifacts(libs.kotlin.stdlib) + testArtifacts(libs.kotlin.stdlib.jdk8) + testArtifacts(libs.kotlin.reflect) + testArtifacts(libs.kotlin.test) + testArtifacts(libs.kotlin.script.runtime) + testArtifacts(libs.kotlin.annotations.jvm) + + testArtifacts(kotlin("stdlib-js")) + testArtifacts(kotlin("test-js")) } buildConfig { @@ -67,6 +73,10 @@ tasks.test { setLibraryProperty("org.jetbrains.kotlin.test.kotlin-script-runtime", "kotlin-script-runtime") setLibraryProperty("org.jetbrains.kotlin.test.kotlin-annotations-jvm", "kotlin-annotations-jvm") + setLibraryProperty("org.jetbrains.kotlin.test.kotlin-stdlib-js", "kotlin-stdlib-js") + setLibraryProperty("org.jetbrains.kotlin.test.kotlin-test-js", "kotlin-test-js") + + systemProperty("kotlin.js.test.root.out.dir", "${node.nodeProjectDir.get().asFile}/") systemProperty("idea.ignore.disabled.plugins", "true") systemProperty("idea.home.path", rootDir) } @@ -95,10 +105,8 @@ tasks.compileTestKotlin { } fun Test.setLibraryProperty(propName: String, jarName: String) { - val path = project.configurations - .testRuntimeClasspath.get() - .files - .find { """$jarName-\d.*jar""".toRegex().matches(it.name) } + val path = testArtifacts.files + .find { """$jarName-\d.*""".toRegex().matches(it.name) } ?.absolutePath ?: return systemProperty(propName, path) diff --git a/compiler-plugin/src/org/jetbrains/kotlin/compiler/plugin/template/SimpleCommandLineProcessor.kt b/compiler-plugin/src/org/jetbrains/kotlin/compiler/plugin/template/SimpleCommandLineProcessor.kt index e6ba9b7..db83478 100644 --- a/compiler-plugin/src/org/jetbrains/kotlin/compiler/plugin/template/SimpleCommandLineProcessor.kt +++ b/compiler-plugin/src/org/jetbrains/kotlin/compiler/plugin/template/SimpleCommandLineProcessor.kt @@ -7,9 +7,10 @@ import org.jetbrains.kotlin.config.CompilerConfiguration @Suppress("unused") // Used via reflection. class SimpleCommandLineProcessor : CommandLineProcessor { - override val pluginId: String = BuildConfig.KOTLIN_PLUGIN_ID - - override val pluginOptions: Collection = emptyList() + override val pluginId: String + get() = BuildConfig.KOTLIN_PLUGIN_ID + override val pluginOptions: Collection + get() = emptyList() override fun processOption(option: AbstractCliOption, value: String, configuration: CompilerConfiguration) { error("Unexpected config option: '${option.optionName}'") diff --git a/compiler-plugin/src/org/jetbrains/kotlin/compiler/plugin/template/SimplePluginComponentRegistrar.kt b/compiler-plugin/src/org/jetbrains/kotlin/compiler/plugin/template/SimplePluginComponentRegistrar.kt index 913adc2..ad9db16 100644 --- a/compiler-plugin/src/org/jetbrains/kotlin/compiler/plugin/template/SimplePluginComponentRegistrar.kt +++ b/compiler-plugin/src/org/jetbrains/kotlin/compiler/plugin/template/SimplePluginComponentRegistrar.kt @@ -6,7 +6,9 @@ import org.jetbrains.kotlin.compiler.plugin.template.ir.SimpleIrGenerationExtens import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter -class SimplePluginComponentRegistrar: CompilerPluginRegistrar() { +class SimplePluginComponentRegistrar : CompilerPluginRegistrar() { + override val pluginId: String + get() = BuildConfig.KOTLIN_PLUGIN_ID override val supportsK2: Boolean get() = true diff --git a/compiler-plugin/test-fixtures/org/jetbrains/kotlin/compiler/plugin/template/GenerateTests.kt b/compiler-plugin/test-fixtures/org/jetbrains/kotlin/compiler/plugin/template/GenerateTests.kt index 66d7096..b0efa32 100644 --- a/compiler-plugin/test-fixtures/org/jetbrains/kotlin/compiler/plugin/template/GenerateTests.kt +++ b/compiler-plugin/test-fixtures/org/jetbrains/kotlin/compiler/plugin/template/GenerateTests.kt @@ -1,8 +1,9 @@ package org.jetbrains.kotlin.compiler.plugin.template +import org.jetbrains.kotlin.compiler.plugin.template.runners.AbstractJsBoxTest import org.jetbrains.kotlin.compiler.plugin.template.runners.AbstractJvmBoxTest import org.jetbrains.kotlin.compiler.plugin.template.runners.AbstractJvmDiagnosticTest -import org.jetbrains.kotlin.generators.generateTestGroupSuiteWithJUnit5 +import org.jetbrains.kotlin.generators.dsl.junit5.generateTestGroupSuiteWithJUnit5 fun main() { generateTestGroupSuiteWithJUnit5 { @@ -14,6 +15,10 @@ fun main() { testClass { model("box") } + + testClass { + model("box") + } } } } diff --git a/compiler-plugin/test-fixtures/org/jetbrains/kotlin/compiler/plugin/template/runners/AbstractJsBoxTest.kt b/compiler-plugin/test-fixtures/org/jetbrains/kotlin/compiler/plugin/template/runners/AbstractJsBoxTest.kt new file mode 100644 index 0000000..aef6ab1 --- /dev/null +++ b/compiler-plugin/test-fixtures/org/jetbrains/kotlin/compiler/plugin/template/runners/AbstractJsBoxTest.kt @@ -0,0 +1,39 @@ +package org.jetbrains.kotlin.compiler.plugin.template.runners + +import org.jetbrains.kotlin.compiler.plugin.template.services.configurePlugin +import org.jetbrains.kotlin.js.test.fir.AbstractFirLightTreeJsBoxTest +import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder +import org.jetbrains.kotlin.test.directives.CodegenTestDirectives +import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives +import org.jetbrains.kotlin.test.services.EnvironmentBasedStandardLibrariesPathProvider +import org.jetbrains.kotlin.test.services.KotlinStandardLibrariesPathProvider + +open class AbstractJsBoxTest : AbstractFirLightTreeJsBoxTest() { + override fun createKotlinStandardLibrariesPathProvider(): KotlinStandardLibrariesPathProvider { + return EnvironmentBasedStandardLibrariesPathProvider + } + + override fun configure(builder: TestConfigurationBuilder) { + super.configure(builder) + + with(builder) { + /* + * Containers of different directives, which can be used in tests: + * - ModuleStructureDirectives + * - LanguageSettingsDirectives + * - DiagnosticsDirectives + * - FirDiagnosticsDirectives + * - CodegenTestDirectives + * - JvmEnvironmentConfigurationDirectives + * + * All of them are located in `org.jetbrains.kotlin.test.directives` package + */ + defaultDirectives { + +CodegenTestDirectives.DUMP_IR + +FirDiagnosticsDirectives.FIR_DUMP + } + + configurePlugin() + } + } +} diff --git a/compiler-plugin/test-gen/org/jetbrains/kotlin/compiler/plugin/template/runners/JsBoxTestGenerated.java b/compiler-plugin/test-gen/org/jetbrains/kotlin/compiler/plugin/template/runners/JsBoxTestGenerated.java new file mode 100644 index 0000000..b9b034f --- /dev/null +++ b/compiler-plugin/test-gen/org/jetbrains/kotlin/compiler/plugin/template/runners/JsBoxTestGenerated.java @@ -0,0 +1,34 @@ + + +package org.jetbrains.kotlin.compiler.plugin.template.runners; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.compiler.plugin.template.GenerateTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler-plugin/testData/box") +@TestDataPath("$PROJECT_ROOT") +public class JsBoxTestGenerated extends AbstractJsBoxTest { + @Test + public void testAllFilesPresentInBox() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler-plugin/testData/box"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("anotherBoxTest.kt") + public void testAnotherBoxTest() { + runTest("compiler-plugin/testData/box/anotherBoxTest.kt"); + } + + @Test + @TestMetadata("simple.kt") + public void testSimple() { + runTest("compiler-plugin/testData/box/simple.kt"); + } +} diff --git a/compiler-plugin/test-gen/org/jetbrains/kotlin/compiler/plugin/template/runners/JvmBoxTestGenerated.java b/compiler-plugin/test-gen/org/jetbrains/kotlin/compiler/plugin/template/runners/JvmBoxTestGenerated.java index b20c218..0321cb6 100644 --- a/compiler-plugin/test-gen/org/jetbrains/kotlin/compiler/plugin/template/runners/JvmBoxTestGenerated.java +++ b/compiler-plugin/test-gen/org/jetbrains/kotlin/compiler/plugin/template/runners/JvmBoxTestGenerated.java @@ -4,7 +4,6 @@ import com.intellij.testFramework.TestDataPath; import org.jetbrains.kotlin.test.util.KtTestUtil; -import org.jetbrains.kotlin.test.TargetBackend; import org.jetbrains.kotlin.test.TestMetadata; import org.junit.jupiter.api.Test; @@ -18,7 +17,7 @@ public class JvmBoxTestGenerated extends AbstractJvmBoxTest { @Test public void testAllFilesPresentInBox() { - KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler-plugin/testData/box"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler-plugin/testData/box"), Pattern.compile("^(.+)\\.kt$"), null, true); } @Test diff --git a/compiler-plugin/test-gen/org/jetbrains/kotlin/compiler/plugin/template/runners/JvmDiagnosticTestGenerated.java b/compiler-plugin/test-gen/org/jetbrains/kotlin/compiler/plugin/template/runners/JvmDiagnosticTestGenerated.java index 2de866d..406819d 100644 --- a/compiler-plugin/test-gen/org/jetbrains/kotlin/compiler/plugin/template/runners/JvmDiagnosticTestGenerated.java +++ b/compiler-plugin/test-gen/org/jetbrains/kotlin/compiler/plugin/template/runners/JvmDiagnosticTestGenerated.java @@ -4,7 +4,6 @@ import com.intellij.testFramework.TestDataPath; import org.jetbrains.kotlin.test.util.KtTestUtil; -import org.jetbrains.kotlin.test.TargetBackend; import org.jetbrains.kotlin.test.TestMetadata; import org.junit.jupiter.api.Test; @@ -18,7 +17,7 @@ public class JvmDiagnosticTestGenerated extends AbstractJvmDiagnosticTest { @Test public void testAllFilesPresentInDiagnostics() { - KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler-plugin/testData/diagnostics"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler-plugin/testData/diagnostics"), Pattern.compile("^(.+)\\.kt$"), null, true); } @Test diff --git a/compiler-plugin/testData/box/anotherBoxTest.fir.ir.txt b/compiler-plugin/testData/box/anotherBoxTest.fir.ir.txt index e263b96..4e42a71 100644 --- a/compiler-plugin/testData/box/anotherBoxTest.fir.ir.txt +++ b/compiler-plugin/testData/box/anotherBoxTest.fir.ir.txt @@ -33,7 +33,7 @@ FILE fqName: fileName:/anotherBoxTest.kt then: STRING_CONCATENATION type=kotlin.String CONST String type=kotlin.String value="Fail: " GET_VAR 'val result: kotlin.Int declared in .box' type=kotlin.Int origin=null -FILE fqName:foo.bar fileName:__GENERATED DECLARATIONS__.kt +FILE fqName:foo.bar fileName:foo/bar/MyClass.kt CLASS GENERATED[org.jetbrains.kotlin.compiler.plugin.template.fir.SimpleClassGenerator.Key] CLASS name:MyClass modality:FINAL visibility:public superTypes:[kotlin.Any] thisReceiver: VALUE_PARAMETER INSTANCE_RECEIVER kind:DispatchReceiver name: type:foo.bar.MyClass CONSTRUCTOR GENERATED[org.jetbrains.kotlin.compiler.plugin.template.fir.SimpleClassGenerator.Key] visibility:public returnType:foo.bar.MyClass diff --git a/compiler-plugin/testData/box/anotherBoxTest.fir.txt b/compiler-plugin/testData/box/anotherBoxTest.fir.txt index b05bbb7..43860b7 100644 --- a/compiler-plugin/testData/box/anotherBoxTest.fir.txt +++ b/compiler-plugin/testData/box/anotherBoxTest.fir.txt @@ -15,7 +15,7 @@ FILE: anotherBoxTest.kt } } -FILE: __GENERATED DECLARATIONS__.kt +FILE: foo/bar/MyClass.kt package foo.bar public final class MyClass : R|kotlin/Any| { diff --git a/compiler-plugin/testData/box/simple.fir.ir.txt b/compiler-plugin/testData/box/simple.fir.ir.txt index 14640c9..3478e8f 100644 --- a/compiler-plugin/testData/box/simple.fir.ir.txt +++ b/compiler-plugin/testData/box/simple.fir.ir.txt @@ -18,7 +18,7 @@ FILE fqName:foo.bar fileName:/simple.kt STRING_CONCATENATION type=kotlin.String CONST String type=kotlin.String value="Fail: " GET_VAR 'val result: kotlin.String declared in foo.bar.box' type=kotlin.String origin=null -FILE fqName:foo.bar fileName:__GENERATED DECLARATIONS__.kt +FILE fqName:foo.bar fileName:foo/bar/MyClass.kt CLASS GENERATED[org.jetbrains.kotlin.compiler.plugin.template.fir.SimpleClassGenerator.Key] CLASS name:MyClass modality:FINAL visibility:public superTypes:[kotlin.Any] thisReceiver: VALUE_PARAMETER INSTANCE_RECEIVER kind:DispatchReceiver name: type:foo.bar.MyClass CONSTRUCTOR GENERATED[org.jetbrains.kotlin.compiler.plugin.template.fir.SimpleClassGenerator.Key] visibility:public returnType:foo.bar.MyClass diff --git a/compiler-plugin/testData/box/simple.fir.txt b/compiler-plugin/testData/box/simple.fir.txt index 914b694..f303b9d 100644 --- a/compiler-plugin/testData/box/simple.fir.txt +++ b/compiler-plugin/testData/box/simple.fir.txt @@ -13,7 +13,7 @@ FILE: simple.kt } } -FILE: __GENERATED DECLARATIONS__.kt +FILE: foo/bar/MyClass.kt package foo.bar public final class MyClass : R|kotlin/Any| { diff --git a/compiler-plugin/testData/diagnostics/anotherDiagnosticTest.fir.txt b/compiler-plugin/testData/diagnostics/anotherDiagnosticTest.fir.txt index 2580fb4..f12d734 100644 --- a/compiler-plugin/testData/diagnostics/anotherDiagnosticTest.fir.txt +++ b/compiler-plugin/testData/diagnostics/anotherDiagnosticTest.fir.txt @@ -7,7 +7,7 @@ FILE: foo.kt public final fun test(): R|kotlin/Unit| { R|foo/takeInt|(Int(10)) } -FILE: __GENERATED DECLARATIONS__.kt +FILE: foo/bar/MyClass.kt package foo.bar public final class MyClass : R|kotlin/Any| { @@ -24,7 +24,7 @@ FILE: bar.kt R|foo/takeInt|(Int(10)) R|foo/takeInt#|(String(Hello)) } -FILE: __GENERATED DECLARATIONS__.kt +FILE: foo/bar/MyClass.kt package foo.bar public final class MyClass : R|kotlin/Any| { diff --git a/compiler-plugin/testData/diagnostics/simple.fir.txt b/compiler-plugin/testData/diagnostics/simple.fir.txt index 074a97b..9b956f4 100644 --- a/compiler-plugin/testData/diagnostics/simple.fir.txt +++ b/compiler-plugin/testData/diagnostics/simple.fir.txt @@ -5,7 +5,7 @@ FILE: simple.kt lval s: R|kotlin/String| = R|foo/bar/MyClass|().R|foo/bar/MyClass.foo|() R|/s|.#() } -FILE: __GENERATED DECLARATIONS__.kt +FILE: foo/bar/MyClass.kt package foo.bar public final class MyClass : R|kotlin/Any| { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f610203..a813009 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,18 +1,19 @@ [versions] # https://github.com/JetBrains/kotlin -kotlin = "2.2.20" +kotlin = "2.3.0-RC" # https://github.com/Kotlin/binary-compatibility-validator kotlin-binaryCompatibilityValidator = "0.16.3" -# https://github.com/junit-team/junit4 -junit = "4.13.2" - # https://github.com/gmazzo/gradle-buildconfig-plugin buildconfig = "5.6.5" +node-gradle = "7.0.2" + [libraries] +kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "kotlin" } +kotlin-stdlib-jdk8 = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlin" } kotlin-test = { group = "org.jetbrains.kotlin", name = "kotlin-test", version.ref = "kotlin" } kotlin-script-runtime = { group = "org.jetbrains.kotlin", name = "kotlin-script-runtime", version.ref = "kotlin" } kotlin-test-junit5 = { group = "org.jetbrains.kotlin", name = "kotlin-test-junit5", version.ref = "kotlin" } @@ -22,13 +23,12 @@ kotlin-compiler = { group = "org.jetbrains.kotlin", name = "kotlin-compiler", ve kotlin-reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" } kotlin-gradle-plugin-api = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin-api", version.ref = "kotlin" } -junit = { module = "junit:junit", version.ref = "junit" } - [plugins] kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kotlin-binary-compatibility-validator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "kotlin-binaryCompatibilityValidator"} buildconfig = { id = "com.github.gmazzo.buildconfig", version.ref = "buildconfig"} +node-gradle = { id = "com.github.node-gradle.node", version.ref = "node-gradle" } gradle-java-test-fixtures = { id = "java-test-fixtures" } gradle-idea = { id = "idea" } diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock index ad5aacc..e35fa39 100644 --- a/kotlin-js-store/yarn.lock +++ b/kotlin-js-store/yarn.lock @@ -249,10 +249,10 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -kotlin-web-helpers@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/kotlin-web-helpers/-/kotlin-web-helpers-2.1.0.tgz#6cd4b0f0dc3baea163929c8638155b8d19c55a74" - integrity sha512-NAJhiNB84tnvJ5EQx7iER3GWw7rsTZkX9HVHZpe7E3dDBD/dhTzqgSwNU3MfQjniy2rB04bP24WM9Z32ntUWRg== +kotlin-web-helpers@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/kotlin-web-helpers/-/kotlin-web-helpers-3.0.0.tgz#3ed6b48f694f74bb60a737a9d7e2c0e3b29abdb9" + integrity sha512-kdQO4AJQkUPvpLh9aglkXDRyN+CfXO7pKq+GESEnxooBFkQpytLrqZis3ABvmFN1cGw/ZQ/K38u5sRGW+NfBnw== dependencies: format-util "^1.0.5" @@ -288,10 +288,10 @@ minimatch@^9.0.4, minimatch@^9.0.5: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -mocha@11.7.1: - version "11.7.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.1.tgz#91948fecd624fb4bd154ed260b7e1ad3910d7c7a" - integrity sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A== +mocha@11.7.2: + version "11.7.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.2.tgz#3c0079fe5cc2f8ea86d99124debcc42bb1ab22b5" + integrity sha512-lkqVJPmqqG/w5jmmFtiRvtA2jkDyNVUcefFJKb2uyX4dekk8Okgqop3cgbFiaIvj8uCRJVTP5x9dfxGyXm2jvQ== dependencies: browser-stdout "^1.3.1" chokidar "^4.0.1"