diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt index 73b5d9d89f3..8374b6a3c8a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt @@ -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 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 { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt index 631f7f9dfae..5ccf922f2ef 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt @@ -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 { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactsExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactsExtension.kt index dae9f5dec6b..78bab42da36 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactsExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactsExtension.kt @@ -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 addKotlinArtifact(name: String, configure: Action) { + 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) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinArtifactsDslTests.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinArtifactsDslTests.kt new file mode 100644 index 00000000000..088e14f419e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinArtifactsDslTests.kt @@ -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) + } + +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/buildProject.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/buildProject.kt index ca44719138a..fae5e78fd5a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/buildProject.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/buildProject.kt @@ -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 diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/diagnosticUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/diagnosticUtils.kt index 5d95b937a5e..0209c8bd1fa 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/diagnosticUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/diagnosticUtils.kt @@ -115,8 +115,8 @@ internal fun Collection.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.assertNoDiagnostics(id: String) {