[Gradle] Multiplatform Import: Support intellij/gradle 'idea.gradle.download.sources' flag

^KT-60441 Verification Pending
This commit is contained in:
Sebastian Sellmair
2023-07-17 09:44:22 +02:00
committed by Space Team
parent 3cdb28e95f
commit e5ac2f2788
5 changed files with 25 additions and 84 deletions
@@ -125,20 +125,6 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti
priority = IdeMultiplatformImport.Priority.normal
)
registerDependencyResolver(
resolver = IdePlatformSourcesResolver(),
constraint = SourceSetConstraint.isSinglePlatformType,
phase = IdeMultiplatformImport.DependencyResolutionPhase.SourcesAndDocumentationResolution,
priority = IdeMultiplatformImport.Priority.normal
)
registerAdditionalArtifactResolver(
resolver = IdeMetadataSourcesResolver(),
constraint = !SourceSetConstraint.isSinglePlatformType,
phase = IdeMultiplatformImport.AdditionalArtifactResolutionPhase.SourcesAndDocumentationResolution,
priority = IdeMultiplatformImport.Priority.normal
)
if (extension.project.kotlinPropertiesProvider.enableSlowIdeSourcesJarResolver) {
registerAdditionalArtifactResolver(
resolver = IdeArtifactResolutionQuerySourcesAndDocumentationResolver,
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.gradle.kpm.idea.IdeaSerializationContext
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver.Companion.resolvedBy
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.*
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.AdditionalArtifactResolutionPhase.SourcesAndDocumentationResolution
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.Companion.logger
import org.jetbrains.kotlin.tooling.core.Extras
import org.jetbrains.kotlin.tooling.core.HasMutableExtras
@@ -22,7 +23,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.measureTimeMillisWithResult
import kotlin.system.measureTimeMillis
internal class IdeMultiplatformImportImpl(
private val extension: KotlinProjectExtension
private val extension: KotlinProjectExtension,
) : IdeMultiplatformImport {
override fun resolveDependencies(sourceSetName: String): Set<IdeaKotlinDependency> {
@@ -58,6 +59,14 @@ internal class IdeMultiplatformImportImpl(
private val registeredDependencyEffects = mutableListOf<RegisteredDependencyEffect>()
private val registeredExtrasSerializationExtensions = mutableListOf<IdeaKotlinExtrasSerializationExtension>()
/**
* System property passed down by the IDE, reflecting the users setting of 'Download sources during sync'
* This property is expected to be present in IDEs > 23.3
* If 'true' the import is instructed to download all sources.jar eagerly.
* If 'false' the import is instructed to not download any sources.jar
*/
private val ideaGradleDownloadSourcesProperty = extension.project.providers.systemProperty("idea.gradle.download.sources")
@OptIn(Idea222Api::class)
override fun registerDependencyResolver(
resolver: IdeDependencyResolver,
@@ -80,7 +89,7 @@ internal class IdeMultiplatformImportImpl(
override fun registerDependencyTransformer(
transformer: IdeDependencyTransformer,
constraint: SourceSetConstraint,
phase: DependencyTransformationPhase
phase: DependencyTransformationPhase,
) {
registeredDependencyTransformers.add(
RegisteredDependencyTransformer(transformer, constraint, phase)
@@ -91,7 +100,7 @@ internal class IdeMultiplatformImportImpl(
resolver: IdeAdditionalArtifactResolver,
constraint: SourceSetConstraint,
phase: AdditionalArtifactResolutionPhase,
priority: Priority
priority: Priority,
) {
registeredAdditionalArtifactResolvers.add(
RegisteredAdditionalArtifactResolver(
@@ -140,8 +149,15 @@ internal class IdeMultiplatformImportImpl(
private fun createAdditionalArtifactsResolver() = IdeAdditionalArtifactResolver(
AdditionalArtifactResolutionPhase.values().map { phase -> createAdditionalArtifactsResolver(phase) })
private fun createAdditionalArtifactsResolver(phase: AdditionalArtifactResolutionPhase) =
IdeAdditionalArtifactResolver resolve@{ sourceSet, dependencies ->
private fun createAdditionalArtifactsResolver(phase: AdditionalArtifactResolutionPhase): IdeAdditionalArtifactResolver {
/*
Skip resolving sources if IDE instructs us to (ideaGradleDownloadSourcesProperty is passed by the IDE, reflecting user settings)
*/
if (phase == SourcesAndDocumentationResolution && ideaGradleDownloadSourcesProperty.orNull?.toBoolean() == false) {
return IdeAdditionalArtifactResolver.empty
}
return IdeAdditionalArtifactResolver resolve@{ sourceSet, dependencies ->
val applicableResolvers = registeredAdditionalArtifactResolvers
.filter { it.phase == phase }
.filter { it.constraint(sourceSet) }
@@ -155,6 +171,7 @@ internal class IdeMultiplatformImportImpl(
}
}
}
}
private fun createDependencyTransformer(): IdeDependencyTransformer {
return IdeDependencyTransformer(DependencyTransformationPhase.values().map { phase ->
@@ -189,7 +206,7 @@ internal class IdeMultiplatformImportImpl(
private data class RegisteredDependencyTransformer(
val transformer: IdeDependencyTransformer,
val constraint: SourceSetConstraint,
val phase: DependencyTransformationPhase
val phase: DependencyTransformationPhase,
)
private data class RegisteredDependencyEffect(
@@ -10,11 +10,9 @@ import org.gradle.api.artifacts.component.ModuleComponentIdentifier
import org.gradle.api.artifacts.result.ResolvedArtifactResult
import org.gradle.jvm.JvmLibrary
import org.gradle.language.base.artifact.SourcesArtifact
import org.gradle.language.java.artifact.JavadocArtifact
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryCoordinates
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinResolvedBinaryDependency
import org.jetbrains.kotlin.gradle.idea.tcs.extras.documentationClasspath
import org.jetbrains.kotlin.gradle.idea.tcs.extras.sourcesClasspath
import org.jetbrains.kotlin.gradle.idea.tcs.isKotlinCompileBinaryType
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
@@ -41,9 +39,10 @@ internal object IdeArtifactResolutionQuerySourcesAndDocumentationResolver : IdeA
val project = sourceSet.project
val configuration = selectConfiguration(sourceSet)
val resolutionResult = project.dependencies.createArtifactResolutionQuery()
.forComponents(configuration.incoming.resolutionResult.allComponents.map { it.id })
.withArtifacts(JvmLibrary::class.java, SourcesArtifact::class.java, JavadocArtifact::class.java)
.withArtifacts(JvmLibrary::class.java, SourcesArtifact::class.java)
.execute()
val sourcesArtifacts = resolutionResult.resolvedComponents.flatMap { resolved ->
@@ -55,16 +54,6 @@ internal object IdeArtifactResolutionQuerySourcesAndDocumentationResolver : IdeA
dependency.sourcesClasspath.add(artifact.file)
}
}
val javadocArtifacts = resolutionResult.resolvedComponents.flatMap { resolved ->
resolved.getArtifacts(JavadocArtifact::class.java).filterIsInstance<ResolvedArtifactResult>()
}
javadocArtifacts.forEach { artifact ->
binaryDependencies[Coordinates(artifact)]?.forEach { dependency ->
dependency.documentationClasspath.add(artifact.file)
}
}
}
private fun selectConfiguration(sourceSet: KotlinSourceSet): Configuration {
@@ -1,28 +0,0 @@
/*
* 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.
*/
@file:Suppress("FunctionName")
package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers
import org.gradle.api.attributes.Category
import org.gradle.api.attributes.DocsType
import org.jetbrains.kotlin.gradle.plugin.ide.IdeAdditionalArtifactResolver
import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver
import org.jetbrains.kotlin.gradle.plugin.ide.asAdditionalArtifactResolver
import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration
import org.jetbrains.kotlin.gradle.plugin.sources.internal
import org.jetbrains.kotlin.gradle.utils.named
internal fun IdeMetadataSourcesResolver(): IdeAdditionalArtifactResolver = IdeBinaryDependencyResolver(
binaryType = IdeDependencyResolver.SOURCES_BINARY_TYPE,
artifactResolutionStrategy = IdeBinaryDependencyResolver.ArtifactResolutionStrategy.ResolvableConfiguration(
configurationSelector = { it.internal.resolvableMetadataConfiguration },
setupArtifactViewAttributes = {
attribute(Category.CATEGORY_ATTRIBUTE, it.project.objects.named(Category.DOCUMENTATION))
attribute(DocsType.DOCS_TYPE_ATTRIBUTE, it.project.objects.named(DocsType.SOURCES))
}
)
).asAdditionalArtifactResolver()
@@ -1,23 +0,0 @@
/*
* 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.
*/
@file:Suppress("FunctionName")
package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers
import org.gradle.api.attributes.Category
import org.gradle.api.attributes.DocsType
import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver
import org.jetbrains.kotlin.gradle.utils.named
internal fun IdePlatformSourcesResolver(): IdeBinaryDependencyResolver = IdeBinaryDependencyResolver(
binaryType = IdeDependencyResolver.SOURCES_BINARY_TYPE,
artifactResolutionStrategy = IdeBinaryDependencyResolver.ArtifactResolutionStrategy.Compilation(
setupArtifactViewAttributes = {
attribute(Category.CATEGORY_ATTRIBUTE, it.project.objects.named(Category.DOCUMENTATION))
attribute(DocsType.DOCS_TYPE_ATTRIBUTE, it.project.objects.named(DocsType.SOURCES))
}
)
)