[Gradle] Warn about kotlinArtifacts DSL usage

^KT-58029 Verification Pending
This commit is contained in:
Artem Daugel-Dauge
2023-07-03 17:48:22 +02:00
committed by Space Team
parent 4c95797067
commit de56f788f6
6 changed files with 99 additions and 2 deletions
@@ -42,6 +42,7 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLI
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_IMPORT_ENABLE_SLOW_SOURCES_JAR_RESOLVER
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_DEPENDENCY_PROPAGATION
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_SUPPRESS_EXPERIMENTAL_ARTIFACTS_DSL_WARNING
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_USE_XCODE_MESSAGE_STYLE
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_RUN_COMPILER_VIA_BUILD_TOOLS_API
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_STDLIB_DEFAULT_DEPENDENCY
@@ -528,6 +529,9 @@ internal class PropertiesProvider private constructor(private val project: Proje
val suppressedGradlePluginErrors: List<String>
get() = property(PropertyNames.KOTLIN_SUPPRESS_GRADLE_PLUGIN_ERRORS)?.split(",").orEmpty()
val suppressExperimentalArtifactsDslWarning: Boolean
get() = booleanProperty(KOTLIN_NATIVE_SUPPRESS_EXPERIMENTAL_ARTIFACTS_DSL_WARNING) ?: false
/**
* Retrieves a comma-separated list of browsers to use when running karma tests for [target]
* @see KOTLIN_JS_KARMA_BROWSERS
@@ -624,6 +628,7 @@ internal class PropertiesProvider private constructor(private val project: Proje
const val KOTLIN_SUPPRESS_GRADLE_PLUGIN_WARNINGS = "kotlin.suppressGradlePluginWarnings"
const val KOTLIN_SUPPRESS_GRADLE_PLUGIN_ERRORS = "kotlin.internal.suppressGradlePluginErrors"
const val KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS = "kotlin.native.ignoreDisabledTargets"
const val KOTLIN_NATIVE_SUPPRESS_EXPERIMENTAL_ARTIFACTS_DSL_WARNING = "kotlin.native.suppressExperimentalArtifactsDslWarning"
}
companion object {
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_APPLY_DEFAULT_HIERARCHY_TEMPLATE
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_SUPPRESS_EXPERIMENTAL_ARTIFACTS_DSL_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
@@ -520,6 +521,15 @@ object KotlinToolingDiagnostics {
""".trimIndent()
)
}
object ExperimentalArtifactsDslUsed : ToolingDiagnosticFactory(WARNING) {
operator fun invoke() = build(
"""
'kotlinArtifacts' DSL is experimental and may be changed in the future.
To suppress this warning add '$KOTLIN_NATIVE_SUPPRESS_EXPERIMENTAL_ARTIFACTS_DSL_WARNING=true' to your gradle.properties
""".trimIndent()
)
}
}
private fun String.indentLines(nSpaces: Int = 4, skipFirstLine: Boolean = true): String {
@@ -10,6 +10,9 @@ import org.gradle.api.Project
import org.gradle.api.plugins.ExtensionAware
import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.dsl.KotlinNativeArtifactDSL.ExperimentalArtifactDsl
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnosticOncePerProject
import org.jetbrains.kotlin.gradle.utils.castIsolatedKotlinPluginClassLoaderAware
import javax.inject.Inject
@@ -66,6 +69,10 @@ abstract class KotlinNativeArtifactDSLImpl @Inject constructor(private val proje
}
private inline fun <reified T : KotlinArtifactConfig> addKotlinArtifact(name: String, configure: Action<in T>) {
if (!project.kotlinPropertiesProvider.suppressExperimentalArtifactsDslWarning) {
project.reportDiagnosticOncePerProject(KotlinToolingDiagnostics.ExperimentalArtifactsDslUsed())
}
//create via newInstance for extensibility
val config: T = project.objects.newInstance(T::class.java, name)
project.kotlinArtifactsExtension.artifactConfigs.add(config)
@@ -0,0 +1,68 @@
/*
* 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.unitTests
import org.jetbrains.kotlin.gradle.dsl.KotlinNativeArtifactDSL
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_SUPPRESS_EXPERIMENTAL_ARTIFACTS_DSL_WARNING
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics.ExperimentalArtifactsDslUsed
import org.jetbrains.kotlin.gradle.util.*
import org.jetbrains.kotlin.gradle.util.assertContainsDiagnostic
import org.jetbrains.kotlin.konan.target.HostManager
import org.junit.Assume.assumeTrue
import kotlin.test.BeforeTest
import kotlin.test.Test
@Suppress("FunctionName")
@OptIn(KotlinNativeArtifactDSL.ExperimentalArtifactDsl::class)
class KotlinArtifactsDslTests {
@Test
fun `usage emits a warning`() {
val project = buildProjectWithMPP {
kotlin {
iosArm64()
iosSimulatorArm64()
}
kotlinArtifacts {
Native.Framework("frame") {
it.target = iosArm64
}
Native.XCFramework("xc") {
it.targets = setOf(iosArm64, iosSimulatorArm64)
}
}
}
project.evaluate()
project.assertContainsDiagnostic(ExperimentalArtifactsDslUsed)
}
@Test
fun `property suppresses the warning`() {
val project = buildProjectWithMPP {
propertiesExtension.set(KOTLIN_NATIVE_SUPPRESS_EXPERIMENTAL_ARTIFACTS_DSL_WARNING, "true")
kotlin {
iosArm64()
iosSimulatorArm64()
}
kotlinArtifacts {
Native.Framework("frame") {
it.target = iosArm64
}
Native.XCFramework("xc") {
it.targets = setOf(iosArm64, iosSimulatorArm64)
}
}
}
project.evaluate()
project.assertNoDiagnostics(ExperimentalArtifactsDslUsed)
}
}
@@ -22,6 +22,8 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLI
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension
import org.jetbrains.kotlin.gradle.plugin.getExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
import org.jetbrains.kotlin.gradle.targets.native.tasks.artifact.KotlinArtifactsExtensionImpl
import org.jetbrains.kotlin.gradle.targets.native.tasks.artifact.kotlinArtifactsExtension
import org.jetbrains.kotlin.gradle.unitTests.kpm.applyKpmPlugin
fun buildProject(
@@ -70,6 +72,11 @@ fun Project.kotlin(code: KotlinMultiplatformExtension.() -> Unit) {
kotlin.code()
}
fun Project.kotlinArtifacts(code: KotlinArtifactsExtensionImpl.() -> Unit) {
val kotlinArtifacts = project.kotlinArtifactsExtension as KotlinArtifactsExtensionImpl
kotlinArtifacts.code()
}
fun Project.androidLibrary(code: LibraryExtension.() -> Unit) {
plugins.findPlugin("com.android.library") ?: plugins.apply("com.android.library")
val androidExtension = project.extensions.getByName("android") as LibraryExtension
@@ -115,8 +115,8 @@ internal fun Collection<ToolingDiagnostic>.assertDiagnostics(vararg diagnostics:
fail(errorMessage)
}
internal fun Project.assertNoDiagnostics(id: String) {
kotlinToolingDiagnosticsCollector.getDiagnosticsForProject(this).assertNoDiagnostics(id)
internal fun Project.assertNoDiagnostics(factory: ToolingDiagnosticFactory) {
kotlinToolingDiagnosticsCollector.getDiagnosticsForProject(this).assertNoDiagnostics(factory.id)
}
internal fun Collection<ToolingDiagnostic>.assertNoDiagnostics(id: String) {