diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt index 83679628163..b8b35625b57 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt @@ -867,6 +867,12 @@ object KotlinToolingDiagnostics { ) } } + + object WasmStabilityWarning : ToolingDiagnosticFactory(WARNING) { + operator fun invoke(): ToolingDiagnostic = + build("New 'wasm' target is Work-in-Progress and is subject to change without notice. " + + "Please report encountered issues to https://kotl.in/issue") + } } private fun String.indentLines(nSpaces: Int = 4, skipFirstLine: Boolean = true): String { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt index 4c41724a42a..5fab92ce6d2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.api.Project import org.jetbrains.kotlin.gradle.DeprecatedTargetPresetApi import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics +import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnosticOncePerBuild import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTargetPreset import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType @@ -23,7 +25,7 @@ class KotlinWasmTargetPreset( override fun instantiateTarget(name: String): KotlinJsIrTarget { if (!PropertiesProvider(project).wasmStabilityNoWarn) { - project.logger.warn("New 'wasm' target is Work-in-Progress and is subject to change without notice.") + project.reportDiagnosticOncePerBuild(KotlinToolingDiagnostics.WasmStabilityWarning()) } val irTarget = project.objects.newInstance(KotlinJsIrTarget::class.java, project, KotlinPlatformType.wasm) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/MppDiagnosticsFunctionalTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/MppDiagnosticsFunctionalTest.kt index f537b7b946d..b2b5fca38e2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/MppDiagnosticsFunctionalTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/MppDiagnosticsFunctionalTest.kt @@ -6,10 +6,11 @@ package org.jetbrains.kotlin.gradle.unitTests.diagnosticsTests import org.jetbrains.kotlin.gradle.dsl.targetFromPresetInternal +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmWithJavaTargetPreset -import org.jetbrains.kotlin.gradle.util.androidLibrary +import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl +import org.jetbrains.kotlin.gradle.util.* import org.jetbrains.kotlin.gradle.util.checkDiagnosticsWithMppProject -import org.jetbrains.kotlin.gradle.util.kotlin import org.junit.Test class MppDiagnosticsFunctionalTest { @@ -126,4 +127,39 @@ class MppDiagnosticsFunctionalTest { } } } + + @Test + @OptIn(ExperimentalWasmDsl::class) + fun wasmStabilityWarningReportedOncePerBuild() { + val rootProject = buildProjectWithMPP(projectBuilder = { withName("lib") }) { + kotlin { jvm(); wasmJs { browser() } } + } + val childProject = buildProjectWithMPP(projectBuilder = { withParent(rootProject).withName("app") }) { + kotlin { jvm(); wasmJs { browser() } } + } + childProject.evaluate() + rootProject.evaluate() + + // wasm target was declared first in the root project, so only root project should report it + rootProject.assertContainsDiagnostic(KotlinToolingDiagnostics.WasmStabilityWarning) + childProject.assertNoDiagnostics(KotlinToolingDiagnostics.WasmStabilityWarning) + } + + @Test + @OptIn(ExperimentalWasmDsl::class) + fun wasmStabilityWarningCanBeSuppressed() { + val rootProject = buildProjectWithMPP(projectBuilder = { withName("lib") }) { + enableWasmStabilityNoWarn() + kotlin { jvm(); wasmJs { browser() } } + } + val childProject = buildProjectWithMPP(projectBuilder = { withParent(rootProject).withName("app") }) { + enableWasmStabilityNoWarn() + kotlin { jvm(); wasmJs { browser() } } + } + childProject.evaluate() + rootProject.evaluate() + + rootProject.assertNoDiagnostics(KotlinToolingDiagnostics.WasmStabilityWarning) + childProject.assertNoDiagnostics(KotlinToolingDiagnostics.WasmStabilityWarning) + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/buildProject.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/buildProject.kt index 2f398a56506..660e687440a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/buildProject.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/buildProject.kt @@ -139,3 +139,6 @@ fun Project.enableDependencyVerification(enabled: Boolean = true) { else DependencyVerificationMode.OFF } +fun Project.enableWasmStabilityNoWarn(enabled: Boolean = true) { + propertiesExtension.set("kotlin.wasm.stability.nowarn", enabled.toString()) +} \ No newline at end of file