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:
+4
-1
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.caches.resolve
|
package org.jetbrains.kotlin.caches.resolve
|
||||||
|
|
||||||
|
import com.intellij.openapi.diagnostic.Logger
|
||||||
import org.jetbrains.kotlin.analyzer.*
|
import org.jetbrains.kotlin.analyzer.*
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.container.StorageComponentContainer
|
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.serialization.js.createKotlinJavascriptPackageFragmentProvider
|
||||||
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
|
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
|
||||||
|
|
||||||
|
private val LOG = Logger.getInstance(JsResolverForModuleFactory::class.java)
|
||||||
|
|
||||||
class JsResolverForModuleFactory(
|
class JsResolverForModuleFactory(
|
||||||
private val targetEnvironment: TargetEnvironment
|
private val targetEnvironment: TargetEnvironment
|
||||||
) : ResolverForModuleFactory() {
|
) : ResolverForModuleFactory() {
|
||||||
@@ -85,7 +88,7 @@ internal fun <M : ModuleInfo> createPackageFragmentProvider(
|
|||||||
}
|
}
|
||||||
is LibraryModuleInfo -> {
|
is LibraryModuleInfo -> {
|
||||||
moduleInfo.getLibraryRoots()
|
moduleInfo.getLibraryRoots()
|
||||||
.flatMap { KotlinJavascriptMetadataUtils.loadMetadata(it) }
|
.flatMap { KotlinJavascriptMetadataUtils.loadMetadata(it) { msg -> LOG.error(msg) } }
|
||||||
.filter { it.version.isCompatible() }
|
.filter { it.version.isCompatible() }
|
||||||
.map { metadata ->
|
.map { metadata ->
|
||||||
val (header, packageFragmentProtos) =
|
val (header, packageFragmentProtos) =
|
||||||
|
|||||||
@@ -65,8 +65,11 @@ object KotlinJavascriptMetadataUtils {
|
|||||||
"\"${Base64.getEncoder().encodeToString(content)}\");\n"
|
"\"${Base64.getEncoder().encodeToString(content)}\");\n"
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun loadMetadata(file: File): List<KotlinJavascriptMetadata> {
|
fun loadMetadata(file: File, onError: (message: String) -> Unit = ::error): List<KotlinJavascriptMetadata> {
|
||||||
assert(file.exists()) { "Library $file not found" }
|
if (!file.exists()) {
|
||||||
|
onError("Library $file not found")
|
||||||
|
return emptyList()
|
||||||
|
}
|
||||||
val metadataList = arrayListOf<KotlinJavascriptMetadata>()
|
val metadataList = arrayListOf<KotlinJavascriptMetadata>()
|
||||||
JsLibraryUtils.traverseJsLibrary(file) { library ->
|
JsLibraryUtils.traverseJsLibrary(file) { library ->
|
||||||
parseMetadata(library.content, metadataList)
|
parseMetadata(library.content, metadataList)
|
||||||
@@ -76,7 +79,7 @@ object KotlinJavascriptMetadataUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@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
|
@JvmStatic
|
||||||
fun parseMetadata(text: CharSequence, metadataList: MutableList<KotlinJavascriptMetadata>) {
|
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.
|
* 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 {
|
companion object {
|
||||||
val METADATA_CACHE = (JsConfig.JS_STDLIB + JsConfig.JS_KOTLIN_TEST).flatMap { path ->
|
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)
|
val parts = KotlinJavascriptSerializationUtil.readModuleAsProto(metadata.body, metadata.version)
|
||||||
JsModuleDescriptor(metadata.moduleName, parts.kind, parts.importedModules, parts)
|
JsModuleDescriptor(metadata.moduleName, parts.kind, parts.importedModules, parts)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user