From 90f4f5db263a79d878b9ee931e065206ce08d6d5 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Thu, 5 Mar 2020 23:26:36 +0300 Subject: [PATCH] Internal visibility between common source sets in Gradle (KT-37264) In KotlinCompileCommon, pass the friendPaths and refinesPaths arguments In KotlinNativeCompilation, add both friend and refined dependencies as friends for now. In getVisibleSourceSetsFromAssociateCompilations, exclude the metadata compilations to avoid incorrect results (those compilations don't have proper kotlin Issue #KT-37264 Fixed --- .../src/commonMain/kotlin/LibCommonMain.kt | 2 ++ .../jvmAndJsMain/kotlin/LibJvmAndJsMain.kt | 1 + .../src/jvmMain/kotlin/LibJvmMain.kt | 1 + .../src/linuxMain/kotlin/LibLinuxMain.kt | 1 + .../plugin/mpp/KotlinCommonCompilation.kt | 9 +++++++ .../targets/native/KotlinNativeCompilation.kt | 18 ++++++++++++- .../gradle/tasks/KotlinCompileCommon.kt | 26 ++++++++++++++++++- 7 files changed, 56 insertions(+), 2 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/commonMain/kotlin/LibCommonMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/commonMain/kotlin/LibCommonMain.kt index 898f682462f..71e560d0e85 100755 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/commonMain/kotlin/LibCommonMain.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/commonMain/kotlin/LibCommonMain.kt @@ -11,6 +11,8 @@ fun libCommonMainTopLevelFun(): Int { return 2 } +fun libCommonMainInternalFun() = Unit + fun main() { } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/jvmAndJsMain/kotlin/LibJvmAndJsMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/jvmAndJsMain/kotlin/LibJvmAndJsMain.kt index 7b9211a8006..8be19c239db 100755 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/jvmAndJsMain/kotlin/LibJvmAndJsMain.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/jvmAndJsMain/kotlin/LibJvmAndJsMain.kt @@ -4,6 +4,7 @@ actual class LibCommonMainExpect : LibCommonMainIface { actual fun libCommonMainExpectFun(): Unit { println("actualized in jvmAndJsMain") libCommonMainTopLevelFun() + libCommonMainInternalFun() } fun additionalFunInJvmAndJsActual() { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/jvmMain/kotlin/LibJvmMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/jvmMain/kotlin/LibJvmMain.kt index 8f4481fd409..d3dcf626cac 100755 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/jvmMain/kotlin/LibJvmMain.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/jvmMain/kotlin/LibJvmMain.kt @@ -2,4 +2,5 @@ package com.h0tk3y.hmpp.klib.demo fun main() { libCommonMainTopLevelFun() + libCommonMainInternalFun() } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/linuxMain/kotlin/LibLinuxMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/linuxMain/kotlin/LibLinuxMain.kt index 4f8ad838a4d..372a5b21461 100755 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/linuxMain/kotlin/LibLinuxMain.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/linuxMain/kotlin/LibLinuxMain.kt @@ -12,6 +12,7 @@ actual class LibCommonMainExpect : LibCommonMainIface { println("actualized in iosMain") libCommonMainTopLevelFun() println(CArrayPointer::class) + libCommonMainInternalFun() } fun additionalFunInLinuxActual() { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCommonCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCommonCompilation.kt index 928c499c1b9..23aba0ade5c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCommonCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCommonCompilation.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp +import org.gradle.api.file.FileCollection import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonOptions import org.jetbrains.kotlin.gradle.dsl.kotlinExtension @@ -12,6 +13,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider +import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations import org.jetbrains.kotlin.gradle.tasks.KotlinCompileCommon interface KotlinMetadataCompilation : KotlinCompilation @@ -27,4 +29,11 @@ class KotlinCommonCompilation( get() = PropertiesProvider(target.project).enableGranularSourceSetsMetadata == true && !forceCompilationToKotlinMetadata internal var forceCompilationToKotlinMetadata: Boolean = false + + override val friendArtifacts: FileCollection + get() = super.friendArtifacts.plus(run { + val project = target.project + val friendSourceSets = getVisibleSourceSetsFromAssociateCompilations(target.project, defaultSourceSet) + project.files(friendSourceSets.mapNotNull { target.compilations.findByName(it.name)?.output?.classesDirs }) + }) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt index 8fbf801b57a..3073364eec7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt @@ -11,6 +11,7 @@ import org.gradle.api.Action import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.FileCollection import org.gradle.api.file.SourceDirectorySet import org.gradle.util.ConfigureUtil import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions @@ -18,6 +19,8 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationWithResources import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.plugin.sources.getSourceSetHierarchy +import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile import org.jetbrains.kotlin.gradle.utils.SingleWarningPerBuild import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName @@ -96,4 +99,17 @@ class KotlinNativeCompilation( class KotlinSharedNativeCompilation(override val target: KotlinMetadataTarget, name: String) : AbstractKotlinNativeCompilation(target, HostManager.host, name), - KotlinMetadataCompilation \ No newline at end of file + KotlinMetadataCompilation { + + override val friendArtifacts: FileCollection + get() = super.friendArtifacts.plus(run { + val project = target.project + val friendSourceSets = getVisibleSourceSetsFromAssociateCompilations(project, defaultSourceSet).toMutableSet().apply { + // TODO: implement proper dependsOn/refines compiler args for Kotlin/Native and pass the dependsOn klibs separately; + // But for now, those dependencies don't have any special semantics, so passing all them as friends works, too + addAll(defaultSourceSet.getSourceSetHierarchy()) + remove(defaultSourceSet) + } + project.files(friendSourceSets.mapNotNull { target.compilations.findByName(it.name)?.output?.classesDirs }) + }) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt index aa1127302b4..47cd8f76873 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt @@ -18,6 +18,9 @@ package org.jetbrains.kotlin.gradle.tasks import org.gradle.api.Project import org.gradle.api.tasks.CacheableTask +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments import org.jetbrains.kotlin.compilerRunner.GradleCompilerEnvironment import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl @@ -27,8 +30,10 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonOptionsImpl import org.jetbrains.kotlin.gradle.dsl.fillDefaultValues import org.jetbrains.kotlin.gradle.internal.tasks.allOutputFiles import org.jetbrains.kotlin.gradle.logging.GradlePrintingMessageCollector +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCommonCompilation -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation +import org.jetbrains.kotlin.gradle.utils.getValue +import org.jetbrains.kotlin.gradle.plugin.sources.getSourceSetHierarchy import org.jetbrains.kotlin.incremental.ChangedFiles import java.io.File @@ -65,11 +70,30 @@ open class KotlinCompileCommon : AbstractKotlinCompile): List { + val target = taskData.compilation.target + return sourceSets + .mapNotNull { sourceSet -> target.compilations.findByName(sourceSet.name)?.output?.classesDirs } + .flatten() + } + + private val defaultKotlinSourceSet: KotlinSourceSet + get() = taskData.compilation.defaultSourceSet + + @get:PathSensitive(PathSensitivity.RELATIVE) + @get:InputFiles + internal val refinesMetadataPaths by project.provider { + outputPathsFromMetadataCompilationsOf(defaultKotlinSourceSet.getSourceSetHierarchy().minus(defaultKotlinSourceSet)) + } + override fun callCompilerAsync(args: K2MetadataCompilerArguments, sourceRoots: SourceRoots, changedFiles: ChangedFiles) { val messageCollector = GradlePrintingMessageCollector(logger) val outputItemCollector = OutputItemsCollectorImpl()