[JS IR] Properly report compiler errors

Report compiler errors using message collector
Instead of crashing with stack trace
This commit is contained in:
Svyatoslav Kuzmich
2019-11-29 16:07:16 +03:00
parent ea8fa55f12
commit 3df8393ede
3 changed files with 50 additions and 26 deletions
@@ -31,10 +31,7 @@ import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider
import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer
import org.jetbrains.kotlin.ir.backend.js.compile import org.jetbrains.kotlin.ir.backend.js.*
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.js.config.EcmaVersion import org.jetbrains.kotlin.js.config.EcmaVersion
import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.config.JsConfig import org.jetbrains.kotlin.js.config.JsConfig
@@ -185,31 +182,39 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
else else
outputFilePath outputFilePath
generateKLib( try {
project = config.project, generateKLib(
files = sourcesFiles, project = config.project,
configuration = config.configuration, files = sourcesFiles,
allDependencies = resolvedLibraries, configuration = config.configuration,
friendDependencies = friendDependencies, allDependencies = resolvedLibraries,
outputKlibPath = outputKlibPath, friendDependencies = friendDependencies,
nopack = arguments.irProduceKlibDir outputKlibPath = outputKlibPath,
) nopack = arguments.irProduceKlibDir
)
} catch (e: JsIrCompilationError) {
return COMPILATION_ERROR
}
} }
if (arguments.irProduceJs) { if (arguments.irProduceJs) {
val phaseConfig = createPhaseConfig(jsPhases, arguments, messageCollector) val phaseConfig = createPhaseConfig(jsPhases, arguments, messageCollector)
val compiledModule = compile( val compiledModule = try {
projectJs, compile(
sourcesFiles, projectJs,
config.configuration, sourcesFiles,
phaseConfig, config.configuration,
allDependencies = resolvedLibraries, phaseConfig,
friendDependencies = friendDependencies, allDependencies = resolvedLibraries,
mainArguments = mainCallArguments, friendDependencies = friendDependencies,
generateFullJs = !arguments.irDce, mainArguments = mainCallArguments,
generateDceJs = arguments.irDce generateFullJs = !arguments.irDce,
) generateDceJs = arguments.irDce
)
} catch (e: JsIrCompilationError) {
return COMPILATION_ERROR
}
val jsCode = if (arguments.irDce) compiledModule.dceJsCode!! else compiledModule.jsCode!! val jsCode = if (arguments.irDce) compiledModule.dceJsCode!! else compiledModule.jsCode!!
outputFile.writeText(jsCode) outputFile.writeText(jsCode)
@@ -370,7 +375,7 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
} }
fun messageCollectorLogger(collector: MessageCollector) = object : Logger { 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 error(message: String) = collector.report(ERROR, message)
override fun log(message: String) = collector.report(LOGGING, message) override fun log(message: String) = collector.report(LOGGING, message)
override fun fatal(message: String): Nothing { override fun fatal(message: String): Nothing {
@@ -8,6 +8,7 @@ dependencies {
compile(project(":compiler:ir.psi2ir")) compile(project(":compiler:ir.psi2ir"))
compile(project(":compiler:ir.serialization.common")) compile(project(":compiler:ir.serialization.common"))
compile(project(":js:js.frontend")) compile(project(":js:js.frontend"))
compile(project(":compiler:cli"))
compileOnly(intellijCoreDep()) { includeJars("intellij-core") } compileOnly(intellijCoreDep()) { includeJars("intellij-core") }
@@ -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.DynamicTypeDeserializer
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion
import org.jetbrains.kotlin.builtins.KotlinBuiltIns 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.config.*
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
@@ -256,6 +259,8 @@ fun getModuleDescriptorByLibrary(current: KotlinLibrary, mapping: Map<String, Mo
return md return md
} }
object JsIrCompilationError : Throwable()
private class ModulesStructure( private class ModulesStructure(
private val project: Project, private val project: Project,
private val files: List<KtFile>, private val files: List<KtFile>,
@@ -278,7 +283,14 @@ private class ModulesStructure(
val builtInsDep = allDependencies.getFullList().find { it.isBuiltIns } val builtInsDep = allDependencies.getFullList().find { it.isBuiltIns }
fun runAnalysis(): JsAnalysisResult { 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( TopDownAnalyzerFacadeForJSIR.analyzeFiles(
files, files,
project, project,
@@ -288,6 +300,12 @@ private class ModulesStructure(
thisIsBuiltInsModule = builtInModuleDescriptor == null, thisIsBuiltInsModule = builtInModuleDescriptor == null,
customBuiltInsModule = builtInModuleDescriptor customBuiltInsModule = builtInModuleDescriptor
) )
}
val analysisResult = analyzerWithCompilerReport.analysisResult
if (analyzerWithCompilerReport.hasErrors() || analysisResult !is JsAnalysisResult)
throw JsIrCompilationError
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
TopDownAnalyzerFacadeForJSIR.checkForErrors(files, analysisResult.bindingContext) TopDownAnalyzerFacadeForJSIR.checkForErrors(files, analysisResult.bindingContext)