Register multiplatform publication extension

^KT-65540
This commit is contained in:
Timofey Solonin
2024-02-14 15:10:38 +01:00
committed by Space Team
parent ea0c3837a0
commit 74628c0394
11 changed files with 175 additions and 0 deletions
@@ -1,3 +1,6 @@
public abstract interface annotation class org/jetbrains/kotlin/gradle/ComposeKotlinGradlePluginApi : java/lang/annotation/Annotation {
}
public final class org/jetbrains/kotlin/gradle/DeprecatedTargetPresetApiKt {
public static final field PRESETS_API_IS_DEPRECATED_MESSAGE Ljava/lang/String;
public static final field PRESETS_DEPRECATION_MESSAGE_SUFFIX Ljava/lang/String;
@@ -0,0 +1,12 @@
/*
* Copyright 2010-2022 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
@RequiresOptIn(
message = "This API is not intended to be used outside of the Kotlin Gradle Plugin and Compose Multiplatform Plugin integration",
level = RequiresOptIn.Level.ERROR
)
annotation class ComposeKotlinGradlePluginApi
@@ -13,6 +13,7 @@ testsJar()
kotlin.sourceSets.all {
languageSettings.optIn("org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi")
languageSettings.optIn("org.jetbrains.kotlin.gradle.ComposeKotlinGradlePluginApi")
}
val kotlinGradlePluginTest = project(":kotlin-gradle-plugin").sourceSets.named("test").map { it.output }
@@ -907,6 +907,11 @@ public final class org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotli
public static final fun sourcesJarTask (Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/DecoratedExternalKotlinTarget;Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/DecoratedExternalKotlinCompilation;)Lorg/gradle/api/tasks/TaskProvider;
}
public abstract interface class org/jetbrains/kotlin/gradle/plugin/mpp/resources/KotlinTargetResourcesPublication {
public static final field Companion Lorg/jetbrains/kotlin/gradle/plugin/mpp/resources/KotlinTargetResourcesPublication$Companion;
public static final field EXTENSION_NAME Ljava/lang/String;
}
public abstract class org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/SourceSetTreeClassifier {
}
@@ -23,6 +23,7 @@ kotlin {
"org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi",
"org.jetbrains.kotlin.gradle.DeprecatedTargetPresetApi",
"org.jetbrains.kotlin.buildtools.api.ExperimentalBuildToolsApi",
"org.jetbrains.kotlin.gradle.ComposeKotlinGradlePluginApi",
)
)
}
@@ -30,6 +31,7 @@ kotlin {
apiValidation {
publicMarkers.add("org.jetbrains.kotlin.gradle.ExternalKotlinTargetApi")
publicMarkers.add("org.jetbrains.kotlin.gradle.ComposeKotlinGradlePluginApi")
publicMarkers.add("org.jetbrains.kotlin.gradle.dsl.KotlinGradlePluginPublicDsl")
nonPublicMarkers.add("org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi")
additionalSourceSets.add("common")
@@ -0,0 +1,28 @@
/*
* 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.provider.Provider
import org.jetbrains.kotlin.gradle.ComposeKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
import java.io.File
@ComposeKotlinGradlePluginApi
interface KotlinTargetResourcesPublication {
data class ResourceRoot(
val resourcesBaseDirectory: Provider<File>,
val includes: List<String>,
val excludes: List<String>,
)
companion object {
const val EXTENSION_NAME = "multiplatformResourcesPublication"
}
}
@@ -0,0 +1,52 @@
/*
* 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.api.artifacts.Configuration
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.launchInStage
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.disambiguateName
import org.jetbrains.kotlin.gradle.plugin.mpp.internal
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
import org.jetbrains.kotlin.gradle.tasks.locateTask
import org.jetbrains.kotlin.gradle.tasks.registerTask
import java.io.File
import javax.inject.Inject
internal abstract class KotlinTargetResourcesPublicationImpl @Inject constructor(
val project: Project
) : KotlinTargetResourcesPublication {
internal data class TargetResources(
val resourcePathForSourceSet: (KotlinSourceSet) -> (KotlinTargetResourcesPublication.ResourceRoot),
val relativeResourcePlacement: Provider<File>,
)
private val targetToResourcesMap: MutableMap<KotlinTarget, TargetResources> = mutableMapOf()
private val targetResourcesSubscribers: MutableMap<KotlinTarget, MutableList<(TargetResources) -> (Unit)>> = mutableMapOf()
internal fun subscribeOnPublishResources(
target: KotlinTarget,
notify: (TargetResources) -> (Unit),
) {
targetToResourcesMap[target]?.let(notify)
targetResourcesSubscribers.getOrPut(target, { mutableListOf() }).add(notify)
}
internal companion object {
const val MULTIPLATFORM_RESOURCES_DIRECTORY = "kotlin-multiplatform-resources"
}
}
@@ -0,0 +1,25 @@
/*
* 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.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinProjectSetupAction
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.extraProperties
import org.jetbrains.kotlin.gradle.utils.getOrPut
internal val KotlinMultiplatformExtension.resourcesPublicationExtension: KotlinTargetResourcesPublicationImpl?
get() {
if (!project.kotlinPropertiesProvider.mppResourcesPublication) return null
return project.extraProperties.getOrPut(KotlinTargetResourcesPublication.EXTENSION_NAME) {
project.objects.newInstance(KotlinTargetResourcesPublicationImpl::class.java, project)
}
}
internal val RegisterMultiplatformResourcesPublicationExtensionAction = KotlinProjectSetupAction {
multiplatformExtension.resourcesPublicationExtension
}
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.AddBuildListenerForXCodeSetupAction
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.*
import org.jetbrains.kotlin.gradle.plugin.mpp.internal.DeprecatedMppGradlePropertiesMigrationSetupAction
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.RegisterMultiplatformResourcesPublicationExtensionAction
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinMultiplatformSourceSetSetupAction
import org.jetbrains.kotlin.gradle.plugin.sources.LanguageSettingsSetupAction
import org.jetbrains.kotlin.gradle.plugin.statistics.MultiplatformBuildStatsReportSetupAction
@@ -78,6 +79,7 @@ internal fun Project.registerKotlinPluginExtensions() {
register(project, KotlinLLDBScriptSetupAction)
register(project, ExcludeDefaultPlatformDependenciesFromKotlinNativeCompileTasks)
register(project, SetupConsistentMetadataDependenciesResolution)
register(project, RegisterMultiplatformResourcesPublicationExtensionAction)
}
}
@@ -0,0 +1,41 @@
/*
* 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.unitTests
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.KotlinTargetResourcesPublication
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.resourcesPublicationExtension
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
import org.jetbrains.kotlin.gradle.util.enableMppResourcesPublication
import org.jetbrains.kotlin.gradle.util.kotlin
import org.jetbrains.kotlin.gradle.util.runLifecycleAwareTest
import org.junit.Test
import kotlin.test.assertNotNull
import kotlin.test.assertNull
class RegisterMultiplatformResourcesPublicationExtensionActionTests {
@Test
fun `test mppResourcesPublication toggle - prevents extension creation`() {
assertNull(
buildProjectWithMPP {
kotlin { jvm() }
enableMppResourcesPublication(false)
}.evaluate().multiplatformExtension.resourcesPublicationExtension
)
}
@Test
fun `test mppResourcesPublication toggle - enables extension creation`() {
assertNotNull(
buildProjectWithMPP {
kotlin { jvm() }
enableMppResourcesPublication(true)
}.evaluate().multiplatformExtension.resourcesPublicationExtension
)
}
}
@@ -113,6 +113,10 @@ fun Project.enableCInteropCommonization(enabled: Boolean = true) {
propertiesExtension.set(PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_CINTEROP_COMMONIZATION, enabled.toString())
}
fun Project.enableMppResourcesPublication(enabled: Boolean = true) {
propertiesExtension.set(PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_RESOURCES_PUBLICATION, enabled.toString())
}
fun Project.enableIntransitiveMetadataConfiguration(enabled: Boolean = true) {
propertiesExtension.set(KOTLIN_MPP_ENABLE_INTRANSITIVE_METADATA_CONFIGURATION, enabled.toString())
}