[Gradle] Migrate diagnostic about empty Kotlin targets in an MPP project

Also demote it from FATAL to ERROR, as FATAL leads to pretty disruptive
UX in IDE (import fails, and you don't get a broken project, which
makes it hard to fix the root cause and declare a target)
This commit is contained in:
Dmitry Savvinov
2023-04-19 17:21:55 +02:00
parent dcb51e64df
commit 63f61685c0
7 changed files with 54 additions and 7 deletions
@@ -8,8 +8,6 @@ package org.jetbrains.kotlin.gradle.mpp
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.testbase.*
import org.jetbrains.kotlin.gradle.util.replaceText
import org.jetbrains.kotlin.test.TestMetadata
import kotlin.io.path.appendText
import kotlin.io.path.writeText
@@ -26,7 +24,7 @@ class MppDiagnosticsIt : KGPBaseTest() {
}
@GradleTest
fun testDeprecatedProperties(gradleVersion: GradleVersion) {
fun testDeprecatedMppProperties(gradleVersion: GradleVersion) {
project("mppDeprecatedProperties", gradleVersion) {
checkDeprecatedProperties(isDeprecationExpected = false)
@@ -387,7 +387,6 @@ abstract class AbstractKotlinMultiplatformPluginWrapper : KotlinBasePluginWrappe
get() = KotlinMultiplatformExtension::class
override fun whenBuildEvaluated(project: Project) {
project.runMissingKotlinTargetsProjectConfigurationHealthCheck()
project.runDisabledCInteropCommonizationOnHmppProjectConfigurationHealthCheck()
}
}
@@ -100,7 +100,8 @@ internal interface KotlinGradleProjectChecker {
UnusedSourceSetsChecker,
AndroidSourceSetLayoutV1SourceSetsNotFoundChecker,
TargetsWithAmbiguousConsumableConfigurationsChecker,
AndroidPluginWithoutAndroidTargetChecker
AndroidPluginWithoutAndroidTargetChecker,
NoKotlinTargetsDeclaredChecker
)
}
}
@@ -7,8 +7,7 @@ package org.jetbrains.kotlin.gradle.plugin.diagnostics
import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.ERROR
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.WARNING
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.*
import org.jetbrains.kotlin.gradle.plugin.sources.android.multiplatformAndroidSourceSetLayoutV1
import org.jetbrains.kotlin.gradle.plugin.sources.android.multiplatformAndroidSourceSetLayoutV2
@@ -240,4 +239,13 @@ object KotlinToolingDiagnostics {
""".trimIndent()
)
}
object NoKotlinTargetsDeclared : ToolingDiagnosticFactory(ERROR) {
operator fun invoke(projectName: String, projectPath: String) = build(
"""
Please initialize at least one Kotlin target in '${projectName} (${projectPath})'.
Read more https://kotl.in/set-up-targets
""".trimIndent()
)
}
}
@@ -0,0 +1,22 @@
/*
* 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.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.plugin.mpp.KotlinMetadataTarget
internal object NoKotlinTargetsDeclaredChecker : KotlinGradleProjectChecker {
override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
val isNoTargetsInitialized = (multiplatformExtension ?: return).awaitTargets().none { it !is KotlinMetadataTarget }
if (isNoTargetsInitialized) {
collector.report(project, KotlinToolingDiagnostics.NoKotlinTargetsDeclared(project.name, project.path))
}
}
}
@@ -5,10 +5,14 @@
package org.jetbrains.kotlin.gradle.unitTests.diagnosticsTests
import org.gradle.api.InvalidUserCodeException
import org.gradle.api.attributes.Attribute
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmWithJavaTargetPreset
import org.jetbrains.kotlin.gradle.util.*
import org.junit.Test
import kotlin.jvm.Throws
import kotlin.test.assertTrue
class MppDiagnosticsFunctionalTest {
@@ -152,4 +156,11 @@ class MppDiagnosticsFunctionalTest {
}
}
}
@Test
fun testNoTargetsDeclared() {
checkDiagnosticsWithMppProject("noTargetsDeclared") {
kotlin { }
}
}
}
@@ -0,0 +1,8 @@
[NoKotlinTargetsDeclared | ERROR] Please initialize at least one Kotlin target in 'noTargetsDeclared (:)'.
Read more https://kotl.in/set-up-targets
----
[UnusedSourceSetsWarning | WARNING] The following Kotlin source sets were configured but not added to any Kotlin compilation:
* commonMain
* commonTest
You can add a source set to a target's compilation by connecting it with the compilation's default source set using 'dependsOn'.
See https://kotl.in/connecting-source-sets