[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 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) { if (extension.project.kotlinPropertiesProvider.enableSlowIdeSourcesJarResolver) {
registerAdditionalArtifactResolver( registerAdditionalArtifactResolver(
resolver = IdeArtifactResolutionQuerySourcesAndDocumentationResolver, 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.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver.Companion.resolvedBy 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.*
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.AdditionalArtifactResolutionPhase.SourcesAndDocumentationResolution
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.Companion.logger import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.Companion.logger
import org.jetbrains.kotlin.tooling.core.Extras import org.jetbrains.kotlin.tooling.core.Extras
import org.jetbrains.kotlin.tooling.core.HasMutableExtras import org.jetbrains.kotlin.tooling.core.HasMutableExtras
@@ -22,7 +23,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.measureTimeMillisWithResult
import kotlin.system.measureTimeMillis import kotlin.system.measureTimeMillis
internal class IdeMultiplatformImportImpl( internal class IdeMultiplatformImportImpl(
private val extension: KotlinProjectExtension private val extension: KotlinProjectExtension,
) : IdeMultiplatformImport { ) : IdeMultiplatformImport {
override fun resolveDependencies(sourceSetName: String): Set<IdeaKotlinDependency> { override fun resolveDependencies(sourceSetName: String): Set<IdeaKotlinDependency> {
@@ -58,6 +59,14 @@ internal class IdeMultiplatformImportImpl(
private val registeredDependencyEffects = mutableListOf<RegisteredDependencyEffect>() private val registeredDependencyEffects = mutableListOf<RegisteredDependencyEffect>()
private val registeredExtrasSerializationExtensions = mutableListOf<IdeaKotlinExtrasSerializationExtension>() 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) @OptIn(Idea222Api::class)
override fun registerDependencyResolver( override fun registerDependencyResolver(
resolver: IdeDependencyResolver, resolver: IdeDependencyResolver,
@@ -80,7 +89,7 @@ internal class IdeMultiplatformImportImpl(
override fun registerDependencyTransformer( override fun registerDependencyTransformer(
transformer: IdeDependencyTransformer, transformer: IdeDependencyTransformer,
constraint: SourceSetConstraint, constraint: SourceSetConstraint,
phase: DependencyTransformationPhase phase: DependencyTransformationPhase,
) { ) {
registeredDependencyTransformers.add( registeredDependencyTransformers.add(
RegisteredDependencyTransformer(transformer, constraint, phase) RegisteredDependencyTransformer(transformer, constraint, phase)
@@ -91,7 +100,7 @@ internal class IdeMultiplatformImportImpl(
resolver: IdeAdditionalArtifactResolver, resolver: IdeAdditionalArtifactResolver,
constraint: SourceSetConstraint, constraint: SourceSetConstraint,
phase: AdditionalArtifactResolutionPhase, phase: AdditionalArtifactResolutionPhase,
priority: Priority priority: Priority,
) { ) {
registeredAdditionalArtifactResolvers.add( registeredAdditionalArtifactResolvers.add(
RegisteredAdditionalArtifactResolver( RegisteredAdditionalArtifactResolver(
@@ -140,8 +149,15 @@ internal class IdeMultiplatformImportImpl(
private fun createAdditionalArtifactsResolver() = IdeAdditionalArtifactResolver( private fun createAdditionalArtifactsResolver() = IdeAdditionalArtifactResolver(
AdditionalArtifactResolutionPhase.values().map { phase -> createAdditionalArtifactsResolver(phase) }) AdditionalArtifactResolutionPhase.values().map { phase -> createAdditionalArtifactsResolver(phase) })
private fun createAdditionalArtifactsResolver(phase: AdditionalArtifactResolutionPhase) = private fun createAdditionalArtifactsResolver(phase: AdditionalArtifactResolutionPhase): IdeAdditionalArtifactResolver {
IdeAdditionalArtifactResolver resolve@{ sourceSet, dependencies -> /*
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 val applicableResolvers = registeredAdditionalArtifactResolvers
.filter { it.phase == phase } .filter { it.phase == phase }
.filter { it.constraint(sourceSet) } .filter { it.constraint(sourceSet) }
@@ -155,6 +171,7 @@ internal class IdeMultiplatformImportImpl(
} }
} }
} }
}
private fun createDependencyTransformer(): IdeDependencyTransformer { private fun createDependencyTransformer(): IdeDependencyTransformer {
return IdeDependencyTransformer(DependencyTransformationPhase.values().map { phase -> return IdeDependencyTransformer(DependencyTransformationPhase.values().map { phase ->
@@ -189,7 +206,7 @@ internal class IdeMultiplatformImportImpl(
private data class RegisteredDependencyTransformer( private data class RegisteredDependencyTransformer(
val transformer: IdeDependencyTransformer, val transformer: IdeDependencyTransformer,
val constraint: SourceSetConstraint, val constraint: SourceSetConstraint,
val phase: DependencyTransformationPhase val phase: DependencyTransformationPhase,
) )
private data class RegisteredDependencyEffect( 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.api.artifacts.result.ResolvedArtifactResult
import org.gradle.jvm.JvmLibrary import org.gradle.jvm.JvmLibrary
import org.gradle.language.base.artifact.SourcesArtifact 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.IdeaKotlinBinaryCoordinates
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinResolvedBinaryDependency 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.extras.sourcesClasspath
import org.jetbrains.kotlin.gradle.idea.tcs.isKotlinCompileBinaryType import org.jetbrains.kotlin.gradle.idea.tcs.isKotlinCompileBinaryType
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
@@ -41,9 +39,10 @@ internal object IdeArtifactResolutionQuerySourcesAndDocumentationResolver : IdeA
val project = sourceSet.project val project = sourceSet.project
val configuration = selectConfiguration(sourceSet) val configuration = selectConfiguration(sourceSet)
val resolutionResult = project.dependencies.createArtifactResolutionQuery() val resolutionResult = project.dependencies.createArtifactResolutionQuery()
.forComponents(configuration.incoming.resolutionResult.allComponents.map { it.id }) .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() .execute()
val sourcesArtifacts = resolutionResult.resolvedComponents.flatMap { resolved -> val sourcesArtifacts = resolutionResult.resolvedComponents.flatMap { resolved ->
@@ -55,16 +54,6 @@ internal object IdeArtifactResolutionQuerySourcesAndDocumentationResolver : IdeA
dependency.sourcesClasspath.add(artifact.file) 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 { 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))
}
)
)