[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:
committed by
Space Team
parent
f16eecb012
commit
bc98c47caa
+1
-1
@@ -27,7 +27,7 @@ internal object IdeCInteropMetadataDependencyClasspathResolver : IdeDependencyRe
|
|||||||
project.locateDependencyTask(sourceSet) ?: return emptySet()
|
project.locateDependencyTask(sourceSet) ?: return emptySet()
|
||||||
|
|
||||||
val cinteropFiles = project.createCInteropMetadataDependencyClasspathForIde(sourceSet)
|
val cinteropFiles = project.createCInteropMetadataDependencyClasspathForIde(sourceSet)
|
||||||
return project.resolveCinteropDependencies(cinteropFiles)
|
return project.resolveCInteropDependencies(cinteropFiles)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun dependencies(project: Project): Iterable<Any> {
|
override fun dependencies(project: Project): Iterable<Any> {
|
||||||
|
|||||||
+1
-1
@@ -19,7 +19,7 @@ internal object IdeCommonizedCinteropDependencyResolver : IdeDependencyResolver,
|
|||||||
|
|
||||||
val project = sourceSet.project
|
val project = sourceSet.project
|
||||||
val cinteropFiles = project.cinteropCommonizerDependencies(sourceSet)
|
val cinteropFiles = project.cinteropCommonizerDependencies(sourceSet)
|
||||||
return project.resolveCinteropDependencies(cinteropFiles)
|
return project.resolveCInteropDependencies(cinteropFiles)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun dependencies(project: Project): Iterable<Any> {
|
override fun dependencies(project: Project): Iterable<Any> {
|
||||||
|
|||||||
+1
-1
@@ -18,6 +18,6 @@ internal object IdePlatformCinteropDependencyResolver : IdeDependencyResolver {
|
|||||||
|
|
||||||
val cinteropFiles = project.getPlatformCinteropDependenciesOrEmpty(sourceSet)
|
val cinteropFiles = project.getPlatformCinteropDependenciesOrEmpty(sourceSet)
|
||||||
|
|
||||||
return project.resolveCinteropDependencies(cinteropFiles)
|
return project.resolveCInteropDependencies(cinteropFiles)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -32,6 +32,6 @@ internal object IdeProjectToProjectCInteropDependencyResolver : IdeDependencyRes
|
|||||||
it.componentFilter { identifier -> identifier is ProjectComponentIdentifier }
|
it.componentFilter { identifier -> identifier is ProjectComponentIdentifier }
|
||||||
}.files
|
}.files
|
||||||
|
|
||||||
return project.resolveCinteropDependencies(cinteropFiles)
|
return project.resolveCInteropDependencies(cinteropFiles)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-6
@@ -13,22 +13,28 @@ import org.jetbrains.kotlin.gradle.plugin.ide.KlibExtra
|
|||||||
import org.jetbrains.kotlin.konan.file.File
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.library.*
|
import org.jetbrains.kotlin.library.*
|
||||||
|
|
||||||
internal fun Project.resolveCinteropDependencies(cinteropFiles: FileCollection): Set<IdeaKotlinDependency> {
|
internal fun Project.resolveCInteropDependencies(cinteropFiles: FileCollection): Set<IdeaKotlinDependency> {
|
||||||
return cinteropFiles.files
|
return cinteropFiles.files
|
||||||
.filter { it.isDirectory || it.extension == KLIB_FILE_EXTENSION }
|
.filter { it.isDirectory || it.extension == KLIB_FILE_EXTENSION }
|
||||||
.mapNotNullTo(mutableSetOf()) { libraryFile ->
|
.mapNotNull { libraryFile -> this.createCinteropLibraryDependency(libraryFile) }
|
||||||
createCinteropLibraryDependency(this, 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 {
|
val library = try {
|
||||||
resolveSingleFileKlib(
|
resolveSingleFileKlib(
|
||||||
libraryFile = File(libraryFile.absolutePath),
|
libraryFile = File(libraryFile.absolutePath),
|
||||||
strategy = ToolingSingleFileKlibResolveStrategy
|
strategy = ToolingSingleFileKlibResolveStrategy
|
||||||
)
|
)
|
||||||
} catch (error: Throwable) {
|
} catch (error: Throwable) {
|
||||||
project.logger.error("Failed to resolve library ${libraryFile.path}", error)
|
logger.error("Failed to resolve library ${libraryFile.path}", error)
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user