Add an ability to provide own handler for errors inside KotlinJavascriptMetadataUtils.loadMetadata

Use a logger to handle errors inside loadMetadata when it's used from IDE (JsResolverForModuleFactory).

#EA-218905
This commit is contained in:
Zalim Bashorov
2020-05-25 15:07:24 +03:00
parent b79b3507f2
commit 69827fc5af
3 changed files with 12 additions and 6 deletions
@@ -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
@@ -26,6 +27,8 @@ import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil
import org.jetbrains.kotlin.serialization.js.createKotlinJavascriptPackageFragmentProvider
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
private val LOG = Logger.getInstance(JsResolverForModuleFactory::class.java)
class JsResolverForModuleFactory(
private val targetEnvironment: TargetEnvironment
) : ResolverForModuleFactory() {
@@ -85,7 +88,7 @@ internal fun <M : ModuleInfo> createPackageFragmentProvider(
}
is LibraryModuleInfo -> {
moduleInfo.getLibraryRoots()
.flatMap { KotlinJavascriptMetadataUtils.loadMetadata(it) }
.flatMap { KotlinJavascriptMetadataUtils.loadMetadata(it) { msg -> LOG.error(msg) } }
.filter { it.version.isCompatible() }
.map { metadata ->
val (header, packageFragmentProtos) =
@@ -65,8 +65,11 @@ object KotlinJavascriptMetadataUtils {
"\"${Base64.getEncoder().encodeToString(content)}\");\n"
@JvmStatic
fun loadMetadata(file: File): List<KotlinJavascriptMetadata> {
assert(file.exists()) { "Library $file not found" }
fun loadMetadata(file: File, onError: (message: String) -> Unit = ::error): List<KotlinJavascriptMetadata> {
if (!file.exists()) {
onError("Library $file not found")
return emptyList()
}
val metadataList = arrayListOf<KotlinJavascriptMetadata>()
JsLibraryUtils.traverseJsLibrary(file) { library ->
parseMetadata(library.content, metadataList)
@@ -76,7 +79,7 @@ object KotlinJavascriptMetadataUtils {
}
@JvmStatic
fun loadMetadata(path: String): List<KotlinJavascriptMetadata> = loadMetadata(File(path))
fun loadMetadata(path: String, onError: (message: String) -> Unit): List<KotlinJavascriptMetadata> = loadMetadata(File(path), onError)
@JvmStatic
fun parseMetadata(text: CharSequence, metadataList: MutableList<KotlinJavascriptMetadata>) {
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -881,7 +881,7 @@ abstract class BasicBoxTest(
companion object {
val METADATA_CACHE = (JsConfig.JS_STDLIB + JsConfig.JS_KOTLIN_TEST).flatMap { path ->
KotlinJavascriptMetadataUtils.loadMetadata(path).map { metadata ->
KotlinJavascriptMetadataUtils.loadMetadata(path, ::error).map { metadata ->
val parts = KotlinJavascriptSerializationUtil.readModuleAsProto(metadata.body, metadata.version)
JsModuleDescriptor(metadata.moduleName, parts.kind, parts.importedModules, parts)
}