Emit a diagnostic if variant reselection is used pre Gradle 7.6
^KT-66133
This commit is contained in:
committed by
Space Team
parent
e1180adfbd
commit
c34bfcdb1d
+11
@@ -806,6 +806,17 @@ object KotlinToolingDiagnostics {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object ResourceMayNotBeResolvedWithGradleVersion : ToolingDiagnosticFactory(ERROR) {
|
||||||
|
operator fun invoke(
|
||||||
|
targetName: String, currentGradleVersion: String, minimumRequiredVersion: String) = build(
|
||||||
|
"""
|
||||||
|
Resources for target $targetName may not be resolved. Minimum required Gradle version is ${minimumRequiredVersion} but current is ${currentGradleVersion}.
|
||||||
|
|
||||||
|
$resourcesBugReportRequest
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
object UnknownValueProvidedForResourcesStrategy : ToolingDiagnosticFactory(ERROR) {
|
object UnknownValueProvidedForResourcesStrategy : ToolingDiagnosticFactory(ERROR) {
|
||||||
operator fun invoke(value: String) = build(
|
operator fun invoke(value: String) = build(
|
||||||
"""
|
"""
|
||||||
|
|||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2024 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.mpp.resources
|
||||||
|
|
||||||
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.util.GradleVersion
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.extraProperties
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.getOrNull
|
||||||
|
|
||||||
|
private const val OVERRIDE_GRADLE_VERSION_FOR_TESTS = "org.jetbrains.kotlin.internal.overriddenGradleVersionForTests"
|
||||||
|
internal var Project.overriddenGradleVersionForTests: GradleVersion?
|
||||||
|
set(value) = extraProperties.set(OVERRIDE_GRADLE_VERSION_FOR_TESTS, value)
|
||||||
|
get() = extraProperties.getOrNull(OVERRIDE_GRADLE_VERSION_FOR_TESTS) as? GradleVersion
|
||||||
|
internal val Project.gradleVersion: GradleVersion get() = overriddenGradleVersionForTests ?: GradleVersion.current()
|
||||||
|
|
||||||
+27
-4
@@ -8,11 +8,13 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.resources
|
|||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.provider.Provider
|
import org.gradle.api.provider.Provider
|
||||||
import org.gradle.api.tasks.TaskProvider
|
import org.gradle.api.tasks.TaskProvider
|
||||||
|
import org.gradle.util.GradleVersion
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
|
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
|
||||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
|
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
|
||||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnostic
|
import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnostic
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnosticOncePerBuild
|
||||||
import org.jetbrains.kotlin.gradle.plugin.launchInStage
|
import org.jetbrains.kotlin.gradle.plugin.launchInStage
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
|
||||||
@@ -29,7 +31,7 @@ import java.io.File
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
internal abstract class KotlinTargetResourcesPublicationImpl @Inject constructor(
|
internal abstract class KotlinTargetResourcesPublicationImpl @Inject constructor(
|
||||||
val project: Project
|
private val project: Project,
|
||||||
) : KotlinTargetResourcesPublication {
|
) : KotlinTargetResourcesPublication {
|
||||||
|
|
||||||
internal data class TargetResources(
|
internal data class TargetResources(
|
||||||
@@ -126,9 +128,8 @@ internal abstract class KotlinTargetResourcesPublicationImpl @Inject constructor
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun resolveResources(target: KotlinTarget): Provider<File> {
|
override fun resolveResources(target: KotlinTarget): Provider<File> {
|
||||||
if (!canResolveResources(target)) {
|
validateTargetResourcesAreResolvable(target)
|
||||||
target.project.reportDiagnostic(KotlinToolingDiagnostics.ResourceMayNotBeResolvedForTarget(target.name))
|
validateGradleVersionIsCompatibleWithResolutionStrategy(target.name)
|
||||||
}
|
|
||||||
|
|
||||||
val aggregateResourcesTaskName = target.disambiguateName("AggregateResources")
|
val aggregateResourcesTaskName = target.disambiguateName("AggregateResources")
|
||||||
project.locateTask<AggregateResourcesTask>(aggregateResourcesTaskName)?.let {
|
project.locateTask<AggregateResourcesTask>(aggregateResourcesTaskName)?.let {
|
||||||
@@ -201,12 +202,34 @@ internal abstract class KotlinTargetResourcesPublicationImpl @Inject constructor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun validateTargetResourcesAreResolvable(target: KotlinTarget) {
|
||||||
|
if (!canResolveResources(target)) {
|
||||||
|
target.project.reportDiagnostic(KotlinToolingDiagnostics.ResourceMayNotBeResolvedForTarget(target.name))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun validateGradleVersionIsCompatibleWithResolutionStrategy(targetName: String) {
|
||||||
|
if (project.kotlinPropertiesProvider.mppResourcesResolutionStrategy == KotlinTargetResourcesResolutionStrategy.VariantReselection) {
|
||||||
|
if (project.gradleVersion < minimumGradleVersionForVariantReselection) {
|
||||||
|
project.reportDiagnosticOncePerBuild(
|
||||||
|
KotlinToolingDiagnostics.ResourceMayNotBeResolvedWithGradleVersion(
|
||||||
|
targetName,
|
||||||
|
GradleVersion.current().toString(),
|
||||||
|
minimumGradleVersionForVariantReselection.toString(),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal companion object {
|
internal companion object {
|
||||||
const val MULTIPLATFORM_RESOURCES_DIRECTORY = "kotlin-multiplatform-resources"
|
const val MULTIPLATFORM_RESOURCES_DIRECTORY = "kotlin-multiplatform-resources"
|
||||||
const val RESOURCES_CLASSIFIER = "kotlin_resources"
|
const val RESOURCES_CLASSIFIER = "kotlin_resources"
|
||||||
const val RESOURCES_ZIP_EXTENSION = "${RESOURCES_CLASSIFIER}.zip"
|
const val RESOURCES_ZIP_EXTENSION = "${RESOURCES_CLASSIFIER}.zip"
|
||||||
|
|
||||||
const val RESOURCES_PATH = "ResourcesPath"
|
const val RESOURCES_PATH = "ResourcesPath"
|
||||||
|
|
||||||
|
val minimumGradleVersionForVariantReselection = GradleVersion.version("7.6")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -16,7 +16,10 @@ internal val KotlinMultiplatformExtension.resourcesPublicationExtension: KotlinT
|
|||||||
get() {
|
get() {
|
||||||
if (!project.kotlinPropertiesProvider.mppResourcesPublication) return null
|
if (!project.kotlinPropertiesProvider.mppResourcesPublication) return null
|
||||||
return project.extraProperties.getOrPut(KotlinTargetResourcesPublication.EXTENSION_NAME) {
|
return project.extraProperties.getOrPut(KotlinTargetResourcesPublication.EXTENSION_NAME) {
|
||||||
project.objects.newInstance(KotlinTargetResourcesPublicationImpl::class.java, project)
|
project.objects.newInstance(
|
||||||
|
KotlinTargetResourcesPublicationImpl::class.java,
|
||||||
|
project,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+40
@@ -10,12 +10,15 @@ package org.jetbrains.kotlin.gradle.unitTests
|
|||||||
import com.android.build.gradle.LibraryExtension
|
import com.android.build.gradle.LibraryExtension
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.internal.project.ProjectInternal
|
import org.gradle.api.internal.project.ProjectInternal
|
||||||
|
import org.gradle.util.GradleVersion
|
||||||
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
|
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
|
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
|
||||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
|
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
|
||||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnosticFactory
|
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnosticFactory
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.KotlinTargetResourcesPublication
|
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.KotlinTargetResourcesPublication
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.overriddenGradleVersionForTests
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.resolve.KotlinTargetResourcesResolutionStrategy
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.resourcesPublicationExtension
|
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.resourcesPublicationExtension
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl
|
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl
|
||||||
import org.jetbrains.kotlin.gradle.util.*
|
import org.jetbrains.kotlin.gradle.util.*
|
||||||
@@ -164,6 +167,43 @@ class KotlinTargetResourcesPublicationImplTests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test resolution - emits diagnostic in first resolving project with variant reselection - when Gradle version is below 7_6`() {
|
||||||
|
val rootProject = buildProjectWithMPP(
|
||||||
|
projectBuilder = { withName("root") },
|
||||||
|
preApplyCode = {
|
||||||
|
setMppResourcesResolutionStrategy(KotlinTargetResourcesResolutionStrategy.VariantReselection)
|
||||||
|
overriddenGradleVersionForTests = GradleVersion.version("7.5.1")
|
||||||
|
},
|
||||||
|
) { kotlin { linuxArm64() } }
|
||||||
|
val childProject = buildProjectWithMPP(
|
||||||
|
projectBuilder = { withParent(rootProject).withName("child") },
|
||||||
|
preApplyCode = {
|
||||||
|
setMppResourcesResolutionStrategy(KotlinTargetResourcesResolutionStrategy.VariantReselection)
|
||||||
|
overriddenGradleVersionForTests = GradleVersion.version("7.5.1")
|
||||||
|
},
|
||||||
|
) { kotlin { linuxArm64() } }
|
||||||
|
|
||||||
|
childProject.multiplatformExtension.resourcesPublicationExtension?.resolveResources(childProject.multiplatformExtension.linuxArm64())
|
||||||
|
rootProject.multiplatformExtension.resourcesPublicationExtension?.resolveResources(rootProject.multiplatformExtension.linuxArm64())
|
||||||
|
|
||||||
|
childProject.assertContainsDiagnostic(KotlinToolingDiagnostics.ResourceMayNotBeResolvedWithGradleVersion)
|
||||||
|
rootProject.assertNoDiagnostics(KotlinToolingDiagnostics.ResourceMayNotBeResolvedWithGradleVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test resolution - doesn't emit diagnostic with variant reselection - when Gradle version is above 7_6`() {
|
||||||
|
buildProjectWithMPP(
|
||||||
|
preApplyCode = { overriddenGradleVersionForTests = GradleVersion.version("7.6.1") }
|
||||||
|
) {
|
||||||
|
setMppResourcesResolutionStrategy(KotlinTargetResourcesResolutionStrategy.VariantReselection)
|
||||||
|
kotlin {
|
||||||
|
linuxArm64()
|
||||||
|
resourcesPublicationExtension?.resolveResources(linuxArm64())
|
||||||
|
}
|
||||||
|
}.assertNoDiagnostics()
|
||||||
|
}
|
||||||
|
|
||||||
private fun testCallbacksAfterApiCall(
|
private fun testCallbacksAfterApiCall(
|
||||||
callback: ((Unit) -> Unit) -> Unit,
|
callback: ((Unit) -> Unit) -> Unit,
|
||||||
apiCall: (Unit) -> Unit,
|
apiCall: (Unit) -> Unit,
|
||||||
|
|||||||
Reference in New Issue
Block a user