From e5ac2f278864d7b047e74244ec66242b5e1d13f0 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Mon, 17 Jul 2023 09:44:22 +0200 Subject: [PATCH] [Gradle] Multiplatform Import: Support intellij/gradle 'idea.gradle.download.sources' flag ^KT-60441 Verification Pending --- .../ide/IdeMultiplatformImportFactory.kt | 14 --------- .../plugin/ide/IdeMultiplatformImportImpl.kt | 29 +++++++++++++++---- ...ionQuerySourcesAndDocumentationResolver.kt | 15 ++-------- .../IdeMetadataSourcesResolver.kt | 28 ------------------ .../IdePlatformSourcesResolver.kt | 23 --------------- 5 files changed, 25 insertions(+), 84 deletions(-) delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeMetadataSourcesResolver.kt delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdePlatformSourcesResolver.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportFactory.kt index 94b09f9e2c8..5860bc43fcd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportFactory.kt @@ -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, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportImpl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportImpl.kt index b889e722ab7..0d0b109717a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportImpl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportImpl.kt @@ -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 { @@ -58,6 +59,14 @@ internal class IdeMultiplatformImportImpl( private val registeredDependencyEffects = mutableListOf() private val registeredExtrasSerializationExtensions = mutableListOf() + /** + * 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( diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeArtifactResolutionQuerySourcesAndDocumentationResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeArtifactResolutionQuerySourcesAndDocumentationResolver.kt index f45a89b32c2..6073cc79687 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeArtifactResolutionQuerySourcesAndDocumentationResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeArtifactResolutionQuerySourcesAndDocumentationResolver.kt @@ -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() - } - - javadocArtifacts.forEach { artifact -> - binaryDependencies[Coordinates(artifact)]?.forEach { dependency -> - dependency.documentationClasspath.add(artifact.file) - } - } } private fun selectConfiguration(sourceSet: KotlinSourceSet): Configuration { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeMetadataSourcesResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeMetadataSourcesResolver.kt deleted file mode 100644 index 898f96740a8..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeMetadataSourcesResolver.kt +++ /dev/null @@ -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() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdePlatformSourcesResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdePlatformSourcesResolver.kt deleted file mode 100644 index fa4d5f10e16..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdePlatformSourcesResolver.kt +++ /dev/null @@ -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)) - } - ) -)