Bugfix: KotlinIdeaResolutionException on absent/corrupted KLIB artifact

Issue #KT-35839
This commit is contained in:
Dmitriy Dolovov
2020-01-09 14:14:07 +07:00
parent 995c6a32b8
commit 5803fcdeb4
@@ -47,25 +47,25 @@ fun createLoggingErrorReporter(log: Logger) = LoggingErrorReporter(log)
internal object CachingIdeKonanLibraryMetadataLoader : PackageAccessHandler { internal object CachingIdeKonanLibraryMetadataLoader : PackageAccessHandler {
override fun loadModuleHeader(library: KotlinLibrary): KlibMetadataProtoBuf.Header { override fun loadModuleHeader(library: KotlinLibrary): KlibMetadataProtoBuf.Header {
val virtualFile = getVirtualFile(library, library.moduleHeaderFile) val virtualFile = getVirtualFile(library, library.moduleHeaderFile)
return cache.getCachedModuleHeader(virtualFile)!! return virtualFile?.let { cache.getCachedModuleHeader(virtualFile) } ?: KlibMetadataProtoBuf.Header.getDefaultInstance()
} }
override fun loadPackageFragment(library: KotlinLibrary, packageFqName: String, partName: String): ProtoBuf.PackageFragment { override fun loadPackageFragment(library: KotlinLibrary, packageFqName: String, partName: String): ProtoBuf.PackageFragment {
val virtualFile = getVirtualFile(library, library.packageFragmentFile(packageFqName, partName)) val virtualFile = getVirtualFile(library, library.packageFragmentFile(packageFqName, partName))
return cache.getCachedPackageFragment(virtualFile)!! return virtualFile?.let { cache.getCachedPackageFragment(virtualFile) } ?: ProtoBuf.PackageFragment.getDefaultInstance()
} }
private fun getVirtualFile(library: KotlinLibrary, file: KFile): VirtualFile = private fun getVirtualFile(library: KotlinLibrary, file: KFile): VirtualFile? =
if (library.isZipped) asJarFileSystemFile(library.libraryFile, file) else asLocalFile(file) if (library.isZipped) asJarFileSystemFile(library.libraryFile, file) else asLocalFile(file)
private fun asJarFileSystemFile(jarFile: KFile, localFile: KFile): VirtualFile { private fun asJarFileSystemFile(jarFile: KFile, localFile: KFile): VirtualFile? {
val fullPath = jarFile.absolutePath + "!" + PathUtil.toSystemIndependentName(localFile.path) val fullPath = jarFile.absolutePath + "!" + PathUtil.toSystemIndependentName(localFile.path)
return StandardFileSystems.jar().findFileByPath(fullPath) ?: error("File not found: $fullPath") return StandardFileSystems.jar().findFileByPath(fullPath)
} }
private fun asLocalFile(localFile: KFile): VirtualFile { private fun asLocalFile(localFile: KFile): VirtualFile? {
val fullPath = localFile.absolutePath val fullPath = localFile.absolutePath
return StandardFileSystems.local().findFileByPath(fullPath) ?: error("File not found: $fullPath") return StandardFileSystems.local().findFileByPath(fullPath)
} }
private val cache private val cache