[MPP] Report deprecation warnings for HMPP-related Gradle properties
KT-55891
This commit is contained in:
committed by
Space Team
parent
4e13b7a202
commit
ec5f56584c
+55
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* 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.mpp
|
||||||
|
|
||||||
|
import org.gradle.util.GradleVersion
|
||||||
|
import org.jetbrains.kotlin.gradle.testbase.*
|
||||||
|
import kotlin.io.path.appendText
|
||||||
|
import kotlin.test.assertFalse
|
||||||
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
@MppGradlePluginTests
|
||||||
|
class MppDeprecatedPropertiesIt : KGPBaseTest() {
|
||||||
|
@GradleTest
|
||||||
|
fun testDeprecations(gradleVersion: GradleVersion) {
|
||||||
|
project("mppDeprecatedProperties", gradleVersion) {
|
||||||
|
checkDeprecations(isDeprecationExpected = false)
|
||||||
|
|
||||||
|
this.gradleProperties.appendText(
|
||||||
|
defaultFlags.entries.joinToString(
|
||||||
|
prefix = System.lineSeparator(),
|
||||||
|
postfix = System.lineSeparator(),
|
||||||
|
separator = System.lineSeparator(),
|
||||||
|
) { (prop, value) -> "$prop=$value" }
|
||||||
|
)
|
||||||
|
|
||||||
|
checkDeprecations(isDeprecationExpected = true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun TestProject.checkDeprecations(isDeprecationExpected: Boolean) {
|
||||||
|
build {
|
||||||
|
val assert: (Boolean, String) -> Unit = if (isDeprecationExpected) ::assertTrue else ::assertFalse
|
||||||
|
val warnings = output.lines().filter { it.startsWith("w:") }.toSet()
|
||||||
|
|
||||||
|
defaultFlags.keys.forEach { flag ->
|
||||||
|
assert(
|
||||||
|
warnings.any { warning -> Regex(".*$flag.*is deprecated.*").matches(warning) },
|
||||||
|
"A deprecation warning for the '$flag' should have been reported",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val defaultFlags: Map<String, String>
|
||||||
|
get() = mapOf(
|
||||||
|
"kotlin.mpp.enableGranularSourceSetsMetadata" to "true",
|
||||||
|
"kotlin.mpp.enableCompatibilityMetadataVariant" to "false",
|
||||||
|
"kotlin.internal.mpp.hierarchicalStructureByDefault" to "true",
|
||||||
|
"kotlin.mpp.hierarchicalStructureSupport" to "true",
|
||||||
|
"kotlin.native.enableDependencyPropagation" to "false",
|
||||||
|
)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
plugins {
|
||||||
|
kotlin("multiplatform")
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlin {
|
||||||
|
jvm()
|
||||||
|
}
|
||||||
+4
-2
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLI
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_VERSION
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_VERSION
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_VERSION_1_NO_WARN
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_VERSION_1_NO_WARN
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_CINTEROP_COMMONIZATION
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_CINTEROP_COMMONIZATION
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_COMPATIBILITY_METADATA_VARIANT
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_INTRANSITIVE_METADATA_CONFIGURATION
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_INTRANSITIVE_METADATA_CONFIGURATION
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_OPTIMISTIC_NUMBER_COMMONIZATION
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_OPTIMISTIC_NUMBER_COMMONIZATION
|
||||||
@@ -216,7 +217,7 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
|||||||
|
|
||||||
val enableCompatibilityMetadataVariant: Boolean
|
val enableCompatibilityMetadataVariant: Boolean
|
||||||
get() {
|
get() {
|
||||||
return (booleanProperty("kotlin.mpp.enableCompatibilityMetadataVariant") ?: !mppHierarchicalStructureByDefault)
|
return (booleanProperty(KOTLIN_MPP_ENABLE_COMPATIBILITY_METADATA_VARIANT) ?: !mppHierarchicalStructureByDefault)
|
||||||
}
|
}
|
||||||
|
|
||||||
val enableKotlinToolingMetadataArtifact: Boolean
|
val enableKotlinToolingMetadataArtifact: Boolean
|
||||||
@@ -522,7 +523,7 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
|||||||
* 1. Project properties (-P, gradle.properties, etc...)
|
* 1. Project properties (-P, gradle.properties, etc...)
|
||||||
* 2. `local.properties`
|
* 2. `local.properties`
|
||||||
*/
|
*/
|
||||||
private fun property(propName: String): String? =
|
internal fun property(propName: String): String? =
|
||||||
if (project.hasProperty(propName)) {
|
if (project.hasProperty(propName)) {
|
||||||
project.property(propName) as? String
|
project.property(propName) as? String
|
||||||
} else {
|
} else {
|
||||||
@@ -549,6 +550,7 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
|||||||
const val KOTLIN_STDLIB_DEFAULT_DEPENDENCY = "kotlin.stdlib.default.dependency"
|
const val KOTLIN_STDLIB_DEFAULT_DEPENDENCY = "kotlin.stdlib.default.dependency"
|
||||||
const val KOTLIN_STDLIB_JDK_VARIANTS_VERSION_ALIGNMENT = "kotlin.stdlib.jdk.variants.version.alignment"
|
const val KOTLIN_STDLIB_JDK_VARIANTS_VERSION_ALIGNMENT = "kotlin.stdlib.jdk.variants.version.alignment"
|
||||||
const val KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA = "kotlin.mpp.enableGranularSourceSetsMetadata"
|
const val KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA = "kotlin.mpp.enableGranularSourceSetsMetadata"
|
||||||
|
const val KOTLIN_MPP_ENABLE_COMPATIBILITY_METADATA_VARIANT = "kotlin.mpp.enableCompatibilityMetadataVariant"
|
||||||
const val KOTLIN_MPP_ENABLE_CINTEROP_COMMONIZATION = "kotlin.mpp.enableCInteropCommonization"
|
const val KOTLIN_MPP_ENABLE_CINTEROP_COMMONIZATION = "kotlin.mpp.enableCInteropCommonization"
|
||||||
const val KOTLIN_MPP_HIERARCHICAL_STRUCTURE_BY_DEFAULT = "kotlin.internal.mpp.hierarchicalStructureByDefault"
|
const val KOTLIN_MPP_HIERARCHICAL_STRUCTURE_BY_DEFAULT = "kotlin.internal.mpp.hierarchicalStructureByDefault"
|
||||||
const val KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT = "kotlin.mpp.hierarchicalStructureSupport"
|
const val KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT = "kotlin.mpp.hierarchicalStructureSupport"
|
||||||
|
|||||||
+2
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.gradle.plugin.ide.kotlinIdeMultiplatformImport
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.ide.locateOrRegisterIdeResolveDependenciesTask
|
import org.jetbrains.kotlin.gradle.plugin.ide.locateOrRegisterIdeResolveDependenciesTask
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin.Companion.sourceSetFreeCompilerArgsPropertyName
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin.Companion.sourceSetFreeCompilerArgsPropertyName
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.addBuildListenerForXcode
|
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.addBuildListenerForXcode
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.internal.checkAndReportDeprecatedMppProperties
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.internal.checkAndReportDeprecatedNativeTargets
|
import org.jetbrains.kotlin.gradle.plugin.mpp.internal.checkAndReportDeprecatedNativeTargets
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.internal.handleHierarchicalStructureFlagsMigration
|
import org.jetbrains.kotlin.gradle.plugin.mpp.internal.handleHierarchicalStructureFlagsMigration
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
|
||||||
@@ -49,6 +50,7 @@ class KotlinMultiplatformPlugin : Plugin<Project> {
|
|||||||
override fun apply(project: Project) {
|
override fun apply(project: Project) {
|
||||||
checkGradleCompatibility("the Kotlin Multiplatform plugin", GradleVersion.version("6.0"))
|
checkGradleCompatibility("the Kotlin Multiplatform plugin", GradleVersion.version("6.0"))
|
||||||
|
|
||||||
|
checkAndReportDeprecatedMppProperties(project)
|
||||||
handleHierarchicalStructureFlagsMigration(project)
|
handleHierarchicalStructureFlagsMigration(project)
|
||||||
checkAndReportDeprecatedNativeTargets(project)
|
checkAndReportDeprecatedNativeTargets(project)
|
||||||
|
|
||||||
|
|||||||
+40
-1
@@ -7,8 +7,16 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.internal
|
|||||||
|
|
||||||
import org.gradle.api.Project
|
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.PropertiesProvider.Companion.kotlinPropertiesProvider
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_COMPATIBILITY_METADATA_VARIANT
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_HIERARCHICAL_STRUCTURE_BY_DEFAULT
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_DEPENDENCY_PROPAGATION
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
|
||||||
import org.jetbrains.kotlin.gradle.utils.SingleWarningPerBuild
|
import org.jetbrains.kotlin.gradle.utils.SingleWarningPerBuild
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.hasSyncErrors
|
||||||
import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheckWhenEvaluated
|
import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheckWhenEvaluated
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
|
|
||||||
@@ -22,4 +30,35 @@ internal fun checkAndReportDeprecatedNativeTargets(project: Project) {
|
|||||||
"w: The following deprecated kotlin native targets were used in the project: ${usedDeprecatedTargets.joinToString { it.targetName }}"
|
"w: The following deprecated kotlin native targets were used in the project: ${usedDeprecatedTargets.joinToString { it.targetName }}"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declared properties have to be captured during plugin application phase before the HMPP migration util sets them.
|
||||||
|
* Warnings have to be reported only for successfully evaluated projects without errors.
|
||||||
|
*/
|
||||||
|
internal fun checkAndReportDeprecatedMppProperties(project: Project) {
|
||||||
|
val projectProperties = project.kotlinPropertiesProvider
|
||||||
|
|
||||||
|
val warnings = deprecatedMppProperties.mapNotNull { propertyName ->
|
||||||
|
projectProperties.property(propertyName)?.let { getMppDeprecationWarningMessageForProperty(propertyName) }
|
||||||
|
}
|
||||||
|
|
||||||
|
project.whenEvaluated {
|
||||||
|
if (!project.hasSyncErrors()) {
|
||||||
|
warnings.forEach { message ->
|
||||||
|
SingleWarningPerBuild.show(project, message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal val deprecatedMppProperties: List<String> = listOf(
|
||||||
|
KOTLIN_MPP_ENABLE_COMPATIBILITY_METADATA_VARIANT,
|
||||||
|
KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA,
|
||||||
|
KOTLIN_MPP_HIERARCHICAL_STRUCTURE_BY_DEFAULT,
|
||||||
|
KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT,
|
||||||
|
KOTLIN_NATIVE_DEPENDENCY_PROPAGATION,
|
||||||
|
)
|
||||||
|
|
||||||
|
internal fun getMppDeprecationWarningMessageForProperty(property: String): String =
|
||||||
|
"w: The property '$property' is deprecated and is scheduled for removal in the stable Kotlin Multiplatform."
|
||||||
|
|||||||
+4
-1
@@ -60,13 +60,16 @@ import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
|
|||||||
*/
|
*/
|
||||||
internal inline fun Project.runProjectConfigurationHealthCheck(check: Project.() -> Unit) {
|
internal inline fun Project.runProjectConfigurationHealthCheck(check: Project.() -> Unit) {
|
||||||
/* Running configuration checks on a failed project will only lead to false positive error messages */
|
/* Running configuration checks on a failed project will only lead to false positive error messages */
|
||||||
if (state.failure != null || (inLenientMode() && syncExceptionsAreNotEmpty())) {
|
if (project.hasSyncErrors()) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
check()
|
check()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun Project.hasSyncErrors(): Boolean =
|
||||||
|
state.failure != null || (inLenientMode() && syncExceptionsAreNotEmpty())
|
||||||
|
|
||||||
// ClassPathModeExceptionCollector is available only via 'gradleKotlinDsl()' dependency which brings in full Gradle jar
|
// ClassPathModeExceptionCollector is available only via 'gradleKotlinDsl()' dependency which brings in full Gradle jar
|
||||||
private fun Project.syncExceptionsAreNotEmpty(): Boolean {
|
private fun Project.syncExceptionsAreNotEmpty(): Boolean {
|
||||||
val classPathModeExceptionCollectionClass = Class.forName("org.gradle.kotlin.dsl.provider.ClassPathModeExceptionCollector")
|
val classPathModeExceptionCollectionClass = Class.forName("org.gradle.kotlin.dsl.provider.ClassPathModeExceptionCollector")
|
||||||
|
|||||||
Reference in New Issue
Block a user