From 07aee8831eb45690053028f39f3312e1c8e90f69 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Fri, 7 Aug 2020 00:59:02 +0400 Subject: [PATCH] Fix stdlib-by-default with non-compiled source sets (KT-40559) When a `variantFilter { ... }` is used in Android projects, AGP does not creates some variants but still creates the source sets which would be related to those variants. For source sets that are not included into any compilation, the stdlib module added by default was kotlin-stdlib-common, and it was added to the `api` scope. But AGP checks the `androidTest*Api` configurations and if it detects any dependencies in them, it reports deprecation warnings. However, we have plans to prohibit unused source sets at all as they have no reasonable use cases. So the fix is not to add the stdlib by default to source sets that participate in no compilations. Issue #KT-40559 Fixed --- .../org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt | 4 ++-- .../kotlin/gradle/internal/KotlinDependenciesManagement.kt | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index 57a5ddcb4ea..14010fca230 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -2107,13 +2107,13 @@ class NewMultiplatformIT : BaseGradleIT() { fun testDependencies() = testResolveAllConfigurations("app") { assertContains(">> :app:testNonTransitiveStringNotationApiDependenciesMetadata --> junit-4.12.jar") assertEquals( - 2, // the dependency above and stdlib + 1, (Regex.escape(">> :app:testNonTransitiveStringNotationApiDependenciesMetadata") + " .*").toRegex().findAll(output).count() ) assertContains(">> :app:testNonTransitiveDependencyNotationApiDependenciesMetadata --> kotlin-reflect-${defaultBuildOptions().kotlinVersion}.jar") assertEquals( - 2, // the dependency above and stdlib + 1, (Regex.escape(">> :app:testNonTransitiveStringNotationApiDependenciesMetadata") + " .*").toRegex().findAll(output).count() ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt index 949a321ae58..ee514ddd019 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt @@ -99,10 +99,14 @@ private fun chooseAndAddStdlibDependency( val compilations = CompilationSourceSetUtil.compilationsBySourceSets(project).getValue(kotlinSourceSet) .filter { it.target !is KotlinMetadataTarget } + + if (compilations.isEmpty()) + // source set doesn't take part in any compilation; prohibit this in the future; also, this caused KT-40559 in Android libraries + return + val platformTypes = compilations.mapTo(mutableSetOf()) { it.platformType } val sourceSetStdlibPlatformType = when { - platformTypes.isEmpty() -> KotlinPlatformType.common platformTypes.size == 1 -> platformTypes.single() setOf(KotlinPlatformType.jvm, KotlinPlatformType.androidJvm).containsAll(platformTypes) -> KotlinPlatformType.jvm else -> KotlinPlatformType.common