[Gradle] GranularMetadataTransformation: Collect moduleIds in ProjectData for non Kotlin Projects
^KT-59446 Verification Pending
This commit is contained in:
committed by
Space Team
parent
d3d6cdcef7
commit
685eee38ac
+31
-10
@@ -13,6 +13,7 @@ import org.gradle.api.attributes.AttributeContainer
|
|||||||
import org.gradle.api.file.FileCollection
|
import org.gradle.api.file.FileCollection
|
||||||
import org.gradle.api.logging.Logging
|
import org.gradle.api.logging.Logging
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
|
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
|
||||||
|
import org.jetbrains.kotlin.gradle.dsl.kotlinExtensionOrNull
|
||||||
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
|
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ArtifactMetadataProvider
|
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ArtifactMetadataProvider
|
||||||
@@ -36,15 +37,15 @@ internal sealed class MetadataDependencyResolution(
|
|||||||
}
|
}
|
||||||
|
|
||||||
class KeepOriginalDependency(
|
class KeepOriginalDependency(
|
||||||
dependency: ResolvedComponentResult
|
dependency: ResolvedComponentResult,
|
||||||
) : MetadataDependencyResolution(dependency)
|
) : MetadataDependencyResolution(dependency)
|
||||||
|
|
||||||
sealed class Exclude(
|
sealed class Exclude(
|
||||||
dependency: ResolvedComponentResult
|
dependency: ResolvedComponentResult,
|
||||||
) : MetadataDependencyResolution(dependency) {
|
) : MetadataDependencyResolution(dependency) {
|
||||||
|
|
||||||
class Unrequested(
|
class Unrequested(
|
||||||
dependency: ResolvedComponentResult
|
dependency: ResolvedComponentResult,
|
||||||
) : Exclude(dependency)
|
) : Exclude(dependency)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -65,7 +66,7 @@ internal sealed class MetadataDependencyResolution(
|
|||||||
val allVisibleSourceSetNames: Set<String>,
|
val allVisibleSourceSetNames: Set<String>,
|
||||||
val visibleSourceSetNamesExcludingDependsOn: Set<String>,
|
val visibleSourceSetNamesExcludingDependsOn: Set<String>,
|
||||||
val visibleTransitiveDependencies: Set<ResolvedDependencyResult>,
|
val visibleTransitiveDependencies: Set<ResolvedDependencyResult>,
|
||||||
internal val metadataProvider: MetadataProvider
|
internal val metadataProvider: MetadataProvider,
|
||||||
) : MetadataDependencyResolution(dependency) {
|
) : MetadataDependencyResolution(dependency) {
|
||||||
|
|
||||||
internal sealed class MetadataProvider {
|
internal sealed class MetadataProvider {
|
||||||
@@ -89,7 +90,7 @@ internal sealed class MetadataDependencyResolution(
|
|||||||
|
|
||||||
internal class GranularMetadataTransformation(
|
internal class GranularMetadataTransformation(
|
||||||
val params: Params,
|
val params: Params,
|
||||||
val parentSourceSetVisibilityProvider: ParentSourceSetVisibilityProvider
|
val parentSourceSetVisibilityProvider: ParentSourceSetVisibilityProvider,
|
||||||
) {
|
) {
|
||||||
private val logger = Logging.getLogger("GranularMetadataTransformation[${params.sourceSetName}]")
|
private val logger = Logging.getLogger("GranularMetadataTransformation[${params.sourceSetName}]")
|
||||||
|
|
||||||
@@ -114,7 +115,7 @@ internal class GranularMetadataTransformation(
|
|||||||
class ProjectData(
|
class ProjectData(
|
||||||
val path: String,
|
val path: String,
|
||||||
val sourceSetMetadataOutputs: LenientFuture<Map<String, SourceSetMetadataOutputs>>,
|
val sourceSetMetadataOutputs: LenientFuture<Map<String, SourceSetMetadataOutputs>>,
|
||||||
val moduleId: LenientFuture<ModuleDependencyIdentifier>
|
val moduleId: LenientFuture<ModuleDependencyIdentifier>,
|
||||||
) {
|
) {
|
||||||
override fun toString(): String = "ProjectData[path='$path']"
|
override fun toString(): String = "ProjectData[path='$path']"
|
||||||
}
|
}
|
||||||
@@ -325,13 +326,33 @@ private val Project.allProjectsData: Map<String, GranularMetadataTransformation.
|
|||||||
|
|
||||||
private fun Project.collectAllProjectsData(): Map<String, GranularMetadataTransformation.ProjectData> {
|
private fun Project.collectAllProjectsData(): Map<String, GranularMetadataTransformation.ProjectData> {
|
||||||
return rootProject.allprojects.associateBy { it.path }.mapValues { (path, currentProject) ->
|
return rootProject.allprojects.associateBy { it.path }.mapValues { (path, currentProject) ->
|
||||||
|
|
||||||
|
/*
|
||||||
|
We're calling into various different projects (Note: This implementation will change with Project Isolation)
|
||||||
|
Since not all projects might have the Kotlin Gradle Plugin applied we do call into 'idOfRootModule' in two different ways:
|
||||||
|
|
||||||
|
1) If KGP is applied, we use the lifecycle APIs to safely get a value after the DSL was finalised.
|
||||||
|
2) If KGP was *not* applied, we create a Future which
|
||||||
|
- creates a lazy once the project is evaluated
|
||||||
|
- only evaluates the lazy once the moduleId is actually accessed
|
||||||
|
|
||||||
|
This double deferral ensures that the value indeed is accessed as late as possible.
|
||||||
|
Unwrapping the lazy before the buildscript is evaluated will fail with 'future not completed'
|
||||||
|
*/
|
||||||
|
val moduleId = if (currentProject.kotlinExtensionOrNull != null) currentProject.future {
|
||||||
|
KotlinPluginLifecycle.Stage.AfterFinaliseDsl.await()
|
||||||
|
ModuleIds.idOfRootModule(currentProject)
|
||||||
|
}.lenient else CompletableFuture<Lazy<ModuleDependencyIdentifier>>().apply {
|
||||||
|
currentProject.whenEvaluated {
|
||||||
|
complete(lazy { ModuleIds.idOfRootModule(currentProject) })
|
||||||
|
}
|
||||||
|
}.map { it.value }.lenient
|
||||||
|
|
||||||
|
|
||||||
GranularMetadataTransformation.ProjectData(
|
GranularMetadataTransformation.ProjectData(
|
||||||
path = path,
|
path = path,
|
||||||
sourceSetMetadataOutputs = currentProject.future { currentProject.collectSourceSetMetadataOutputs() }.lenient,
|
sourceSetMetadataOutputs = currentProject.future { currentProject.collectSourceSetMetadataOutputs() }.lenient,
|
||||||
moduleId = currentProject.future {
|
moduleId = moduleId
|
||||||
KotlinPluginLifecycle.Stage.AfterFinaliseDsl.await()
|
|
||||||
ModuleIds.idOfRootModule(currentProject)
|
|
||||||
}.lenient
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user