From 6fb6f04509e985d15ffd13ccc2e9241db96b36ae Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Wed, 6 Mar 2024 18:23:41 +0000 Subject: [PATCH] [Gradle, Wasm] Not add target listeners for wasi projects ^KT-66373 fixed --- .../kotlin/gradle/KotlinWasmGradlePluginIT.kt | 15 ++++++++- .../app/build.gradle.kts | 29 +++++++++++++++++ .../app/src/commonMain/kotlin/B.kt | 8 +++++ .../build.gradle.kts | 31 +++++++++++++++++++ .../lib/build.gradle.kts | 10 ++++++ .../lib/src/commonMain/kotlin/A.kt | 6 ++++ .../packageLockStub | 0 .../settings.gradle | 4 +++ .../npm/resolver/KotlinProjectNpmResolver.kt | 14 +++++---- 9 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/app/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/app/src/commonMain/kotlin/B.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/lib/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/lib/src/commonMain/kotlin/A.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/packageLockStub create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/settings.gradle diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinWasmGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinWasmGradlePluginIT.kt index 06590d76481..41ab2383888 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinWasmGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinWasmGradlePluginIT.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.gradle import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.targets.js.dsl.Distribution import org.jetbrains.kotlin.gradle.testbase.* -import org.jetbrains.kotlin.gradle.util.modify import org.junit.jupiter.api.DisplayName import java.nio.file.Files import kotlin.io.path.writeText @@ -186,4 +185,18 @@ class KotlinWasmGradlePluginIT : KGPBaseTest() { } } } + + @DisplayName("Check mix project with wasi only dependency works correctly") + @GradleTest + fun jsAndWasiTargetsWithDependencyOnWasiOnlyProject(gradleVersion: GradleVersion) { + project("wasm-wasi-js-with-wasi-only-dependency", gradleVersion) { + buildGradleKts.modify(::transformBuildScriptWithPluginsDsl) + + build("build") { + assertTasksExecuted(":lib:compileKotlinWasmWasi") + assertTasksExecuted(":app:compileProductionExecutableKotlinWasmJs") + assertTasksExecuted(":app:compileProductionExecutableKotlinWasmWasi") + } + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/app/build.gradle.kts new file mode 100644 index 00000000000..d1688784589 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/app/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + kotlin("multiplatform") +} + +kotlin { + + wasmWasi { + binaries.executable() + nodejs {} + } + + wasmJs { + binaries.executable() + nodejs {} + } + + sourceSets { + wasmJsMain { + dependencies { + } + } + + wasmWasiMain { + dependencies { + implementation(project(":lib")) + } + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/app/src/commonMain/kotlin/B.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/app/src/commonMain/kotlin/B.kt new file mode 100644 index 00000000000..a5d5a67c792 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/app/src/commonMain/kotlin/B.kt @@ -0,0 +1,8 @@ +/* + * 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. + */ + +class B { + +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/build.gradle.kts new file mode 100644 index 00000000000..6ca5532cd56 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/build.gradle.kts @@ -0,0 +1,31 @@ +plugins { + kotlin("multiplatform").version("").apply(false) +} + +rootProject.plugins.withType { + rootProject.the().nodeVersion = "20.2.0" + + tasks.named("kotlinStorePackageLock") { + //A little hacky way to make yarn results + inputFile.fileValue(projectDir.resolve("packageLockStub")) + } +} + +rootProject.plugins.withType { + // Test that we can set the version and it is a String. + // But use the default version since update this place every time anyway. + rootProject.the().version = (version as String) +} + +allprojects.forEach { + it.tasks.withType().configureEach { + args.add("--ignore-engines") + } +} + +allprojects { + repositories { + mavenLocal() + mavenCentral() + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/lib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/lib/build.gradle.kts new file mode 100644 index 00000000000..ec6fe49a3a3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/lib/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + kotlin("multiplatform") +} + +kotlin { + + wasmWasi { + nodejs {} + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/lib/src/commonMain/kotlin/A.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/lib/src/commonMain/kotlin/A.kt new file mode 100644 index 00000000000..7e08f4f6539 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/lib/src/commonMain/kotlin/A.kt @@ -0,0 +1,6 @@ +/* + * 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. + */ + +class A \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/packageLockStub b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/packageLockStub new file mode 100644 index 00000000000..e69de29bb2d diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/settings.gradle new file mode 100644 index 00000000000..2d565bba918 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-wasi-js-with-wasi-only-dependency/settings.gradle @@ -0,0 +1,4 @@ +rootProject.name = "kotlin-wasm" + +include("lib") +include("app") \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt index aa7b27218a3..7b5d6a7408e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt @@ -12,10 +12,12 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension import org.jetbrains.kotlin.gradle.dsl.kotlinExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType -import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.js.npm.KotlinNpmResolutionManager import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinProjectNpmResolution +import org.jetbrains.kotlin.gradle.utils.withType import java.io.Serializable import kotlin.reflect.KClass @@ -24,7 +26,7 @@ import kotlin.reflect.KClass */ class KotlinProjectNpmResolver( project: Project, - var resolver: KotlinRootNpmResolver + var resolver: KotlinRootNpmResolver, ) : Serializable { val projectPath by lazy { project.path } @@ -52,19 +54,19 @@ class KotlinProjectNpmResolver( ?: error("NpmResolverPlugin should be applied after kotlin plugin") when (kotlin) { - is KotlinSingleTargetExtension<*> -> addTargetListeners(kotlin.target) - is KotlinMultiplatformExtension -> kotlin.targets.all { + is KotlinSingleTargetExtension<*> -> addTargetListeners(kotlin.target as KotlinJsIrTarget) + is KotlinMultiplatformExtension -> kotlin.targets.withType().configureEach { addTargetListeners(it) } else -> error("Unsupported kotlin model: $kotlin") } } - private fun addTargetListeners(target: KotlinTarget) { + private fun addTargetListeners(target: KotlinJsIrTarget) { check(resolution == null) { resolver.alreadyResolvedMessage("add target $target") } if (target.platformType == KotlinPlatformType.js || - target.platformType == KotlinPlatformType.wasm + target.platformType == KotlinPlatformType.wasm && target.wasmTargetType != KotlinWasmTargetType.WASI ) { target.compilations.all { compilation -> if (compilation is KotlinJsIrCompilation) {