diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinGradleProjectChecker.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinGradleProjectChecker.kt index 2dc0a5f7bb3..443e51d7d52 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinGradleProjectChecker.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinGradleProjectChecker.kt @@ -103,7 +103,8 @@ internal interface KotlinGradleProjectChecker { AndroidPluginWithoutAndroidTargetChecker, NoKotlinTargetsDeclaredChecker, DisabledCinteropCommonizationInHmppProjectChecker, - DisabledNativeTargetsChecker + DisabledNativeTargetsChecker, + JsEnvironmentChecker ) } } 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 5f4d2c3e79d..120f426c18c 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 @@ -297,4 +297,19 @@ object KotlinToolingDiagnostics { severity ) } + + object JsEnvironmentNotChosenExplicitly : ToolingDiagnosticFactory(WARNING) { + operator fun invoke(availableEnvironments: List) = build( + """ + |Please choose a JavaScript environment to build distributions and run tests. + |Not choosing any of them will be an error in the future releases. + |kotlin { + | js { + | // To build distributions for and run tests on browser or Node.js use one or both of: + | ${availableEnvironments.joinToString(separator = "\n")} + | } + |} + """.trimMargin() + ) + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/JsEnvironmentChecker.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/JsEnvironmentChecker.kt new file mode 100644 index 00000000000..504736c9f29 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/JsEnvironmentChecker.kt @@ -0,0 +1,45 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.gradle.plugin.diagnostics.checkers + +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectChecker +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectCheckerContext +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnosticsCollector +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetContainerDsl +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinWasmSubTargetContainerDsl + +internal object JsEnvironmentChecker : KotlinGradleProjectChecker { + override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) { + val misconfiguredTarget = multiplatformExtension?.findMisconfiguredTargetIfAny() ?: return + + collector.reportOncePerGradleBuild( + project, + KotlinToolingDiagnostics.JsEnvironmentNotChosenExplicitly( + availableEnvironments = listOfNotNull( + "browser()", + "nodejs()", + "d8".takeIf { misconfiguredTarget.platformType == KotlinPlatformType.wasm } + ) + ) + ) + } + + private suspend fun KotlinMultiplatformExtension.findMisconfiguredTargetIfAny(): KotlinTarget? { + return awaitTargets() + .filter { it.platformType == KotlinPlatformType.js || it.platformType == KotlinPlatformType.wasm } + .find { + it.browserNotConfigured() && it.nodejsNotConfigured() && it.d8NotConfigured() + } + } + + private fun KotlinTarget.browserNotConfigured() = (this as? KotlinJsSubTargetContainerDsl)?.isBrowserConfigured == false + private fun KotlinTarget.nodejsNotConfigured() = (this as? KotlinJsSubTargetContainerDsl)?.isNodejsConfigured == false + private fun KotlinTarget.d8NotConfigured() = (this as? KotlinWasmSubTargetContainerDsl)?.isD8Configured == false +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt index a0e46a8750b..3e2a7676b32 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt @@ -57,21 +57,6 @@ open class KotlinJsTargetPreset( this.isMpp = this@KotlinJsTargetPreset.isMpp project.runProjectConfigurationHealthCheckWhenEvaluated { - if (!isBrowserConfigured && !isNodejsConfigured) { - project.logger.warn( - """ - Please choose a JavaScript environment to build distributions and run tests. - Not choosing any of them will be an error in the future releases. - kotlin { - js { - // To build distributions for and run tests on browser or Node.js use one or both of: - browser() - nodejs() - } - } - """.trimIndent() - ) - } val buildStatsService = KotlinBuildStatsService.getInstance() when { isBrowserConfigured && isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "both") diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt index 99d1b07d1fb..e69fb249ffa 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt @@ -33,21 +33,6 @@ open class KotlinJsIrTargetPreset( this.isMpp = this@KotlinJsIrTargetPreset.isMpp if (!mixedMode) { project.runProjectConfigurationHealthCheckWhenEvaluated { - if (!isBrowserConfigured && !isNodejsConfigured) { - project.logger.warn( - """ - Please choose a JavaScript environment to build distributions and run tests. - Not choosing any of them will be an error in the future releases. - kotlin { - js { - // To build distributions for and run tests on browser or Node.js use one or both of: - browser() - nodejs() - } - } - """.trimIndent() - ) - } val buildStatsService = KotlinBuildStatsService.getInstance() when { isBrowserConfigured && isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "both") 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 39b66cad3a6..8582709cf71 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 @@ -27,24 +27,6 @@ class KotlinWasmTargetPreset( val irTarget = project.objects.newInstance(KotlinJsIrTarget::class.java, project, KotlinPlatformType.wasm, false) irTarget.isMpp = true - project.runProjectConfigurationHealthCheckWhenEvaluated { - if (!irTarget.isBrowserConfigured && !irTarget.isNodejsConfigured && !irTarget.isD8Configured) { - project.logger.warn( - """ - Please choose a JavaScript environment to run tests. - kotlin { - wasm { - // To build distributions for and run tests on browser, Node.js or d8 use one: - browser() - nodejs() - d8() - } - } - """.trimIndent() - ) - } - } - return irTarget } @@ -61,4 +43,4 @@ class KotlinWasmTargetPreset( companion object { private const val WASM_PRESET_NAME = "wasm" } -} \ No newline at end of file +}