[Gradle, WASM] Move stability warning to Diagnostics Infra

And report it only once per build, so it doesn't spam users with
multiple projects in the logs.

^KT-66429 Verification Pending
This commit is contained in:
Anton Lakotka
2024-03-08 09:41:34 +01:00
committed by Space Team
parent 08f6e21f5d
commit 753e365c9e
4 changed files with 50 additions and 3 deletions
@@ -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 { private fun String.indentLines(nSpaces: Int = 4, skipFirstLine: Boolean = true): String {
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.DeprecatedTargetPresetApi import org.jetbrains.kotlin.gradle.DeprecatedTargetPresetApi
import org.jetbrains.kotlin.gradle.plugin.* 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.KotlinCompilationFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTargetPreset import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTargetPreset
import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType
@@ -23,7 +25,7 @@ class KotlinWasmTargetPreset(
override fun instantiateTarget(name: String): KotlinJsIrTarget { override fun instantiateTarget(name: String): KotlinJsIrTarget {
if (!PropertiesProvider(project).wasmStabilityNoWarn) { 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) val irTarget = project.objects.newInstance(KotlinJsIrTarget::class.java, project, KotlinPlatformType.wasm)
@@ -6,10 +6,11 @@
package org.jetbrains.kotlin.gradle.unitTests.diagnosticsTests package org.jetbrains.kotlin.gradle.unitTests.diagnosticsTests
import org.jetbrains.kotlin.gradle.dsl.targetFromPresetInternal 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.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.checkDiagnosticsWithMppProject
import org.jetbrains.kotlin.gradle.util.kotlin
import org.junit.Test import org.junit.Test
class MppDiagnosticsFunctionalTest { 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)
}
} }
@@ -139,3 +139,6 @@ fun Project.enableDependencyVerification(enabled: Boolean = true) {
else DependencyVerificationMode.OFF else DependencyVerificationMode.OFF
} }
fun Project.enableWasmStabilityNoWarn(enabled: Boolean = true) {
propertiesExtension.set("kotlin.wasm.stability.nowarn", enabled.toString())
}