From d7ba6916b5fd9fff107121324a519a96a94cae86 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Wed, 7 Dec 2022 17:40:34 +0100 Subject: [PATCH] [Gradle] Implement UnusedSourcesAndDocumentationFilter ^KT-55289 Verification Pending --- .../ide/IdeMultiplatformImportFactory.kt | 7 +++ .../UnusedSourcesAndDocumentationFilter.kt | 48 +++++++++++++++++++ ...deSourcesAndDocumentationResolutionTest.kt | 20 +------- 3 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyTransformers/UnusedSourcesAndDocumentationFilter.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 f65086844f9..97726d891da 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 @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPro import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.SourceSetConstraint import org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers.* import org.jetbrains.kotlin.gradle.plugin.ide.dependencyTransformers.IdePlatformStdlibCommonDependencyFilter +import org.jetbrains.kotlin.gradle.plugin.ide.dependencyTransformers.UnusedSourcesAndDocumentationFilter internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMultiplatformImport { return IdeMultiplatformImportImpl(extension).apply { @@ -131,6 +132,12 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti phase = IdeMultiplatformImport.DependencyTransformationPhase.DependencyFilteringPhase, ) + registerDependencyTransformer( + transformer = UnusedSourcesAndDocumentationFilter, + constraint = SourceSetConstraint.unconstrained, + phase = IdeMultiplatformImport.DependencyTransformationPhase.DependencyFilteringPhase + ) + registerDependencyEffect( effect = IdeDependencyLogger, constraint = SourceSetConstraint.unconstrained diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyTransformers/UnusedSourcesAndDocumentationFilter.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyTransformers/UnusedSourcesAndDocumentationFilter.kt new file mode 100644 index 00000000000..b7d575d2fae --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyTransformers/UnusedSourcesAndDocumentationFilter.kt @@ -0,0 +1,48 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.gradle.plugin.ide.dependencyTransformers + +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryCoordinates +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency.Companion.CLASSPATH_BINARY_TYPE +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency.Companion.DOCUMENTATION_BINARY_TYPE +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency.Companion.SOURCES_BINARY_TYPE +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinResolvedBinaryDependency +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyTransformer +import org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers.IdeArtifactResolutionQuerySourcesAndDocumentationResolver + +/** + * Filters out -sources.jar and -javadoc.jar dependencies that are actually not necessary for the KotlinSourceSet: + * This counter-acts the fact that the [IdeArtifactResolutionQuerySourcesAndDocumentationResolver] is potentially "over-resolving" sources + * for multiplatform libraries. + */ +internal object UnusedSourcesAndDocumentationFilter : IdeDependencyTransformer { + + override fun transform(sourceSet: KotlinSourceSet, dependencies: Set): Set { + val binaryDependencies = dependencies.filterIsInstance() + + val classpathBinaryCoordinates = binaryDependencies.filter { it.binaryType == CLASSPATH_BINARY_TYPE } + .mapNotNull { it.coordinates?.relevantString() } + .toSet() + + val unusedDependencies = binaryDependencies.filter { it.binaryType in sourcesAndDocumentationBinaryTypes } + .filter { it.coordinates?.relevantString() !in classpathBinaryCoordinates } + .toSet() + + return dependencies - unusedDependencies + } + + + private val sourcesAndDocumentationBinaryTypes = setOf(SOURCES_BINARY_TYPE, DOCUMENTATION_BINARY_TYPE) + + /** + * This filter only works based upon group, module and version. + * We can consider the sourceSetName to be irrelevant, since we do not have -sources.jar published on a 'per source set' level. + */ + private fun IdeaKotlinBinaryCoordinates.relevantString(): String = "$group:$module:$version" +} + diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ide/IdeSourcesAndDocumentationResolutionTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ide/IdeSourcesAndDocumentationResolutionTest.kt index 46fa1fafc8a..9ffdacc7271 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ide/IdeSourcesAndDocumentationResolutionTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ide/IdeSourcesAndDocumentationResolutionTest.kt @@ -66,10 +66,6 @@ class IdeSourcesAndDocumentationResolutionTest { binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:3.0.2"), binaryCoordinates("com.arkivanov.essenty:lifecycle:0.4.2"), binaryCoordinates("com.arkivanov.essenty:instance-keeper:0.4.2"), - - /* sources.jar resolution using ArtifactResolutionQuery will resolve those additionally */ - binaryCoordinates("org.jetbrains:annotations:13.0"), - binaryCoordinates(Regex(escape("org.jetbrains.kotlin:kotlin-stdlib") + ".*")) ) val resolvedDependencies = resolveDependencySources(commonMain) @@ -84,11 +80,7 @@ class IdeSourcesAndDocumentationResolutionTest { binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:3.0.2"), binaryCoordinates("com.arkivanov.essenty:lifecycle:0.4.2"), binaryCoordinates("com.arkivanov.essenty:instance-keeper:0.4.2"), - IdeNativeStdlibDependencyResolver.nativeStdlibCoordinates(project), - - /* sources.jar resolution using ArtifactResolutionQuery will resolve those additionally */ - binaryCoordinates("org.jetbrains:annotations:13.0"), - binaryCoordinates(Regex(escape("org.jetbrains.kotlin:kotlin-stdlib") + ".*")) + IdeNativeStdlibDependencyResolver.nativeStdlibCoordinates(project) ) val resolvedDependencies = resolveDependencySources(nativeMain) @@ -100,16 +92,6 @@ class IdeSourcesAndDocumentationResolutionTest { /* Check linuxX64Main and linuxX64Test */ run { val expectedDependencies = listOf( - /* Artifact Query is 'over providing' */ - listOf( - binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:3.0.2"), - binaryCoordinates("com.arkivanov.mvikotlin:utils-internal:3.0.2"), - binaryCoordinates("com.arkivanov.mvikotlin:rx:3.0.2"), - binaryCoordinates("com.arkivanov.mvikotlin:rx-internal:3.0.2"), - binaryCoordinates("com.arkivanov.essenty:utils-internal:0.4.2"), - binaryCoordinates("com.arkivanov.essenty:lifecycle:0.4.2"), - binaryCoordinates("com.arkivanov.essenty:instance-keeper:0.4.2") - ), /* Required dependencies */ listOf(