diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt index d05bc7c285f..3489f5c96ed 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.gradle.targets.metadata.dependsOnClosureWithInterCom import org.jetbrains.kotlin.gradle.targets.metadata.getPublishedPlatformCompilations import org.jetbrains.kotlin.gradle.targets.metadata.isNativeSourceSet import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerCompositeMetadataJarBundling.cinteropMetadataDirectoryPath +import org.jetbrains.kotlin.gradle.utils.buildPathCompat import org.jetbrains.kotlin.gradle.utils.compositeBuildRootProject import org.jetbrains.kotlin.gradle.utils.future import org.jetbrains.kotlin.gradle.utils.getOrPut @@ -421,13 +422,13 @@ internal object GlobalProjectStructureMetadataStorage { fun registerProjectStructureMetadata(project: Project, metadataProvider: () -> KotlinProjectStructureMetadata) { project.compositeBuildRootProject { (it as ExtensionAware).extensions.extraProperties.set( - propertyName(project.currentBuildId().name, project.path), + propertyName(project.currentBuildId().buildPathCompat, project.path), { metadataProvider().toJson() } ) } } - fun getProjectStructureMetadataProvidersFromAllGradleBuilds(project: Project): Map> { + fun getProjectStructureMetadataProvidersFromAllGradleBuilds(project: Project): Map> { return project.compositeBuildRootProject.extensions.extraProperties.properties .filterKeys { it.startsWith(propertyPrefix) } .entries @@ -445,11 +446,11 @@ internal object GlobalProjectStructureMetadataStorage { return parseKotlinSourceSetMetadataFromJson(jsonString) } - private fun String.toProjectPathWithBuildName(): ProjectPathWithBuildName { - val (buildName, projectPath) = removePrefix("$propertyPrefix.").split(".path.") - return ProjectPathWithBuildName( + private fun String.toProjectPathWithBuildName(): ProjectPathWithBuildPath { + val (buildPath, projectPath) = removePrefix("$propertyPrefix.").split(".path.") + return ProjectPathWithBuildPath( projectPath = projectPath, - buildName = buildName + buildPath = buildPath ) } } 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 b12e32b69cc..e136dc05e50 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,23 +11,25 @@ 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.buildNameCompat +import org.jetbrains.kotlin.gradle.utils.buildPathCompat import org.jetbrains.kotlin.gradle.utils.getOrPut internal val Project.kotlinMppDependencyProjectStructureMetadataExtractorFactory: MppDependencyProjectStructureMetadataExtractorFactory get() = MppDependencyProjectStructureMetadataExtractorFactory.getOrCreate(this) -internal data class ProjectPathWithBuildName( +internal data class ProjectPathWithBuildPath( val projectPath: String, - val buildName: String + val buildPath: String, ) internal class MppDependencyProjectStructureMetadataExtractorFactory private constructor( - private val includedBuildsProjectStructureMetadataProviders: Lazy>>, - private val currentBuildProjectStructureMetadataProviders: Map> + private val includedBuildsProjectStructureMetadataProviders: Lazy>>, + private val currentBuildProjectStructureMetadataProviders: Map>, ) { fun create( - metadataArtifact: ResolvedArtifactResult + metadataArtifact: ResolvedArtifactResult, ): MppDependencyProjectStructureMetadataExtractor { val moduleId = metadataArtifact.variant.owner @@ -42,11 +44,22 @@ private constructor( projectStructureMetadataProvider = projectStructureMetadataProvider::value ) } else { - val key = ProjectPathWithBuildName(moduleId.projectPath, moduleId.build.name) + /* + We switched to using 'buildPath' instead of 'buildName' in 1.9.20, + (See: https://youtrack.jetbrains.com/issue/KT-58157/) + + In order for 1.9.20 projects to consume included builds with lesser KGP versions, + we will still query this 'legacy key' which is the key we expect older KGP versions to use. + */ + 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 } + projectStructureMetadataProvider = { + includedBuildsProjectStructureMetadataProviders.value[key]?.value + ?: includedBuildsProjectStructureMetadataProviders.value[pre1920Key]?.value + } ) } } else {