Make sure that library file still exists before calling loadMetadata from JsResolverForModuleFactory since IDE model could be outdated

#EA-218905 fixed
This commit is contained in:
Zalim Bashorov
2020-05-27 23:13:39 +03:00
parent 7f41dc4828
commit a8623b9b28
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.caches.resolve
import com.intellij.openapi.diagnostic.Logger
import org.jetbrains.kotlin.analyzer.*
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.container.StorageComponentContainer
@@ -25,6 +26,9 @@ import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil
import org.jetbrains.kotlin.serialization.js.createKotlinJavascriptPackageFragmentProvider
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
import java.io.File
private val LOG = Logger.getInstance(JsResolverForModuleFactory::class.java)
class JsResolverForModuleFactory(
private val targetEnvironment: TargetEnvironment
@@ -85,7 +89,15 @@ internal fun <M : ModuleInfo> createPackageFragmentProvider(
}
is LibraryModuleInfo -> {
moduleInfo.getLibraryRoots()
.flatMap { KotlinJavascriptMetadataUtils.loadMetadata(it) }
.flatMap {
if (File(it).exists()) {
KotlinJavascriptMetadataUtils.loadMetadata(it)
} else {
// TODO can/should we warn a user about a problem in a library root? If so how?
LOG.error("Library $it not found")
emptyList()
}
}
.filter { it.version.isCompatible() }
.map { metadata ->
val (header, packageFragmentProtos) =