[Gradle, wasm] add checker about changed wasm source sets

^KT-61950 fixed
This commit is contained in:
Ilya Goncharov
2023-09-15 20:56:31 +00:00
committed by Space Team
parent c31a3869c6
commit afbfc9ce8e
4 changed files with 109 additions and 0 deletions
@@ -115,6 +115,7 @@ internal interface KotlinGradleProjectChecker {
IosSourceSetConventionChecker,
KotlinTargetAlreadyDeclaredChecker,
InternalGradlePropertiesUsageChecker,
WasmSourceSetsNotFoundChecker,
)
}
}
@@ -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 {
@@ -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<Throwable> { listOfNotNull(it.cause) }
.filterIsInstance<UnknownDomainObjectException>()
.filter { it.message.orEmpty().contains("KotlinSourceSet") }
.mapNotNull { wasmSourceSetRegex.find(it.message.orEmpty()) }
.map { it.value }
unknownWasmSourceSetNames.forEach { unknownWasmSourceSetName ->
collector.report(project, KotlinToolingDiagnostics.WasmSourceSetsNotFoundError(unknownWasmSourceSetName))
}
}
}
@@ -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<ToolingDiagnostic> {
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()
}
}