From 841f5a583e493c24a66825f54b187b99ebc50d25 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Sat, 25 Sep 2021 12:46:21 +0300 Subject: [PATCH] [Wasm] Support wasm target in multiplatform plugin --- .../jetbrains/kotlin/cli/js/K2JsIrCompiler.kt | 2 +- .../gradle/plugin/KotlinPlatformType.kt | 2 +- .../kotlin/gradle/NewMultiplatformIT.kt | 24 +++++++++++++-- .../build.gradle.kts | 3 ++ .../src/wasm/kotlin/KotlinWasmUsage.kt | 5 ++++ .../sample-app/build.gradle | 2 ++ .../src/wasm/kotlin/KotlinWasmUsage.kt | 5 ++++ .../sample-external-lib/build.gradle | 1 + .../src/wasmMain/kotlin/Main.kt | 9 ++++++ .../wasmMain/resources/wasmMainResource.txt | 1 + .../build.gradle.kts | 1 + .../src/wasmMain/kotlin/Main.kt | 10 +++++++ .../wasmMain/resources/wasmMainResource.txt | 1 + .../sample-lib/build.gradle | 1 + .../sample-lib/src/wasmMain/kotlin/Main.kt | 10 +++++++ .../wasmMain/resources/wasmMainResource.txt | 1 + .../new-mpp-wasm-js/build.gradle.kts | 23 ++++++++++++++ .../new-mpp-wasm-js/settings.gradle.kts | 8 +++++ .../src/commonMain/kotlin/foo.kt | 1 + .../new-mpp-wasm-js/src/jsMain/kotlin/foo.kt | 1 + .../src/wasmMain/kotlin/foo.kt | 1 + .../dsl/KotlinMultiplatformExtension.kt | 1 + ...nTargetContainerWithWasmPresetFunctions.kt | 28 +++++++++++++++++ .../internal/KotlinDependenciesManagement.kt | 2 ++ .../kotlin/gradle/plugin/KotlinProperties.kt | 5 +++- .../plugin/mpp/KotlinMultiplatformPlugin.kt | 5 ++-- .../gradle/targets/js/ir/CompilerFlags.kt | 2 ++ .../gradle/targets/js/ir/KotlinJsIrLink.kt | 5 ++++ .../js/ir/KotlinJsIrTargetConfigurator.kt | 4 +++ .../targets/js/ir/KotlinJsIrTargetPreset.kt | 30 +++++++++++++++---- .../npm/resolver/KotlinProjectNpmResolver.kt | 3 +- .../kotlin-test-js-runner/build.gradle.kts | 6 ---- 32 files changed, 183 insertions(+), 20 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/src/wasm/kotlin/KotlinWasmUsage.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/src/wasm/kotlin/KotlinWasmUsage.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmMain/kotlin/Main.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmMain/resources/wasmMainResource.txt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmMain/kotlin/Main.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmMain/resources/wasmMainResource.txt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmMain/kotlin/Main.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmMain/resources/wasmMainResource.txt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/settings.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/commonMain/kotlin/foo.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/jsMain/kotlin/foo.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/wasmMain/kotlin/foo.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithWasmPresetFunctions.kt diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt index cffa821633a..42c54fdb281 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt @@ -319,7 +319,7 @@ class K2JsIrCompiler : CLICompiler() { outputWatFile.writeText(res.wat) val runner = """ - const ${sanitizeName(moduleName)} = WebAssembly.instantiateStreaming(fetch('${outputWasmFile.name}'), { runtime, js_code }).then((it) => { + export default WebAssembly.instantiateStreaming(fetch('${outputWasmFile.name}'), { runtime, js_code }).then((it) => { wasmInstance = it.instance; wasmInstance.exports.main?.(); return it.instance.exports; diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt index 0bfb56dd2bd..d0f4e0f0574 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt @@ -11,7 +11,7 @@ import org.gradle.util.GradleVersion import java.io.Serializable enum class KotlinPlatformType: Named, Serializable { - common, jvm, js, androidJvm, native; + common, jvm, js, androidJvm, native, wasm; override fun toString(): String = name override fun getName(): String = name diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index dfe2f44a24b..37220308576 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -1144,7 +1144,7 @@ class NewMultiplatformIT : BaseGradleIT() { } assertEquals( - setOf("commonMain", "jvm6Main", "linux64Main", "linuxMipsel32Main", "macos64Main", "mingw64Main", "mingw86Main", "nodeJsMain"), + setOf("commonMain", "jvm6Main", "linux64Main", "linuxMipsel32Main", "macos64Main", "mingw64Main", "mingw86Main", "nodeJsMain", "wasmMain"), sourceJarSourceRoots[null] ) assertEquals(setOf("commonMain", "jvm6Main"), sourceJarSourceRoots["jvm6"]) @@ -1472,7 +1472,7 @@ class NewMultiplatformIT : BaseGradleIT() { } val expectedDefaultSourceSets = listOf( - "jvm6", "nodeJs", "mingw64", "mingw86", "linux64", "macos64", "linuxMipsel32" + "jvm6", "nodeJs", "mingw64", "mingw86", "linux64", "macos64", "linuxMipsel32", "wasm" ).flatMapTo(mutableSetOf()) { target -> listOf("main", "test").map { compilation -> Triple(target, compilation, "$target${compilation.capitalize()}") @@ -1872,6 +1872,26 @@ class NewMultiplatformIT : BaseGradleIT() { } } + @Test + fun testWasmJs() = with(Project("new-mpp-wasm-js", gradleVersion)) { + setupWorkingDir() + gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) + build("build") { + assertSuccessful() + assertTasksExecuted(":compileKotlinJs") + assertTasksExecuted(":compileKotlinWasm") + + val outputPrefix = "build/js/packages/" + + val jsOutput = outputPrefix + "redefined-js-module-name/kotlin/" + assertFileExists(jsOutput + "redefined-js-module-name.js") + + val wasmOutput = outputPrefix + "redefined-wasm-module-name/kotlin/" + assertFileExists(wasmOutput + "redefined-wasm-module-name.js") + assertFileExists(wasmOutput + "redefined-wasm-module-name.wasm") + } + } + private fun detectNativeEnabledCompilation(): String = when { HostManager.hostIsLinux -> "linuxX64" HostManager.hostIsMingw -> "mingwX64" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/build.gradle.kts index c3d2e748266..27123df1a39 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/build.gradle.kts @@ -22,6 +22,9 @@ kotlin { val nodeJs = js("nodeJs") val linux64 = linuxX64("linux64") + wasm { + } + configure(listOf(linux64)) { binaries.executable("main", listOf(DEBUG)) { entryPoint = "com.example.app.native.main" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/src/wasm/kotlin/KotlinWasmUsage.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/src/wasm/kotlin/KotlinWasmUsage.kt new file mode 100644 index 00000000000..e1e67dda982 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/src/wasm/kotlin/KotlinWasmUsage.kt @@ -0,0 +1,5 @@ +import com.example.lib.* + +fun wasmMain(args: Array) { + println("${id(123)} ${idUsage()} ${expectedFun()}") +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/build.gradle index 3a6a2078c1e..88f74c3d5ba 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/build.gradle @@ -48,6 +48,8 @@ kotlin { js('nodeJs') + wasm() + targets { fromPreset(presets.jvm, 'jvm6') { attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 6) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/src/wasm/kotlin/KotlinWasmUsage.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/src/wasm/kotlin/KotlinWasmUsage.kt new file mode 100644 index 00000000000..e1e67dda982 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/src/wasm/kotlin/KotlinWasmUsage.kt @@ -0,0 +1,5 @@ +import com.example.lib.* + +fun wasmMain(args: Array) { + println("${id(123)} ${idUsage()} ${expectedFun()}") +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/build.gradle index 06627a4872a..1724c5dde35 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/build.gradle @@ -22,6 +22,7 @@ kotlin { // Check the new preset functions: jvm('jvm6') { } js('nodeJs') + wasm() targetFromPreset(presets.jvm, 'jvm6') { println targetName } // access existing target targets { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmMain/kotlin/Main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmMain/kotlin/Main.kt new file mode 100644 index 00000000000..85c64c9eadf --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmMain/kotlin/Main.kt @@ -0,0 +1,9 @@ +package com.example.externalLib + +fun idUsage() = id("123") + +actual fun expectedFun() = Unit + +fun main(args: Array) { + expectedFun() +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmMain/resources/wasmMainResource.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmMain/resources/wasmMainResource.txt new file mode 100644 index 00000000000..d2c4f080510 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmMain/resources/wasmMainResource.txt @@ -0,0 +1 @@ +resource \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/build.gradle.kts index 151ef79d1ee..d5678a22267 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/build.gradle.kts @@ -15,6 +15,7 @@ kotlin { val jvm = jvm("jvm6") val js = js("nodeJs") linuxX64("linux64") + wasm() targets.all { mavenPublication(Action { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmMain/kotlin/Main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmMain/kotlin/Main.kt new file mode 100644 index 00000000000..cd748e31eeb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmMain/kotlin/Main.kt @@ -0,0 +1,10 @@ +package com.example.lib + +fun idUsage() = id("123") + +actual fun expectedFun() { +} + +fun main(args: Array) { + expectedFun() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmMain/resources/wasmMainResource.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmMain/resources/wasmMainResource.txt new file mode 100644 index 00000000000..c3c6e070ec9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmMain/resources/wasmMainResource.txt @@ -0,0 +1 @@ +Wasm resource \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/build.gradle index b52780a7443..33a49c74525 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/build.gradle @@ -22,6 +22,7 @@ kotlin { // Check the new preset functions: jvm('jvm6') { } js('nodeJs') + wasm() targetFromPreset(presets.jvm, 'jvm6') { println targetName } // access existing target targets { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmMain/kotlin/Main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmMain/kotlin/Main.kt new file mode 100644 index 00000000000..cd748e31eeb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmMain/kotlin/Main.kt @@ -0,0 +1,10 @@ +package com.example.lib + +fun idUsage() = id("123") + +actual fun expectedFun() { +} + +fun main(args: Array) { + expectedFun() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmMain/resources/wasmMainResource.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmMain/resources/wasmMainResource.txt new file mode 100644 index 00000000000..c3c6e070ec9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmMain/resources/wasmMainResource.txt @@ -0,0 +1 @@ +Wasm resource \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/build.gradle.kts new file mode 100644 index 00000000000..ae565d2cef9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/build.gradle.kts @@ -0,0 +1,23 @@ +plugins { + kotlin("multiplatform").version("") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + wasm { + moduleName = "redefined-wasm-module-name" + browser { + } + binaries.executable() + } + js { + moduleName = "redefined-js-module-name" + browser { + } + binaries.executable() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/settings.gradle.kts new file mode 100644 index 00000000000..f6c3b197601 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/settings.gradle.kts @@ -0,0 +1,8 @@ +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + } +} + +rootProject.name = "new-mpp-wasm-js" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/commonMain/kotlin/foo.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/commonMain/kotlin/foo.kt new file mode 100644 index 00000000000..f5ed19d2be4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/commonMain/kotlin/foo.kt @@ -0,0 +1 @@ +expect fun foo(): Int \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/jsMain/kotlin/foo.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/jsMain/kotlin/foo.kt new file mode 100644 index 00000000000..37409afcf88 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/jsMain/kotlin/foo.kt @@ -0,0 +1 @@ +actual fun foo(): Int = 1 \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/wasmMain/kotlin/foo.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/wasmMain/kotlin/foo.kt new file mode 100644 index 00000000000..0ab8583e056 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/wasmMain/kotlin/foo.kt @@ -0,0 +1 @@ +actual fun foo(): Int = 2 \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt index fa245bc9810..2452e4d7afa 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt @@ -17,6 +17,7 @@ open class KotlinMultiplatformExtension(project: Project) : KotlinProjectExtension(project), KotlinTargetContainerWithPresetFunctions, KotlinTargetContainerWithJsPresetFunctions, + KotlinTargetContainerWithWasmPresetFunctions, KotlinTargetContainerWithNativeShortcuts { override lateinit var presets: NamedDomainObjectCollection> internal set diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithWasmPresetFunctions.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithWasmPresetFunctions.kt new file mode 100644 index 00000000000..c8051a4202d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithWasmPresetFunctions.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2020 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.gradle.dsl + +import groovy.lang.Closure +import org.gradle.util.ConfigureUtil +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset + +interface KotlinTargetContainerWithWasmPresetFunctions : KotlinTargetContainerWithPresetFunctions { + fun wasm( + name: String = "wasm", + configure: KotlinJsTargetDsl.() -> Unit = { } + ): KotlinJsTargetDsl = + configureOrCreate( + name, + presets.getByName("wasm") as KotlinJsIrTargetPreset, + configure + ) + + fun wasm() = wasm("wasm") { } + fun wasm(name: String) = wasm(name) { } + fun wasm(name: String, configure: Closure<*>) = wasm(name) { ConfigureUtil.configure(configure, this) } + fun wasm(configure: Closure<*>) = wasm { ConfigureUtil.configure(configure, this) } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt index 44ff5b6ac2a..7b0cd2b9868 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt @@ -138,6 +138,7 @@ private fun addStdlibToPm20Project( KotlinPlatformType.common -> error("variants are not expected to be common") KotlinPlatformType.jvm -> "kotlin-stdlib" // TODO get JDK from JVM variants KotlinPlatformType.js -> "kotlin-stdlib-js" + KotlinPlatformType.wasm -> "kotlin-stdlib-wasm" KotlinPlatformType.androidJvm -> null // TODO: expect support on the AGP side? KotlinPlatformType.native -> null } @@ -189,6 +190,7 @@ private fun chooseAndAddStdlibDependency( KotlinPlatformType.androidJvm -> if (kotlinSourceSet.name == androidMainSourceSetName(project)) stdlibModuleForJvmCompilations(compilations) else null KotlinPlatformType.js -> "kotlin-stdlib-js" + KotlinPlatformType.wasm -> "kotlin-stdlib-wasm" KotlinPlatformType.native -> null KotlinPlatformType.common -> // there's no platform compilation that the source set is default for "kotlin-stdlib-common" diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt index ad2c20b0759..55294dc951f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt @@ -159,7 +159,10 @@ internal fun PropertiesProvider.mapKotlinDaemonProperties(task: CompileUsingKotl val mppStabilityNoWarn: Boolean? get() = booleanProperty(KotlinMultiplatformPlugin.STABILITY_NOWARN_FLAG) - val ignoreDisabledNativeTargets: Boolean? + val wasmStabilityNoWarn: Boolean + get() = booleanProperty("kotlin.wasm.stability.nowarn") ?: false + + val ignoreDisabledNativeTargets: Boolean? get() = booleanProperty(DisabledNativeTargetsReporter.DISABLE_WARNING_PROPERTY_NAME) val ignoreIncorrectNativeDependencies: Boolean? diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index e1cf124ca0c..ada4db768fb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -174,13 +174,14 @@ class KotlinMultiplatformPlugin : Plugin { with(project.multiplatformExtension.presets) { add(KotlinJvmTargetPreset(project)) add(KotlinJsTargetPreset(project).apply { irPreset = null }) - add(KotlinJsIrTargetPreset(project).apply { mixedMode = false }) + add(KotlinJsIrTargetPreset(project, isWasm = false).apply { mixedMode = false }) add( KotlinJsTargetPreset(project).apply { - irPreset = KotlinJsIrTargetPreset(project) + irPreset = KotlinJsIrTargetPreset(project, isWasm = false) .apply { mixedMode = true } } ) + add(KotlinJsIrTargetPreset(project, isWasm = true).apply { mixedMode = false }) add(KotlinAndroidTargetPreset(project)) add(KotlinJvmWithJavaTargetPreset(project)) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/CompilerFlags.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/CompilerFlags.kt index 04bc081f60d..19be16f2c5a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/CompilerFlags.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/CompilerFlags.kt @@ -26,5 +26,7 @@ internal const val MODULE_NAME = "-Xir-module-name" internal const val PER_MODULE_OUTPUT_NAME = "-Xir-per-module-output-name" +internal const val WASM_BACKEND = "-Xwasm" + fun KotlinJsOptions.isProduceUnzippedKlib() = PRODUCE_UNZIPPED_KLIB in freeCompilerArgs fun KotlinJsOptions.isProduceZippedKlib() = PRODUCE_ZIPPED_KLIB in freeCompilerArgs \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt index bdff7dfd5da..76c6a57c151 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinJsOptionsImpl import org.jetbrains.kotlin.gradle.dsl.copyFreeCompilerArgsToArgs import org.jetbrains.kotlin.gradle.logging.GradlePrintingMessageCollector import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService @@ -184,6 +185,10 @@ abstract class KotlinJsIrLink @Inject constructor( freeCompilerArgs += additionalCompilerArgs.toList() + PRODUCE_JS + "$ENTRY_IR_MODULE=${entryModule.get().asFile.canonicalPath}" + + if (compilation.platformType == KotlinPlatformType.wasm) { + freeCompilerArgs += WASM_BACKEND + } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt index 2883b7267f3..1a207faf70e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt @@ -71,6 +71,10 @@ open class KotlinJsIrTargetConfigurator() : target.compilations.all { compilation -> compilation.kotlinOptions { configureOptions() + + if (target.platformType == KotlinPlatformType.wasm) { + freeCompilerArgs = freeCompilerArgs + WASM_BACKEND + } var produceUnzippedKlib = isProduceUnzippedKlib() val produceZippedKlib = isProduceZippedKlib() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt index 2933aa08948..a7b635235c9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt @@ -16,7 +16,8 @@ import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheckWhenE import org.jetbrains.kotlin.statistics.metrics.StringMetrics open class KotlinJsIrTargetPreset( - project: Project + project: Project, + isWasm: Boolean, ) : KotlinOnlyTargetPreset( project ) { @@ -25,10 +26,21 @@ open class KotlinJsIrTargetPreset( open val isMpp: Boolean get() = true - override val platformType: KotlinPlatformType - get() = KotlinPlatformType.js + override val platformType: KotlinPlatformType = + if (isWasm) + KotlinPlatformType.wasm + else + KotlinPlatformType.js override fun instantiateTarget(name: String): KotlinJsIrTarget { + if (platformType == KotlinPlatformType.wasm && !PropertiesProvider(project).wasmStabilityNoWarn) { + project.logger.warn( + """ + New 'wasm' target is Work-in-Progress and is subject to change without notice. + """.trimIndent() + ) + } + return project.objects.newInstance(KotlinJsIrTarget::class.java, project, platformType, mixedMode).apply { this.isMpp = this@KotlinJsIrTargetPreset.isMpp if (!mixedMode) { @@ -64,7 +76,11 @@ open class KotlinJsIrTargetPreset( override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator = KotlinJsIrTargetConfigurator() - override fun getName(): String = PRESET_NAME + override fun getName(): String = when (platformType) { + KotlinPlatformType.wasm -> WASM_PRESET_NAME + KotlinPlatformType.js -> JS_PRESET_NAME + else -> error("Unsupported platform type") + } //TODO[Ilya Goncharov] remove public morozov public override fun createCompilationFactory( @@ -73,17 +89,19 @@ open class KotlinJsIrTargetPreset( KotlinJsIrCompilationFactory(project, forTarget) companion object { - val PRESET_NAME = lowerCamelCaseName( + val JS_PRESET_NAME = lowerCamelCaseName( "js", KotlinJsCompilerType.IR.lowerName ) + private const val WASM_PRESET_NAME = "wasm" } } class KotlinJsIrSingleTargetPreset( project: Project ) : KotlinJsIrTargetPreset( - project + project, + isWasm = false, ) { override val isMpp: Boolean get() = false diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt index 4156f82259f..7bb0a91ac48 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt @@ -89,7 +89,8 @@ internal class KotlinProjectNpmResolver( private fun addTargetListeners(target: KotlinTarget) { check(!closed) { resolver.alreadyResolvedMessage("add target $target") } - if (target.platformType == KotlinPlatformType.js) { + if (target.platformType == KotlinPlatformType.js || + target.platformType == KotlinPlatformType.wasm) { target.compilations.all { compilation -> if (compilation is KotlinJsCompilation) { // compilation may be KotlinWithJavaTarget for old Kotlin2JsPlugin diff --git a/libraries/tools/kotlin-test-js-runner/build.gradle.kts b/libraries/tools/kotlin-test-js-runner/build.gradle.kts index 751fc038ecd..927464882ba 100644 --- a/libraries/tools/kotlin-test-js-runner/build.gradle.kts +++ b/libraries/tools/kotlin-test-js-runner/build.gradle.kts @@ -12,12 +12,6 @@ publish() val default = configurations.getByName(Dependency.DEFAULT_CONFIGURATION) default.extendsFrom(configurations.publishedRuntime.get()) -dependencies { - if (!kotlinBuildProperties.isInJpsBuildIdeaSync) { - publishedRuntime(project(":kotlin-test:kotlin-test-js")) - } -} - node { version.set("16.2.0") download.set(true)