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()