[Gradle] Implement AndroidSourceSetLayoutV1SourceSetsNotFoundChecker...
... in order to provide better guidance for projects
migrating to Multiplatform/SourceSetLayout v2 which will suffer from
`UnknownDomainObjectException` when requesting old Android source sets
like
```
sourceSets.getByName("androidTest") // renamed to androidUnitTest
sourceSets.getByName("androidAndroidTest") // renamed to androidInstrumentedTest
```
^KT-58488 Verification Pending
This commit is contained in:
committed by
Space Team
parent
25c0725da9
commit
484863d8c6
+2
-4
@@ -10,10 +10,7 @@ import org.gradle.api.Project
|
|||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
|
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
|
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.checkers.CommonMainWithDependsOnChecker
|
import org.jetbrains.kotlin.gradle.plugin.diagnostics.checkers.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.checkers.DeprecatedKotlinNativeTargetsChecker
|
|
||||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.checkers.MissingNativeStdlibChecker
|
|
||||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.checkers.UnusedSourceSetsChecker
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for generic checks of a Gradle Project with any Kotlin Gradle Plugin applied.
|
* Interface for generic checks of a Gradle Project with any Kotlin Gradle Plugin applied.
|
||||||
@@ -101,6 +98,7 @@ internal interface KotlinGradleProjectChecker {
|
|||||||
DeprecatedKotlinNativeTargetsChecker,
|
DeprecatedKotlinNativeTargetsChecker,
|
||||||
MissingNativeStdlibChecker,
|
MissingNativeStdlibChecker,
|
||||||
UnusedSourceSetsChecker,
|
UnusedSourceSetsChecker,
|
||||||
|
AndroidSourceSetLayoutV1SourceSetsNotFoundChecker,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+17
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.plugin.diagnostics
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi
|
import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
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.WARNING
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.android.multiplatformAndroidSourceSetLayoutV1
|
import org.jetbrains.kotlin.gradle.plugin.sources.android.multiplatformAndroidSourceSetLayoutV1
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.android.multiplatformAndroidSourceSetLayoutV2
|
import org.jetbrains.kotlin.gradle.plugin.sources.android.multiplatformAndroidSourceSetLayoutV2
|
||||||
@@ -161,4 +162,20 @@ object KotlinToolingDiagnostics {
|
|||||||
object FailedToGetAgpVersionWarning : ToolingDiagnosticFactory(WARNING) {
|
object FailedToGetAgpVersionWarning : ToolingDiagnosticFactory(WARNING) {
|
||||||
operator fun invoke() = build("Failed to get AndroidGradlePluginVersion")
|
operator fun invoke() = build("Failed to get AndroidGradlePluginVersion")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object AndroidSourceSetLayoutV1SourceSetsNotFoundError : ToolingDiagnosticFactory(ERROR) {
|
||||||
|
operator fun invoke(nameOfRequestedSourceSet: String) = build(
|
||||||
|
"""
|
||||||
|
KotlinSourceSet with name '$nameOfRequestedSourceSet' not found:
|
||||||
|
The SourceSet requested ('$nameOfRequestedSourceSet') was renamed in Kotlin 1.9.0
|
||||||
|
|
||||||
|
In order to migrate you might want to replace:
|
||||||
|
sourceSets.getByName("androidTest") -> sourceSets.getByName("androidUnitTest")
|
||||||
|
sourceSets.getByName("androidAndroidTest") -> sourceSets.getByName("androidInstrumentedTest")
|
||||||
|
|
||||||
|
Learn more about the new Kotlin/Android SourceSet Layout:
|
||||||
|
https://kotlinlang.org/docs/whatsnew18.html#kotlin-multiplatform-a-new-android-source-set-layout
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* 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.AndroidSourceSetLayoutV1SourceSetsNotFoundError
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnosticsCollector
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.sources.android.kotlinAndroidSourceSetLayout
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.sources.android.multiplatformAndroidSourceSetLayoutV2
|
||||||
|
import org.jetbrains.kotlin.tooling.core.withClosure
|
||||||
|
|
||||||
|
internal object AndroidSourceSetLayoutV1SourceSetsNotFoundChecker : KotlinGradleProjectChecker {
|
||||||
|
|
||||||
|
private val androidSourceSetRegex by lazy { Regex("""(androidTest|androidAndroidTest)\w*""") }
|
||||||
|
|
||||||
|
override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
||||||
|
/* Checker will only try to provide additional diagnostics if the project configuration failed */
|
||||||
|
val failure = project.configurationResult.await() as? KotlinPluginLifecycle.ProjectConfigurationResult.Failure ?: return
|
||||||
|
|
||||||
|
/* Checker is only relevant if multiplatformAndroidSourceSetLayoutV2 is applied */
|
||||||
|
if (project.kotlinAndroidSourceSetLayout != multiplatformAndroidSourceSetLayoutV2) return
|
||||||
|
|
||||||
|
val allReasons = failure.failures.withClosure<Throwable> { listOfNotNull(it.cause) }
|
||||||
|
|
||||||
|
val unknownAndroidSourceSetNames = allReasons.filterIsInstance<UnknownDomainObjectException>()
|
||||||
|
.filter { it.message.orEmpty().contains("KotlinSourceSet") }
|
||||||
|
.mapNotNull { androidSourceSetRegex.find(it.message.orEmpty()) }
|
||||||
|
.map { it.value }
|
||||||
|
|
||||||
|
unknownAndroidSourceSetNames.forEach { unknownAndroidSourceSetName ->
|
||||||
|
collector.report(project, AndroidSourceSetLayoutV1SourceSetsNotFoundError(unknownAndroidSourceSetName))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user