[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
This commit is contained in:
Sebastian Sellmair
2023-02-01 09:35:40 +01:00
committed by Space Team
parent f16eecb012
commit bc98c47caa
5 changed files with 16 additions and 10 deletions
@@ -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<Any> {
@@ -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<Any> {
@@ -18,6 +18,6 @@ internal object IdePlatformCinteropDependencyResolver : IdeDependencyResolver {
val cinteropFiles = project.getPlatformCinteropDependenciesOrEmpty(sourceSet)
return project.resolveCinteropDependencies(cinteropFiles)
return project.resolveCInteropDependencies(cinteropFiles)
}
}
@@ -32,6 +32,6 @@ internal object IdeProjectToProjectCInteropDependencyResolver : IdeDependencyRes
it.componentFilter { identifier -> identifier is ProjectComponentIdentifier }
}.files
return project.resolveCinteropDependencies(cinteropFiles)
return project.resolveCInteropDependencies(cinteropFiles)
}
}
@@ -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<IdeaKotlinDependency> {
internal fun Project.resolveCInteropDependencies(cinteropFiles: FileCollection): Set<IdeaKotlinDependency> {
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
}