[Gradle] KGP Diagnostics: Run diagnostics launched & schedule report once Project is configured
KT-58275
This commit is contained in:
committed by
Space Team
parent
d170897dbf
commit
287c431bc4
+11
-22
@@ -42,7 +42,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory
|
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory
|
||||||
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
||||||
import org.jetbrains.kotlin.gradle.report.BuildMetricsService
|
import org.jetbrains.kotlin.gradle.report.BuildMetricsService
|
||||||
import org.jetbrains.kotlin.gradle.report.BuildReportsService
|
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilerAttribute
|
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilerAttribute
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsPlugin
|
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.addNpmDependencyExtension
|
import org.jetbrains.kotlin.gradle.targets.js.npm.addNpmDependencyExtension
|
||||||
@@ -246,7 +245,7 @@ abstract class KotlinBasePluginWrapper : DefaultKotlinBasePlugin() {
|
|||||||
|
|
||||||
project.registerBuildKotlinToolingMetadataTask()
|
project.registerBuildKotlinToolingMetadataTask()
|
||||||
|
|
||||||
project.scheduleDiagnosticChecksAndReporting()
|
project.launchDiagnosticChecksAndReporting()
|
||||||
}
|
}
|
||||||
|
|
||||||
internal open fun createTestRegistry(project: Project) = KotlinTestsRegistry(project)
|
internal open fun createTestRegistry(project: Project) = KotlinTestsRegistry(project)
|
||||||
@@ -254,27 +253,17 @@ abstract class KotlinBasePluginWrapper : DefaultKotlinBasePlugin() {
|
|||||||
internal abstract fun getPlugin(
|
internal abstract fun getPlugin(
|
||||||
project: Project,
|
project: Project,
|
||||||
): Plugin<Project>
|
): Plugin<Project>
|
||||||
|
}
|
||||||
|
|
||||||
private fun Project.scheduleDiagnosticChecksAndReporting() {
|
private fun Project.launchDiagnosticChecksAndReporting() {
|
||||||
|
project.launchKotlinGradleProjectCheckers()
|
||||||
|
project.launch {
|
||||||
launchInStage(KotlinPluginLifecycle.Stage.ReadyForExecution) {
|
project.configured.await()
|
||||||
// Do not run checkers on projects which configuration finished with failure,
|
renderReportedDiagnostics(
|
||||||
// as the internal state can not be trusted at this point (e.g. not entire of the
|
project.kotlinToolingDiagnosticsCollector.getDiagnosticsForProject(project),
|
||||||
// user's buildscript could've been executed) and might produce bogus warnings
|
project.logger,
|
||||||
runProjectConfigurationHealthCheck {
|
project.kotlinPropertiesProvider.internalVerboseDiagnostics
|
||||||
project.runKotlinGradleProjectCheckers()
|
)
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: this should run even if the application of KGP has finished with errors,
|
|
||||||
// because some diagnostics might indicate specifically the root cause of an
|
|
||||||
// exception.
|
|
||||||
renderReportedDiagnostics(
|
|
||||||
project.kotlinToolingDiagnosticsCollector.getDiagnosticsForProject(project),
|
|
||||||
project.logger,
|
|
||||||
project.kotlinPropertiesProvider.internalVerboseDiagnostics
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -23,8 +23,8 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.checkers.UnusedSourceSetsC
|
|||||||
* threw an exception). If your check aims to prevent some exception, then code that check as soon as possible in the `apply`-block
|
* threw an exception). If your check aims to prevent some exception, then code that check as soon as possible in the `apply`-block
|
||||||
* of the [org.jetbrains.kotlin.gradle.plugin.KotlinBasePluginWrapper] or appropriate inheritor
|
* of the [org.jetbrains.kotlin.gradle.plugin.KotlinBasePluginWrapper] or appropriate inheritor
|
||||||
*/
|
*/
|
||||||
internal fun interface KotlinGradleProjectChecker {
|
internal interface KotlinGradleProjectChecker {
|
||||||
fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector)
|
suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val ALL_CHECKERS: List<KotlinGradleProjectChecker> = listOf(
|
val ALL_CHECKERS: List<KotlinGradleProjectChecker> = listOf(
|
||||||
|
|||||||
+3
-2
@@ -9,8 +9,9 @@ import org.gradle.api.Project
|
|||||||
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
|
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
|
||||||
import org.jetbrains.kotlin.gradle.plugin.extraProperties
|
import org.jetbrains.kotlin.gradle.plugin.extraProperties
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.launch
|
||||||
|
|
||||||
internal fun Project.runKotlinGradleProjectCheckers() {
|
internal fun Project.launchKotlinGradleProjectCheckers() {
|
||||||
val checkers = kotlinGradleProjectCheckersOverride ?: KotlinGradleProjectChecker.ALL_CHECKERS
|
val checkers = kotlinGradleProjectCheckersOverride ?: KotlinGradleProjectChecker.ALL_CHECKERS
|
||||||
|
|
||||||
val context = KotlinGradleProjectCheckerContext(
|
val context = KotlinGradleProjectCheckerContext(
|
||||||
@@ -21,7 +22,7 @@ internal fun Project.runKotlinGradleProjectCheckers() {
|
|||||||
val collector = project.kotlinToolingDiagnosticsCollector
|
val collector = project.kotlinToolingDiagnosticsCollector
|
||||||
|
|
||||||
for (checker in checkers) {
|
for (checker in checkers) {
|
||||||
with(checker) { context.runChecks(collector) }
|
with(checker) { launch { context.runChecks(collector) } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectChecker
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.sources.internal
|
import org.jetbrains.kotlin.gradle.plugin.sources.internal
|
||||||
|
|
||||||
internal object CommonMainWithDependsOnChecker : KotlinGradleProjectChecker {
|
internal object CommonMainWithDependsOnChecker : KotlinGradleProjectChecker {
|
||||||
override fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
||||||
multiplatformExtension?.sourceSets?.all {
|
multiplatformExtension?.sourceSets?.all {
|
||||||
if (it.name == KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME) {
|
if (it.name == KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME) {
|
||||||
it.internal.dependsOn.forAll {
|
it.internal.dependsOn.forAll {
|
||||||
|
|||||||
+2
-2
@@ -13,8 +13,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
|
|||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
|
|
||||||
internal object DeprecatedKotlinNativeTargetsChecker : KotlinGradleProjectChecker {
|
internal object DeprecatedKotlinNativeTargetsChecker : KotlinGradleProjectChecker {
|
||||||
override fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
||||||
val targets = multiplatformExtension?.targets ?: return
|
val targets = multiplatformExtension?.awaitTargets() ?: return
|
||||||
val usedDeprecatedTargets = targets
|
val usedDeprecatedTargets = targets
|
||||||
.filter { it is KotlinNativeTarget && it.konanTarget in KonanTarget.deprecatedTargets }
|
.filter { it is KotlinNativeTarget && it.konanTarget in KonanTarget.deprecatedTargets }
|
||||||
.map { it.name }
|
.map { it.name }
|
||||||
|
|||||||
+2
-2
@@ -15,8 +15,8 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnosticsCo
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
|
||||||
|
|
||||||
internal object MissingNativeStdlibChecker : KotlinGradleProjectChecker {
|
internal object MissingNativeStdlibChecker : KotlinGradleProjectChecker {
|
||||||
override fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
||||||
val targets = multiplatformExtension?.targets ?: return
|
val targets = multiplatformExtension?.awaitTargets() ?: return
|
||||||
if (targets.isEmpty() || // misconfigured project
|
if (targets.isEmpty() || // misconfigured project
|
||||||
targets.none { it is KotlinNativeTarget } || // no K/N targets
|
targets.none { it is KotlinNativeTarget } || // no K/N targets
|
||||||
project.hasProperty("kotlin.native.nostdlib") || // suppressed
|
project.hasProperty("kotlin.native.nostdlib") || // suppressed
|
||||||
|
|||||||
+4
-3
@@ -10,15 +10,16 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectChecker
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
|
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
|
||||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnosticsCollector
|
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnosticsCollector
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.android.androidSourceSetInfoOrNull
|
import org.jetbrains.kotlin.gradle.plugin.sources.android.androidSourceSetInfoOrNull
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.sources.awaitPlatformCompilations
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.internal
|
import org.jetbrains.kotlin.gradle.plugin.sources.internal
|
||||||
|
|
||||||
internal object UnusedSourceSetsChecker : KotlinGradleProjectChecker {
|
internal object UnusedSourceSetsChecker : KotlinGradleProjectChecker {
|
||||||
|
|
||||||
override fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
||||||
val unusedSourceSets = multiplatformExtension?.sourceSets.orEmpty()
|
val unusedSourceSets = multiplatformExtension?.awaitSourceSets().orEmpty()
|
||||||
// Ignoring Android source sets
|
// Ignoring Android source sets
|
||||||
.filter { it.androidSourceSetInfoOrNull == null }
|
.filter { it.androidSourceSetInfoOrNull == null }
|
||||||
.filter { it.internal.compilations.isEmpty() }
|
.filter { it.internal.awaitPlatformCompilations().isEmpty() }
|
||||||
|
|
||||||
if (unusedSourceSets.isNotEmpty()) {
|
if (unusedSourceSets.isNotEmpty()) {
|
||||||
collector.report(project, KotlinToolingDiagnostics.UnusedSourceSetsWarning(unusedSourceSets.toSet().map { it.name }))
|
collector.report(project, KotlinToolingDiagnostics.UnusedSourceSetsWarning(unusedSourceSets.toSet().map { it.name }))
|
||||||
|
|||||||
+4
-4
@@ -152,7 +152,7 @@ class DiagnosticsReportingFunctionalTest {
|
|||||||
private fun buildProjectWithMockedCheckers(
|
private fun buildProjectWithMockedCheckers(
|
||||||
name: String? = null,
|
name: String? = null,
|
||||||
parent: ProjectInternal? = null,
|
parent: ProjectInternal? = null,
|
||||||
block: ProjectInternal.() -> Unit = { }
|
block: ProjectInternal.() -> Unit = { },
|
||||||
): ProjectInternal {
|
): ProjectInternal {
|
||||||
val project = buildProject(
|
val project = buildProject(
|
||||||
{
|
{
|
||||||
@@ -203,19 +203,19 @@ private fun Project.reportOnePerBuildTestDiagnostic(severity: Severity = WARNING
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal object MockChecker : KotlinGradleProjectChecker {
|
internal object MockChecker : KotlinGradleProjectChecker {
|
||||||
override fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
||||||
project.reportTestDiagnostic()
|
project.reportTestDiagnostic()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal object MockPerProjectChecker : KotlinGradleProjectChecker {
|
internal object MockPerProjectChecker : KotlinGradleProjectChecker {
|
||||||
override fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
||||||
project.reportOnePerProjectTestDiagnostic()
|
project.reportOnePerProjectTestDiagnostic()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal object MockPerBuildChecker : KotlinGradleProjectChecker {
|
internal object MockPerBuildChecker : KotlinGradleProjectChecker {
|
||||||
override fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
||||||
project.reportOnePerBuildTestDiagnostic()
|
project.reportOnePerBuildTestDiagnostic()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user