From 69827fc5af438ce0726a29cfc33f2b821923a164 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Mon, 25 May 2020 15:07:24 +0300 Subject: [PATCH] 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 --- .../kotlin/caches/resolve/JsResolverForModuleFactory.kt | 5 ++++- .../kotlin/utils/KotlinJavascriptMetadataUtils.kt | 9 ++++++--- .../test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsResolverForModuleFactory.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsResolverForModuleFactory.kt index 4d036e712e2..08ece78899a 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsResolverForModuleFactory.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsResolverForModuleFactory.kt @@ -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 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) = diff --git a/js/js.config/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt b/js/js.config/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt index 10668c725d3..4eea9f28599 100644 --- a/js/js.config/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt +++ b/js/js.config/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt @@ -65,8 +65,11 @@ object KotlinJavascriptMetadataUtils { "\"${Base64.getEncoder().encodeToString(content)}\");\n" @JvmStatic - fun loadMetadata(file: File): List { - assert(file.exists()) { "Library $file not found" } + fun loadMetadata(file: File, onError: (message: String) -> Unit = ::error): List { + if (!file.exists()) { + onError("Library $file not found") + return emptyList() + } val metadataList = arrayListOf() JsLibraryUtils.traverseJsLibrary(file) { library -> parseMetadata(library.content, metadataList) @@ -76,7 +79,7 @@ object KotlinJavascriptMetadataUtils { } @JvmStatic - fun loadMetadata(path: String): List = loadMetadata(File(path)) + fun loadMetadata(path: String, onError: (message: String) -> Unit): List = loadMetadata(File(path), onError) @JvmStatic fun parseMetadata(text: CharSequence, metadataList: MutableList) { diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt index 42c63feb34e..0599b4c8310 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt @@ -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) }