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 013551e69ca..3ad76dcd0a7 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 @@ -115,6 +115,7 @@ internal interface KotlinGradleProjectChecker { IosSourceSetConventionChecker, KotlinTargetAlreadyDeclaredChecker, InternalGradlePropertiesUsageChecker, + WasmSourceSetsNotFoundChecker, ) } } 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 47aa97ab84b..960f65ed455 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 @@ -642,6 +642,19 @@ object KotlinToolingDiagnostics { """.trimIndent(), ) } + + object WasmSourceSetsNotFoundError : ToolingDiagnosticFactory(ERROR) { + operator fun invoke(nameOfRequestedSourceSet: String) = build( + """ + KotlinSourceSet with name '$nameOfRequestedSourceSet' not found: + The SourceSet requested ('$nameOfRequestedSourceSet') was renamed in Kotlin 1.9.20 + + In order to migrate you might want to replace: + val wasmMain by getting -> val wasmJsMain by getting + val wasmTest by getting -> val wasmJsTest by getting + """.trimIndent() + ) + } } 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/plugin/diagnostics/checkers/WasmSourceSetsNotFoundChecker.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/WasmSourceSetsNotFoundChecker.kt new file mode 100644 index 00000000000..003ab5a9a26 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/WasmSourceSetsNotFoundChecker.kt @@ -0,0 +1,36 @@ +/* + * 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.gradle.api.UnknownDomainObjectException +import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle +import org.jetbrains.kotlin.gradle.plugin.configurationResult +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.tooling.core.withClosure + +internal object WasmSourceSetsNotFoundChecker : KotlinGradleProjectChecker { + + private val wasmSourceSetRegex by lazy { Regex("""(wasmMain|wasmTest)\w*""") } + + override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) { + val failure = project.configurationResult.await() as? KotlinPluginLifecycle.ProjectConfigurationResult.Failure ?: return + + val unknownWasmSourceSetNames = failure + .failures + .withClosure { listOfNotNull(it.cause) } + .filterIsInstance() + .filter { it.message.orEmpty().contains("KotlinSourceSet") } + .mapNotNull { wasmSourceSetRegex.find(it.message.orEmpty()) } + .map { it.value } + + unknownWasmSourceSetNames.forEach { unknownWasmSourceSetName -> + collector.report(project, KotlinToolingDiagnostics.WasmSourceSetsNotFoundError(unknownWasmSourceSetName)) + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/WasmSourceSetsNotFoundErrorTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/WasmSourceSetsNotFoundErrorTest.kt new file mode 100644 index 00000000000..e23f2624536 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/WasmSourceSetsNotFoundErrorTest.kt @@ -0,0 +1,59 @@ +/* + * 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. + */ + +@file:Suppress("FunctionName") + +package org.jetbrains.kotlin.gradle.unitTests.diagnosticsTests + +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics +import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic +import org.jetbrains.kotlin.gradle.plugin.diagnostics.kotlinToolingDiagnosticsCollector +import org.jetbrains.kotlin.gradle.plugin.launchInStage +import org.jetbrains.kotlin.gradle.util.assertContainsDiagnostic +import org.jetbrains.kotlin.gradle.util.assertNoDiagnostics +import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP +import org.junit.Test +import kotlin.test.assertFails + +class WasmSourceSetsNotFoundErrorTest { + + @Test + fun `wasmMain SourceSet`() { + diagnosticsForTestProjectRequestingMissingSourceSet("wasmMain") + .assertContainsDiagnostic(KotlinToolingDiagnostics.WasmSourceSetsNotFoundError("wasmMain")) + } + + @Test + fun `wasmTest SourceSet`() { + diagnosticsForTestProjectRequestingMissingSourceSet("wasmTest") + .assertContainsDiagnostic(KotlinToolingDiagnostics.WasmSourceSetsNotFoundError("wasmTest")) + } + + @Test + fun `wasmJsMain SourceSet - is not reported`() { + diagnosticsForTestProjectRequestingMissingSourceSet("wasmJsMain") + .assertNoDiagnostics(KotlinToolingDiagnostics.WasmSourceSetsNotFoundError) + } + + @Test + fun `wasmJsTest SourceSet - is not reported`() { + diagnosticsForTestProjectRequestingMissingSourceSet("wasmJsTest") + .assertNoDiagnostics(KotlinToolingDiagnostics.WasmSourceSetsNotFoundError) + } + + private fun diagnosticsForTestProjectRequestingMissingSourceSet(sourceSetName: String): List { + val project = buildProjectWithMPP() + val kotlin = project.multiplatformExtension + + project.launchInStage(KotlinPluginLifecycle.Stage.AfterEvaluateBuildscript) { + kotlin.sourceSets.getByName(sourceSetName) + } + + assertFails { project.evaluate() } + return project.kotlinToolingDiagnosticsCollector.getDiagnosticsForProject(project).toList() + } +}