diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt index a58a7c68e09..1883c3ab4fa 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.gradle.dsl.kotlinExtensionOrNull import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ArtifactMetadataProvider +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.utils.* import java.util.* @@ -95,6 +96,7 @@ internal class GranularMetadataTransformation( private val logger = Logging.getLogger("GranularMetadataTransformation[${params.sourceSetName}]") class Params( + val build: CurrentBuildIdentifier, val sourceSetName: String, val resolvedMetadataConfiguration: LazyResolvedConfiguration, val sourceSetVisibilityProvider: SourceSetVisibilityProvider, @@ -103,6 +105,7 @@ internal class GranularMetadataTransformation( val platformCompilationSourceSets: Set, ) { constructor(project: Project, kotlinSourceSet: KotlinSourceSet) : this( + build = project.currentBuild, sourceSetName = kotlinSourceSet.name, resolvedMetadataConfiguration = LazyResolvedConfiguration(kotlinSourceSet.internal.resolvableMetadataConfiguration), sourceSetVisibilityProvider = SourceSetVisibilityProvider(project), @@ -232,7 +235,7 @@ internal class GranularMetadataTransformation( error("Artifacts of dependency ${module.id.displayName} is built by old Kotlin Gradle Plugin and can't be consumed in this way") } - val isResolvedToProject = moduleId is ProjectComponentIdentifier && moduleId.build.isCurrentBuildCompat + val isResolvedToProject = moduleId in params.build val sourceSetVisibility = params.sourceSetVisibilityProvider.getVisibleSourceSets( @@ -300,7 +303,7 @@ internal class GranularMetadataTransformation( return when (val componentId = component.id) { is ModuleComponentIdentifier -> ModuleDependencyIdentifier(componentId.group, componentId.module) is ProjectComponentIdentifier -> { - if (componentId.build.isCurrentBuildCompat) { + if (componentId in params.build) { params.projectData[componentId.projectPath]?.moduleId?.getOrThrow() ?: error("Cant find project Module ID by ${componentId.projectPath}") } else { @@ -361,7 +364,8 @@ internal fun MetadataDependencyResolution.projectDependency(currentProject: Proj dependency.toProjectOrNull(currentProject) internal fun ResolvedComponentResult.toProjectOrNull(currentProject: Project): Project? { - val projectId = currentBuildProjectIdOrNull ?: return null + if (this !in currentProject.currentBuild) return null + val projectId = id as? ProjectComponentIdentifier ?: return null return currentProject.project(projectId.projectPath) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTaskInputs.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTaskInputs.kt index 70460159718..deb4a5e3b54 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTaskInputs.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTaskInputs.kt @@ -6,11 +6,10 @@ import org.gradle.api.artifacts.ProjectDependency import org.gradle.api.file.FileCollection import org.gradle.api.tasks.* import org.gradle.work.NormalizeLineEndings -import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.sources.internal +import org.jetbrains.kotlin.gradle.utils.currentBuild import org.jetbrains.kotlin.gradle.utils.filesProvider -import org.jetbrains.kotlin.gradle.utils.isProjectComponentIdentifierInCurrentBuild import org.jetbrains.kotlin.utils.addToStdlib.applyIf internal class MetadataDependencyTransformationTaskInputs( @@ -18,6 +17,9 @@ internal class MetadataDependencyTransformationTaskInputs( kotlinSourceSet: KotlinSourceSet, private val keepProjectDependencies: Boolean = true, ) { + + private val currentBuild = project.currentBuild + @Suppress("unused") // Gradle input @get:InputFiles @get:PathSensitive(PathSensitivity.RELATIVE) @@ -66,10 +68,11 @@ internal class MetadataDependencyTransformationTaskInputs( .map { listOf(it.group, it.name, it.version) }.toSet() } } -} -private fun Configuration.withoutProjectDependencies(): FileCollection { - return incoming.artifactView { view -> - view.componentFilter { componentIdentifier -> !componentIdentifier.isProjectComponentIdentifierInCurrentBuild } - }.files + private fun Configuration.withoutProjectDependencies(): FileCollection { + return incoming.artifactView { view -> + view.componentFilter { componentIdentifier -> componentIdentifier !in currentBuild } + }.files + } + } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ModuleIds.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ModuleIds.kt index 8117b76b24e..3dc82a8e62b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ModuleIds.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ModuleIds.kt @@ -15,8 +15,8 @@ import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.PublishedModuleCoordinatesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId +import org.jetbrains.kotlin.gradle.utils.currentBuild import org.jetbrains.kotlin.gradle.utils.getValue -import org.jetbrains.kotlin.gradle.utils.isProjectComponentIdentifierInCurrentBuild import org.jetbrains.kotlin.project.model.KpmLocalModuleIdentifier import org.jetbrains.kotlin.project.model.KpmMavenModuleIdentifier import org.jetbrains.kotlin.project.model.KpmModuleIdentifier @@ -48,7 +48,7 @@ internal object ModuleIds { fun fromComponent(thisProject: Project, component: ResolvedComponentResult) = // If the project component comes from another build, we can't extract anything from it, so just use the module coordinates: - if (!component.id.isProjectComponentIdentifierInCurrentBuild) + if (component is ProjectComponentIdentifier && component !in thisProject.currentBuild) ModuleDependencyIdentifier(component.moduleVersion?.group ?: "unspecified", component.moduleVersion?.name ?: "unspecified") else fromComponentId(thisProject, component.id) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractor.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractor.kt index 093fb7d201a..af64c4140b2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractor.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractor.kt @@ -5,8 +5,6 @@ package org.jetbrains.kotlin.gradle.plugin.mpp -import org.gradle.api.artifacts.component.ProjectComponentIdentifier -import org.jetbrains.kotlin.gradle.utils.isCurrentBuildCompat import org.jetbrains.kotlin.project.model.KpmModuleIdentifier import java.io.File import java.io.InputStream @@ -22,14 +20,14 @@ sealed class MppDependencyProjectStructureMetadataExtractor { internal class ProjectMppDependencyProjectStructureMetadataExtractor( val moduleIdentifier: KpmModuleIdentifier, val projectPath: String, - private val projectStructureMetadataProvider: () -> KotlinProjectStructureMetadata? + private val projectStructureMetadataProvider: () -> KotlinProjectStructureMetadata?, ) : MppDependencyProjectStructureMetadataExtractor() { override fun getProjectStructureMetadata(): KotlinProjectStructureMetadata? = projectStructureMetadataProvider() } internal open class JarMppDependencyProjectStructureMetadataExtractor( - val primaryArtifactFile: File + val primaryArtifactFile: File, ) : MppDependencyProjectStructureMetadataExtractor() { private fun parseJsonProjectStructureMetadata(input: InputStream) = @@ -51,14 +49,8 @@ internal open class JarMppDependencyProjectStructureMetadataExtractor( } internal class IncludedBuildMppDependencyProjectStructureMetadataExtractor( - componentId: ProjectComponentIdentifier, primaryArtifact: File, private val projectStructureMetadataProvider: () -> KotlinProjectStructureMetadata?, ) : JarMppDependencyProjectStructureMetadataExtractor(primaryArtifact) { - - init { - require(!componentId.build.isCurrentBuildCompat) { "should be a project from an included build" } - } - override fun getProjectStructureMetadata(): KotlinProjectStructureMetadata? = projectStructureMetadataProvider() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractorFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractorFactory.kt index 78210e1c0de..cd17acecfac 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractorFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractorFactory.kt @@ -11,10 +11,11 @@ import org.gradle.api.artifacts.result.ResolvedArtifactResult import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.extraProperties import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toSingleKpmModuleIdentifier +import org.jetbrains.kotlin.gradle.utils.* +import org.jetbrains.kotlin.gradle.utils.CurrentBuildIdentifier import org.jetbrains.kotlin.gradle.utils.buildNameCompat import org.jetbrains.kotlin.gradle.utils.buildPathCompat import org.jetbrains.kotlin.gradle.utils.getOrPut -import org.jetbrains.kotlin.gradle.utils.isCurrentBuildCompat internal val Project.kotlinMppDependencyProjectStructureMetadataExtractorFactory: MppDependencyProjectStructureMetadataExtractorFactory get() = MppDependencyProjectStructureMetadataExtractorFactory.getOrCreate(this) @@ -26,6 +27,7 @@ internal data class ProjectPathWithBuildPath( internal class MppDependencyProjectStructureMetadataExtractorFactory private constructor( + private val currentBuild: CurrentBuildIdentifier, private val includedBuildsProjectStructureMetadataProviders: Lazy>>, private val currentBuildProjectStructureMetadataProviders: Map>, ) { @@ -35,7 +37,7 @@ private constructor( val moduleId = metadataArtifact.variant.owner return if (moduleId is ProjectComponentIdentifier) { - if (moduleId.build.isCurrentBuildCompat) { + if (moduleId in currentBuild) { val projectStructureMetadataProvider = currentBuildProjectStructureMetadataProviders[moduleId.projectPath] ?: error("Project structure metadata not found for project '${moduleId.projectPath}'") @@ -54,8 +56,8 @@ private constructor( */ val pre1920Key = ProjectPathWithBuildPath(moduleId.projectPath, moduleId.build.buildNameCompat) val key = ProjectPathWithBuildPath(moduleId.projectPath, moduleId.build.buildPathCompat) + IncludedBuildMppDependencyProjectStructureMetadataExtractor( - componentId = moduleId, primaryArtifact = metadataArtifact.file, projectStructureMetadataProvider = { includedBuildsProjectStructureMetadataProviders.value[key]?.value @@ -73,6 +75,7 @@ private constructor( fun getOrCreate(project: Project): MppDependencyProjectStructureMetadataExtractorFactory = project.rootProject.extraProperties.getOrPut(extensionName) { MppDependencyProjectStructureMetadataExtractorFactory( + currentBuild = project.currentBuild, lazy { GlobalProjectStructureMetadataStorage.getProjectStructureMetadataProvidersFromAllGradleBuilds(project) }, collectAllProjectStructureMetadataInCurrentBuild(project) ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmModuleDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmModuleDependencyResolver.kt index 02f8aedd464..22ef8035cf4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmModuleDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmModuleDependencyResolver.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder import org.jetbrains.kotlin.gradle.utils.getOrPutRootProjectProperty -import org.jetbrains.kotlin.gradle.utils.isCurrentBuildCompat import org.jetbrains.kotlin.project.model.* class GradleKpmModuleDependencyResolver( @@ -35,8 +34,9 @@ class GradleKpmModuleDependencyResolver( //FIXME multiple? val classifier = moduleClassifiersFromCapabilities(component?.variants?.flatMap { it.capabilities }.orEmpty()).single() + @Suppress("DEPRECATION") return when { - id is ProjectComponentIdentifier && id.build.isCurrentBuildCompat -> + id is ProjectComponentIdentifier && id.build.isCurrentBuild -> projectModuleBuilder.buildModulesFromProject(project.project(id.projectPath)) .find { it.moduleIdentifier.moduleClassifier == classifier } id is ModuleComponentIdentifier -> { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmVariantCompilationDataInternal.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmVariantCompilationDataInternal.kt index c2bc700f163..23b30723c44 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmVariantCompilationDataInternal.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmVariantCompilationDataInternal.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KpmGradleModuleVariantResolver import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.allDependencyModules import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName import org.jetbrains.kotlin.gradle.utils.filesProvider -import org.jetbrains.kotlin.gradle.utils.isCurrentBuildCompat import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.project.model.KpmVariantResolution @@ -39,7 +38,8 @@ interface GradleKpmVariantCompilationDataInternal : Gra view.componentFilter { id -> // FIXME rewrite using the proper module resolution after those changes are merged val asProject = id as? ProjectComponentIdentifier - asProject?.build?.isCurrentBuildCompat == true && + @Suppress("DEPRECATION") + asProject?.build?.isCurrentBuild == true && asProject.projectPath == owner.project.path } }.artifacts.filter { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/util/Utils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/util/Utils.kt index 7e99ed936a6..d045af467a3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/util/Utils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/util/Utils.kt @@ -9,6 +9,7 @@ import org.gradle.api.Project import org.gradle.api.artifacts.component.BuildIdentifier import org.gradle.api.internal.project.ProjectInternal import org.gradle.internal.build.BuildState +import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.plugin.internal.BasePluginConfiguration import org.jetbrains.kotlin.gradle.plugin.variantImplementationFactory import org.jetbrains.kotlin.project.model.KpmModule @@ -17,7 +18,7 @@ import org.jetbrains.kotlin.project.model.KpmLocalModuleIdentifier fun KpmModule.representsProject(project: Project): Boolean = moduleIdentifier.let { it is KpmLocalModuleIdentifier && it.buildId == project.currentBuildId().name && it.projectId == project.path } -// FIXME internal API? +@InternalKotlinGradlePluginApi fun Project.currentBuildId(): BuildIdentifier = (project as ProjectInternal).services.get(BuildState::class.java).buildIdentifier diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt index ca74598a240..a4e75a9ee35 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt @@ -21,14 +21,13 @@ import org.jetbrains.kotlin.tooling.core.MutableExtras import org.jetbrains.kotlin.tooling.core.closure import org.jetbrains.kotlin.tooling.core.mutableExtrasOf import java.io.File -import java.util.* import javax.inject.Inject const val METADATA_CONFIGURATION_NAME_SUFFIX = "DependenciesMetadata" abstract class DefaultKotlinSourceSet @Inject constructor( final override val project: Project, - val displayName: String + val displayName: String, ) : AbstractKotlinSourceSet() { override val extras: MutableExtras = mutableExtrasOf() @@ -131,7 +130,7 @@ abstract class DefaultKotlinSourceSet @Inject constructor( val allVisibleSourceSets: Set, /** If empty, then this source set does not see any 'new' source sets of the dependency, compared to its dependsOn parents, but it * still does see all what the dependsOn parents see. */ - val useFilesForSourceSets: Map> + val useFilesForSourceSets: Map>, ) @Suppress("unused", "UNUSED_PARAMETER") // Used in IDE import, [configurationName] is kept for backward compatibility @@ -148,7 +147,9 @@ abstract class DefaultKotlinSourceSet @Inject constructor( return metadataDependencyResolutionByModule.mapNotNull { (groupAndName, resolution) -> val (group, name) = groupAndName - val projectPath = resolution.dependency.currentBuildProjectIdOrNull?.projectPath + val dependencyIdentifier = resolution.dependency.id + val projectPath = dependencyIdentifier.projectPathOrNull?.takeIf { dependencyIdentifier in project.currentBuild } + when (resolution) { // No metadata transformation leads to original dependency being used during import is MetadataDependencyResolution.KeepOriginalDependency -> null diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetMetadataTransformation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetMetadataTransformation.kt index e98a5f9242d..97cb768ebdd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetMetadataTransformation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetMetadataTransformation.kt @@ -10,7 +10,8 @@ import org.gradle.api.artifacts.Configuration import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.targets.metadata.dependsOnClosureWithInterCompilationDependencies -import org.jetbrains.kotlin.gradle.utils.isProjectComponentIdentifierInCurrentBuild +import org.jetbrains.kotlin.gradle.utils.contains +import org.jetbrains.kotlin.gradle.utils.currentBuild import org.jetbrains.kotlin.tooling.core.extrasNullableLazyProperty /** @@ -84,7 +85,7 @@ private fun Project.applyTransformationToLegacyDependenciesMetadataConfiguration configuration.exclude(mapOf("group" to group, "module" to name)) } - requested.filter { !it.dependency.id.isProjectComponentIdentifierInCurrentBuild }.forEach { + requested.filter { it.dependency !in currentBuild }.forEach { val (group, name) = ModuleIds.fromComponent(project, it.dependency) val notation = listOfNotNull(group.orEmpty(), name, it.dependency.moduleVersion?.version).joinToString(":") configuration.resolutionStrategy.force(notation) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt index cef54f29b19..390b51c224c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt @@ -14,10 +14,8 @@ import org.gradle.api.tasks.* import org.gradle.work.DisableCachingByDefault import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet -import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider import org.jetbrains.kotlin.gradle.plugin.ide.Idea222Api import org.jetbrains.kotlin.gradle.plugin.ide.ideaImportDependsOn -import org.jetbrains.kotlin.gradle.plugin.launch import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ArtifactMetadataProvider @@ -27,8 +25,9 @@ import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.tasks.dependsOn import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.withType +import org.jetbrains.kotlin.gradle.utils.contains +import org.jetbrains.kotlin.gradle.utils.currentBuild import org.jetbrains.kotlin.gradle.utils.filesProvider -import org.jetbrains.kotlin.gradle.utils.isProjectComponentIdentifierInCurrentBuild import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.utils.addToStdlib.applyIf import java.io.File @@ -121,6 +120,8 @@ internal open class CInteropMetadataDependencyTransformationTask @Inject constru objectFactory: ObjectFactory, ) : DefaultTask() { + private val currentBuild = project.currentBuild + private val parameters = GranularMetadataTransformation.Params(project, sourceSet) sealed class Cleaning : Serializable { @@ -195,7 +196,7 @@ internal open class CInteropMetadataDependencyTransformationTask @Inject constru private fun Iterable.resolutionsToTransform(): List { return filterIsInstance() .applyIf(!transformProjectDependencies) { - filterNot { it.dependency.id.isProjectComponentIdentifierInCurrentBuild } + filterNot { it.dependency in currentBuild } } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/CurrentBuildIdentifier.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/CurrentBuildIdentifier.kt new file mode 100644 index 00000000000..1d2ba9d7847 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/CurrentBuildIdentifier.kt @@ -0,0 +1,52 @@ +/* + * 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.utils + +import org.gradle.api.Project +import org.gradle.api.artifacts.component.BuildIdentifier +import org.gradle.api.artifacts.component.ComponentIdentifier +import org.gradle.api.artifacts.result.ResolvedComponentResult +import org.jetbrains.kotlin.gradle.plugin.extraProperties +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId + + +internal val Project.currentBuild: CurrentBuildIdentifier + get() = extraProperties.getOrPut("org.jetbrains.kotlin.gradle.utils.currentBuild") { CurrentBuildIdentifierImpl(this.currentBuildId()) } + +/** + * Utility that can be used to test if a certain project or [ComponentIdentifier] belongs + * to the associated Gradle build in a composite build setup + */ +internal interface CurrentBuildIdentifier { + operator fun contains(project: Project): Boolean + operator fun contains(id: ComponentIdentifier): Boolean +} + +internal operator fun CurrentBuildIdentifier.contains(component: ResolvedComponentResult): Boolean { + return component.id in this +} + +/* Implementation */ + +private class CurrentBuildIdentifierImpl(private val currentBuildIdentifier: BuildIdentifier) : CurrentBuildIdentifier { + override fun contains(project: Project): Boolean { + return project.currentBuildId() == currentBuildIdentifier + } + + override fun contains(id: ComponentIdentifier): Boolean { + return id.buildOrNull == currentBuildIdentifier + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is CurrentBuildIdentifierImpl) return false + return this.currentBuildIdentifier == other.currentBuildIdentifier + } + + override fun hashCode(): Int { + return currentBuildIdentifier.hashCode() + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/gradleUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/gradleUtils.kt index 6a5bd113845..e48db71dd03 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/gradleUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/gradleUtils.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.gradle.utils import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.artifacts.component.BuildIdentifier +import org.gradle.api.artifacts.component.ComponentIdentifier +import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.api.invocation.Gradle import org.gradle.api.provider.Provider import org.gradle.api.services.BuildService @@ -56,9 +58,15 @@ internal val BuildIdentifier.buildPathCompat: String /** - * Will return [BuildIdentifier.isCurrentBuild] for Gradle versions less than 8.2 - * Will use the [BuildIdentifier.getBuildPath] to check if the buildIdentifier is the 'current' build + * Will return the [ProjectComponentIdentifier.getBuild] if the component + * represents a project. */ -internal val BuildIdentifier.isCurrentBuildCompat: Boolean - get() = if (GradleVersion.current() >= GradleVersion.version("8.2")) buildPath == ":" - else @Suppress("DEPRECATION") isCurrentBuild \ No newline at end of file +internal val ComponentIdentifier.buildOrNull: BuildIdentifier? + get() = (this as? ProjectComponentIdentifier)?.build + +/** + * Returns the associated 'projectPath' if the component represents a project + * null, otherwise + */ +internal val ComponentIdentifier.projectPathOrNull: String? + get() = (this as? ProjectComponentIdentifier)?.projectPath \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/isProjectComponentIdentifierInCurrentBuild.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/isProjectComponentIdentifierInCurrentBuild.kt deleted file mode 100644 index 90f038e1e02..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/isProjectComponentIdentifierInCurrentBuild.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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.utils - -import org.gradle.api.artifacts.component.ComponentIdentifier -import org.gradle.api.artifacts.component.ProjectComponentIdentifier -import org.gradle.api.artifacts.component.ModuleComponentIdentifier -import org.gradle.api.artifacts.result.ResolvedComponentResult - -/** - * For composite builds gradle replaces [ModuleComponentIdentifier] with [ProjectComponentIdentifier] - * for which [build.isCurrentBuild] is false - * Often, these dependencies needs to be handled differently not as usual ProjectDependencies - * Since included build *has to* produce their artifacts on which "current build projects" will depend on. - */ -internal val ComponentIdentifier.isProjectComponentIdentifierInCurrentBuild: Boolean - get() = currentBuildProjectIdOrNull != null - -internal val ComponentIdentifier.currentBuildProjectIdOrNull - get(): ProjectComponentIdentifier? = when { - this is ProjectComponentIdentifier && build.isCurrentBuildCompat -> this - else -> null - } - -internal val ResolvedComponentResult.currentBuildProjectIdOrNull get() = id.currentBuildProjectIdOrNull