From 3df8393edece7203ef9e01d5486a899d45de3e35 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Fri, 29 Nov 2019 16:07:16 +0300 Subject: [PATCH] [JS IR] Properly report compiler errors Report compiler errors using message collector Instead of crashing with stack trace --- .../jetbrains/kotlin/cli/js/K2JsIrCompiler.kt | 55 ++++++++++--------- compiler/ir/serialization.js/build.gradle.kts | 1 + .../jetbrains/kotlin/ir/backend/js/klib.kt | 20 ++++++- 3 files changed, 50 insertions(+), 26 deletions(-) diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt index c3eddb74766..ebba3bfd4b3 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt @@ -31,10 +31,7 @@ import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer -import org.jetbrains.kotlin.ir.backend.js.compile -import org.jetbrains.kotlin.ir.backend.js.generateKLib -import org.jetbrains.kotlin.ir.backend.js.jsPhases -import org.jetbrains.kotlin.ir.backend.js.jsResolveLibraries +import org.jetbrains.kotlin.ir.backend.js.* import org.jetbrains.kotlin.js.config.EcmaVersion import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.JsConfig @@ -185,31 +182,39 @@ class K2JsIrCompiler : CLICompiler() { else outputFilePath - generateKLib( - project = config.project, - files = sourcesFiles, - configuration = config.configuration, - allDependencies = resolvedLibraries, - friendDependencies = friendDependencies, - outputKlibPath = outputKlibPath, - nopack = arguments.irProduceKlibDir - ) + try { + generateKLib( + project = config.project, + files = sourcesFiles, + configuration = config.configuration, + allDependencies = resolvedLibraries, + friendDependencies = friendDependencies, + outputKlibPath = outputKlibPath, + nopack = arguments.irProduceKlibDir + ) + } catch (e: JsIrCompilationError) { + return COMPILATION_ERROR + } } if (arguments.irProduceJs) { val phaseConfig = createPhaseConfig(jsPhases, arguments, messageCollector) - val compiledModule = compile( - projectJs, - sourcesFiles, - config.configuration, - phaseConfig, - allDependencies = resolvedLibraries, - friendDependencies = friendDependencies, - mainArguments = mainCallArguments, - generateFullJs = !arguments.irDce, - generateDceJs = arguments.irDce - ) + val compiledModule = try { + compile( + projectJs, + sourcesFiles, + config.configuration, + phaseConfig, + allDependencies = resolvedLibraries, + friendDependencies = friendDependencies, + mainArguments = mainCallArguments, + generateFullJs = !arguments.irDce, + generateDceJs = arguments.irDce + ) + } catch (e: JsIrCompilationError) { + return COMPILATION_ERROR + } val jsCode = if (arguments.irDce) compiledModule.dceJsCode!! else compiledModule.jsCode!! outputFile.writeText(jsCode) @@ -370,7 +375,7 @@ class K2JsIrCompiler : CLICompiler() { } fun messageCollectorLogger(collector: MessageCollector) = object : Logger { - override fun warning(message: String)= collector.report(STRONG_WARNING, message) + override fun warning(message: String) = collector.report(STRONG_WARNING, message) override fun error(message: String) = collector.report(ERROR, message) override fun log(message: String) = collector.report(LOGGING, message) override fun fatal(message: String): Nothing { diff --git a/compiler/ir/serialization.js/build.gradle.kts b/compiler/ir/serialization.js/build.gradle.kts index eaae5b1582e..2bdd3f9d063 100644 --- a/compiler/ir/serialization.js/build.gradle.kts +++ b/compiler/ir/serialization.js/build.gradle.kts @@ -8,6 +8,7 @@ dependencies { compile(project(":compiler:ir.psi2ir")) compile(project(":compiler:ir.serialization.common")) compile(project(":js:js.frontend")) + compile(project(":compiler:cli")) compileOnly(intellijCoreDep()) { includeJars("intellij-core") } diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt index 39e2c31b04f..9665d13226d 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt @@ -16,6 +16,9 @@ import org.jetbrains.kotlin.backend.common.serialization.KlibIrVersion import org.jetbrains.kotlin.backend.common.serialization.metadata.DynamicTypeDeserializer import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport +import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor @@ -256,6 +259,8 @@ fun getModuleDescriptorByLibrary(current: KotlinLibrary, mapping: Map, @@ -278,7 +283,14 @@ private class ModulesStructure( val builtInsDep = allDependencies.getFullList().find { it.isBuiltIns } fun runAnalysis(): JsAnalysisResult { - val analysisResult = + val messageCollector: MessageCollector = + compilerConfiguration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) ?: MessageCollector.NONE + val analyzerWithCompilerReport = AnalyzerWithCompilerReport( + messageCollector, + compilerConfiguration.languageVersionSettings + ) + + analyzerWithCompilerReport.analyzeAndReport(files) { TopDownAnalyzerFacadeForJSIR.analyzeFiles( files, project, @@ -288,6 +300,12 @@ private class ModulesStructure( thisIsBuiltInsModule = builtInModuleDescriptor == null, customBuiltInsModule = builtInModuleDescriptor ) + } + + val analysisResult = analyzerWithCompilerReport.analysisResult + + if (analyzerWithCompilerReport.hasErrors() || analysisResult !is JsAnalysisResult) + throw JsIrCompilationError ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() TopDownAnalyzerFacadeForJSIR.checkForErrors(files, analysisResult.bindingContext)