From 7308583388b014bc00e2a857a84cd2d9a7cfe9a2 Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Mon, 19 Dec 2022 19:25:06 +0200 Subject: [PATCH] [MPP] Fix propagation of cinterops from associate compilations and leafs KT-54975 --- .../gradle/MppIdeDependencyResolutionIT.kt | 12 ++++++------ .../plugin/ide/IdeMultiplatformImportFactory.kt | 1 - .../IdePlatformCinteropDependencyResolver.kt | 8 ++------ .../resolveCinteropDependency.kt | 17 ++++++----------- .../internal/CInteropPropagatedDependencies.kt | 16 ++++++++++++---- 5 files changed, 26 insertions(+), 28 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppIdeDependencyResolutionIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppIdeDependencyResolutionIT.kt index f47ab369cd9..76946c3940f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppIdeDependencyResolutionIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppIdeDependencyResolutionIT.kt @@ -102,14 +102,13 @@ class MppIdeDependencyResolutionIT : KGPBaseTest() { val linuxArmTestDependencies = dependencies["linuxArm64Test"].cinteropDependencies() for (commonDeps in listOf(commonMainDependencies, commonTestDependencies)) { - commonDeps.assertMatches(binaryCoordinates(Regex("a:dep.*linux_arm64, linux_x64"))) + commonDeps.assertMatches(binaryCoordinates(Regex("a:dep.*\\(linux_arm64, linux_x64\\)"))) } linuxX64MainDependencies.assertMatches(binaryCoordinates(Regex("a:dep.*linux_x64"))) linuxArmMainDependencies.assertMatches(binaryCoordinates(Regex("a:dep.*linux_arm64"))) - // TODO (kirpichenkov): cinterops from associate compilations for platform source sets - linuxX64TestDependencies.assertMatches(/*binaryCoordinates(Regex("a:dep.*linux_x64"))*/) - linuxArmTestDependencies.assertMatches(/*binaryCoordinates(Regex("a:dep.*linux_arm64"))*/) + linuxX64TestDependencies.assertMatches(binaryCoordinates(Regex("a:dep.*linux_x64"))) + linuxArmTestDependencies.assertMatches(binaryCoordinates(Regex("a:dep.*linux_arm64"))) } resolveIdeDependencies("client-for-binary-dep") { dependencies -> @@ -122,12 +121,13 @@ class MppIdeDependencyResolutionIT : KGPBaseTest() { for (commonDeps in listOf(commonMainDependencies, commonTestDependencies)) { commonDeps.assertMatches( - commonDeps.assertMatches(binaryCoordinates(Regex("a:dep.*linux_arm64, linux_x64"))) + commonDeps.assertMatches(binaryCoordinates(Regex("a:dep.*\\(linux_arm64, linux_x64\\)"))) ) } for (platformDeps in listOf(linuxMainDependencies, linuxTestDependencies, linux2MainDependencies, linux2TestDependencies)) { platformDeps.assertMatches( + // TODO (kirpichenkov): consider extracting cinterops from , platform source set cinterops ) } } @@ -141,7 +141,7 @@ class MppIdeDependencyResolutionIT : KGPBaseTest() { val linux2TestDependencies = dependencies["linuxArm64Test"].cinteropDependencies() for (commonDeps in listOf(commonMainDependencies, commonTestDependencies)) { - commonDeps.assertMatches(binaryCoordinates(Regex("a:dep.*linux_arm64, linux_x64"))) + commonDeps.assertMatches(binaryCoordinates(Regex("a:dep.*\\(linux_arm64, linux_x64\\)"))) } for (platformDeps in listOf(linuxMainDependencies, linuxTestDependencies, linux2MainDependencies, linux2TestDependencies)) { 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 7e639edab86..97d5b292c97 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 @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.SourceSetCo import org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers.* import org.jetbrains.kotlin.gradle.plugin.ide.dependencyTransformers.IdePlatformStdlibCommonDependencyFilter import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget -import org.jetbrains.kotlin.gradle.plugin.ide.dependencyTransformers.UnusedSourcesAndDocumentationFilter internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMultiplatformImport { return IdeMultiplatformImportImpl(extension).apply { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdePlatformCinteropDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdePlatformCinteropDependencyResolver.kt index 450c9761184..46139956a46 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdePlatformCinteropDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdePlatformCinteropDependencyResolver.kt @@ -8,19 +8,15 @@ package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet -import org.jetbrains.kotlin.gradle.plugin.sources.internal -import org.jetbrains.kotlin.gradle.targets.native.internal.getAllCInteropOutputFiles -import org.jetbrains.kotlin.utils.addToStdlib.safeAs +import org.jetbrains.kotlin.gradle.targets.native.internal.getPlatformCinteropDependenciesOrEmpty object IdePlatformCinteropDependencyResolver : IdeDependencyResolver { override fun resolve(sourceSet: KotlinSourceSet): Set { if (sourceSet !is DefaultKotlinSourceSet) return emptySet() val project = sourceSet.project - val nativeCompilation = sourceSet.internal.compilations.singleOrNull().safeAs() ?: return emptySet() - val cinteropFiles = project.getAllCInteropOutputFiles(nativeCompilation) + val cinteropFiles = project.getPlatformCinteropDependenciesOrEmpty(sourceSet) return resolveCinteropDependencies(project, cinteropFiles) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/resolveCinteropDependency.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/resolveCinteropDependency.kt index 51c397badfb..59fd573dd6a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/resolveCinteropDependency.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/resolveCinteropDependency.kt @@ -7,16 +7,11 @@ package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers import org.gradle.api.Project import org.gradle.api.file.FileCollection -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.* import org.jetbrains.kotlin.gradle.idea.tcs.extras.klibExtra import org.jetbrains.kotlin.gradle.plugin.ide.KlibExtra import org.jetbrains.kotlin.konan.file.File -import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION -import org.jetbrains.kotlin.library.ToolingSingleFileKlibResolveStrategy -import org.jetbrains.kotlin.library.commonizerTarget -import org.jetbrains.kotlin.library.resolveSingleFileKlib +import org.jetbrains.kotlin.library.* fun resolveCinteropDependencies(project: Project, cinteropFiles: FileCollection): Set { return cinteropFiles.files @@ -38,13 +33,13 @@ private fun createCinteropLibraryDependency(project: Project, libraryFile: java. } return IdeaKotlinResolvedBinaryDependency( - binaryType = IdeaKotlinDependency.CLASSPATH_BINARY_TYPE, - binaryFile = libraryFile, + binaryType = IdeaKotlinBinaryDependency.KOTLIN_COMPILE_BINARY_TYPE, + classpath = IdeaKotlinClasspath(libraryFile), coordinates = IdeaKotlinBinaryCoordinates( group = project.group.toString(), module = library.moduleDisplayName, - version = null, - sourceSetName = library.commonizerTarget + version = null, // TODO (kirpichenkov): if/when used for published cinterops, should be set up correctly + sourceSetName = library.nativeTargets.singleOrNull() ?: library.nativeTargets.joinToString(prefix = "(", postfix = ")") ), ).apply { klibExtra = KlibExtra(library) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropPropagatedDependencies.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropPropagatedDependencies.kt index 46669f1b437..964534a423a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropPropagatedDependencies.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropPropagatedDependencies.kt @@ -55,7 +55,16 @@ internal fun Project.setupCInteropPropagatedDependencies() { } } -private fun Project.getPropagatedCInteropDependenciesOrEmpty(sourceSet: DefaultKotlinSourceSet): FileCollection { +internal fun Project.getPropagatedCInteropDependenciesOrEmpty(sourceSet: DefaultKotlinSourceSet): FileCollection = + getPlatformCinteropDependenciesOrEmpty(sourceSet) { relevantCompilation -> + /* Source Set is directly included in compilation -> No need to add dependency again (when looking for propagated dependencies) */ + sourceSet !in relevantCompilation.kotlinSourceSets + } + +internal fun Project.getPlatformCinteropDependenciesOrEmpty( + sourceSet: DefaultKotlinSourceSet, + compilationFilter: (KotlinNativeCompilation) -> Boolean = { true }, +): FileCollection { return filesProvider files@{ /* compatibility metadata variant will still register @@ -69,8 +78,7 @@ private fun Project.getPropagatedCInteropDependenciesOrEmpty(sourceSet: DefaultK (compilation.associateWith + compilation) .filterIsInstance() - /* Source Set is directly included in compilation -> No need to add dependency again (will be handled already) */ - .filter { relevantCompilation -> sourceSet !in relevantCompilation.kotlinSourceSets } + .filter(compilationFilter) .map { relevantCompilation -> getAllCInteropOutputFiles(relevantCompilation) } } } @@ -81,7 +89,7 @@ private fun Project.getPropagatedCInteropDependenciesOrEmpty(compilation: Kotlin getAllCInteropOutputFiles(platformCompilation) } -internal fun Project.getAllCInteropOutputFiles(compilation: KotlinNativeCompilation): FileCollection { +private fun Project.getAllCInteropOutputFiles(compilation: KotlinNativeCompilation): FileCollection { val cinteropTasks = compilation.cinterops.map { interop -> interop.interopProcessingTaskName } .mapNotNull { taskName -> tasks.findByName(taskName) as? CInteropProcess }