From bc98c47caaf127fbf978f14f1414c73018209ac6 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Wed, 1 Feb 2023 09:35:40 +0100 Subject: [PATCH] [Gradle] resolveCInteropDependencies (for ide): Handle non-existing files gracefully During import, cinterop generation is lenient (as there might be good reasons why certain hosts can't generate some cinterop klibs). In this case, the resolution for IDE should be lenient too. When a cinterop file is resolved, that is not present on disk, we just send a 'IdeaKotlinUnresolvedBinaryDependency' instead. KT-56337 --- ...teropMetadataDependencyClasspathResolver.kt | 2 +- .../IdeCommonizedCinteropDependencyResolver.kt | 2 +- .../IdePlatformCinteropDependencyResolver.kt | 2 +- ...ojectToProjectCInteropDependencyResolver.kt | 2 +- .../resolveCinteropDependency.kt | 18 ++++++++++++------ 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCInteropMetadataDependencyClasspathResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCInteropMetadataDependencyClasspathResolver.kt index a09b61320d8..f047415acc1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCInteropMetadataDependencyClasspathResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCInteropMetadataDependencyClasspathResolver.kt @@ -27,7 +27,7 @@ internal object IdeCInteropMetadataDependencyClasspathResolver : IdeDependencyRe project.locateDependencyTask(sourceSet) ?: return emptySet() val cinteropFiles = project.createCInteropMetadataDependencyClasspathForIde(sourceSet) - return project.resolveCinteropDependencies(cinteropFiles) + return project.resolveCInteropDependencies(cinteropFiles) } override fun dependencies(project: Project): Iterable { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCommonizedCinteropDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCommonizedCinteropDependencyResolver.kt index 05b3d0fb4bf..a0b6dbfc953 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCommonizedCinteropDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCommonizedCinteropDependencyResolver.kt @@ -19,7 +19,7 @@ internal object IdeCommonizedCinteropDependencyResolver : IdeDependencyResolver, val project = sourceSet.project val cinteropFiles = project.cinteropCommonizerDependencies(sourceSet) - return project.resolveCinteropDependencies(cinteropFiles) + return project.resolveCInteropDependencies(cinteropFiles) } override fun dependencies(project: Project): Iterable { 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 0b524707100..2083c8a2bad 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 @@ -18,6 +18,6 @@ internal object IdePlatformCinteropDependencyResolver : IdeDependencyResolver { val cinteropFiles = project.getPlatformCinteropDependenciesOrEmpty(sourceSet) - return project.resolveCinteropDependencies(cinteropFiles) + return project.resolveCInteropDependencies(cinteropFiles) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeProjectToProjectCInteropDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeProjectToProjectCInteropDependencyResolver.kt index 68fc1d00883..5620dad2f08 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeProjectToProjectCInteropDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeProjectToProjectCInteropDependencyResolver.kt @@ -32,6 +32,6 @@ internal object IdeProjectToProjectCInteropDependencyResolver : IdeDependencyRes it.componentFilter { identifier -> identifier is ProjectComponentIdentifier } }.files - return project.resolveCinteropDependencies(cinteropFiles) + return project.resolveCInteropDependencies(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 81c9db05b39..fac6b34365a 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 @@ -13,22 +13,28 @@ import org.jetbrains.kotlin.gradle.plugin.ide.KlibExtra import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.library.* -internal fun Project.resolveCinteropDependencies(cinteropFiles: FileCollection): Set { +internal fun Project.resolveCInteropDependencies(cinteropFiles: FileCollection): Set { return cinteropFiles.files .filter { it.isDirectory || it.extension == KLIB_FILE_EXTENSION } - .mapNotNullTo(mutableSetOf()) { libraryFile -> - createCinteropLibraryDependency(this, libraryFile) - } + .mapNotNull { libraryFile -> this.createCinteropLibraryDependency(libraryFile) } + .toSet() } -private fun createCinteropLibraryDependency(project: Project, libraryFile: java.io.File): IdeaKotlinResolvedBinaryDependency? { +private fun Project.createCinteropLibraryDependency(libraryFile: java.io.File): IdeaKotlinBinaryDependency? { + if (!libraryFile.exists()) { + return IdeaKotlinUnresolvedBinaryDependency( + cause = "cinterop file: ${libraryFile.path} does not exist", + coordinates = null + ) + } + val library = try { resolveSingleFileKlib( libraryFile = File(libraryFile.absolutePath), strategy = ToolingSingleFileKlibResolveStrategy ) } catch (error: Throwable) { - project.logger.error("Failed to resolve library ${libraryFile.path}", error) + logger.error("Failed to resolve library ${libraryFile.path}", error) return null }