diff --git a/compiler/cli/cli-js-klib/src/GenerateJsIrKlib.kt b/compiler/cli/cli-js-klib/src/GenerateJsIrKlib.kt index 60f27215550..14bcc7f20e9 100644 --- a/compiler/cli/cli-js-klib/src/GenerateJsIrKlib.kt +++ b/compiler/cli/cli-js-klib/src/GenerateJsIrKlib.kt @@ -71,6 +71,7 @@ fun buildKLib( allDependencies: KotlinLibraryResolveResult, commonSources: List ) { + val configuration = buildConfiguration(environment, moduleName) generateKLib( project = environment.project, files = sources.map { source -> @@ -80,7 +81,8 @@ fun buildKLib( } file }, - configuration = buildConfiguration(environment, moduleName), + analyzer = AnalyzerWithCompilerReport(configuration), + configuration = configuration, allDependencies = allDependencies, friendDependencies = emptyList(), outputKlibPath = outputPath, @@ -144,4 +146,4 @@ private fun messageCollectorLogger(collector: MessageCollector) = object : Logge (collector as? GroupingMessageCollector)?.flush() kotlin.error(message) } -} \ No newline at end of file +} diff --git a/compiler/cli/cli-js/build.gradle.kts b/compiler/cli/cli-js/build.gradle.kts index 31948b38c0c..58d5af170a1 100644 --- a/compiler/cli/cli-js/build.gradle.kts +++ b/compiler/cli/cli-js/build.gradle.kts @@ -11,7 +11,6 @@ dependencies { compile(project(":compiler:cli")) compile(project(":compiler:frontend")) compile(project(":compiler:backend-common")) - compile(project(":compiler:backend")) compile(project(":compiler:ir.backend.common")) compile(project(":compiler:ir.serialization.js")) compile(project(":compiler:backend.js")) 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 4a189ecafcb..45033d0f85a 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 @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JsArgumentConstants import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoot import org.jetbrains.kotlin.cli.common.extensions.ScriptEvaluationExtension +import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.* import org.jetbrains.kotlin.cli.common.messages.GroupingMessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector @@ -29,15 +30,14 @@ import org.jetbrains.kotlin.config.IncrementalCompilation import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.incremental.js.IncrementalNextRoundChecker import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider +import org.jetbrains.kotlin.incremental.js.IncrementalNextRoundChecker import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer 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 import org.jetbrains.kotlin.js.config.SourceMapSourceEmbedding -import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.serialization.js.ModuleKind @@ -189,6 +189,7 @@ class K2JsIrCompiler : CLICompiler() { generateKLib( project = config.project, files = sourcesFiles, + analyzer = AnalyzerWithCompilerReport(config.configuration), configuration = config.configuration, allDependencies = resolvedLibraries, friendDependencies = friendDependencies, @@ -220,6 +221,7 @@ class K2JsIrCompiler : CLICompiler() { compile( projectJs, mainModule, + AnalyzerWithCompilerReport(config.configuration), config.configuration, phaseConfig, allDependencies = resolvedLibraries, @@ -396,4 +398,4 @@ fun loadPluginsForTests(configuration: CompilerConfiguration): ExitCode { pluginClasspaths = jars.map { it.canonicalPath } + pluginClasspaths return PluginCliParser.loadPluginsSafe(pluginClasspaths, mutableListOf(), configuration) -} \ No newline at end of file +} diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport.kt index 000d19b45c3..298efd641fe 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport.kt @@ -20,10 +20,14 @@ import com.intellij.openapi.util.io.FileUtil.toSystemDependentName import com.intellij.openapi.util.text.StringUtil import com.intellij.psi.* import com.intellij.psi.util.PsiFormatUtil +import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport import org.jetbrains.kotlin.analyzer.AnalysisResult +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.* import org.jetbrains.kotlin.codegen.state.IncompatibleClassTrackerImpl +import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.diagnostics.* import org.jetbrains.kotlin.diagnostics.DiagnosticUtils.sortedDiagnostics import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages @@ -43,8 +47,13 @@ import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErr class AnalyzerWithCompilerReport( private val messageCollector: MessageCollector, private val languageVersionSettings: LanguageVersionSettings -) { - lateinit var analysisResult: AnalysisResult +) : AbstractAnalyzerWithCompilerReport { + override lateinit var analysisResult: AnalysisResult + + constructor(configuration: CompilerConfiguration) : this( + configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) ?: MessageCollector.NONE, + configuration.languageVersionSettings + ) private fun reportIncompleteHierarchies() { val bindingContext = analysisResult.bindingContext @@ -99,11 +108,10 @@ class AnalyzerWithCompilerReport( class SyntaxErrorReport(val isHasErrors: Boolean, val isAllErrorsAtEof: Boolean) - fun hasErrors(): Boolean { - return messageCollector.hasErrors() - } + override fun hasErrors(): Boolean = + messageCollector.hasErrors() - fun analyzeAndReport(files: Collection, analyze: () -> AnalysisResult) { + override fun analyzeAndReport(files: Collection, analyze: () -> AnalysisResult) { analysisResult = analyze() ExperimentalUsageChecker.checkCompilerArguments( analysisResult.moduleDescriptor, languageVersionSettings, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractAnalyzerWithCompilerReport.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractAnalyzerWithCompilerReport.kt new file mode 100644 index 00000000000..1825c7559b3 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractAnalyzerWithCompilerReport.kt @@ -0,0 +1,16 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.analyzer + +import org.jetbrains.kotlin.psi.KtFile + +interface AbstractAnalyzerWithCompilerReport { + val analysisResult: AnalysisResult + + fun analyzeAndReport(files: Collection, analyze: () -> AnalysisResult) + + fun hasErrors(): Boolean +} diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt index 4c2221aba86..4dfc1cbac2a 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.ir.backend.js import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel import org.jetbrains.kotlin.config.CompilerConfiguration @@ -48,6 +49,7 @@ class CompilerResult( fun compile( project: Project, mainModule: MainModule, + analyzer: AbstractAnalyzerWithCompilerReport, configuration: CompilerConfiguration, phaseConfig: PhaseConfig, allDependencies: KotlinLibraryResolveResult, @@ -58,7 +60,7 @@ fun compile( generateDceJs: Boolean = false ): CompilerResult { val (moduleFragment: IrModuleFragment, dependencyModules, irBuiltIns, symbolTable, deserializer) = - loadIr(project, mainModule, configuration, allDependencies, friendDependencies) + loadIr(project, mainModule, analyzer, configuration, allDependencies, friendDependencies) val moduleDescriptor = moduleFragment.descriptor diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt index 73716ea67c3..7e4b784b236 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.wasm import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel import org.jetbrains.kotlin.backend.wasm.codegen.IrModuleToWasm @@ -25,6 +26,7 @@ data class WasmCompilerResult(val wat: String, val js: String) fun compileWasm( project: Project, files: List, + analyzer: AbstractAnalyzerWithCompilerReport, configuration: CompilerConfiguration, phaseConfig: PhaseConfig, allDependencies: KotlinLibraryResolveResult, @@ -32,7 +34,7 @@ fun compileWasm( exportedDeclarations: Set = emptySet() ): WasmCompilerResult { val (moduleFragment, dependencyModules, irBuiltIns, symbolTable, deserializer) = - loadIr(project, MainModule.SourceFiles(files), configuration, allDependencies, friendDependencies) + loadIr(project, MainModule.SourceFiles(files), analyzer, configuration, allDependencies, friendDependencies) val moduleDescriptor = moduleFragment.descriptor val context = WasmBackendContext(moduleDescriptor, irBuiltIns, symbolTable, moduleFragment, exportedDeclarations, configuration) @@ -57,4 +59,4 @@ fun compileWasm( wasmPhases.invokeToplevel(phaseConfig, context, moduleFragment) return IrModuleToWasm(context).generateModule(moduleFragment) -} \ No newline at end of file +} diff --git a/compiler/ir/serialization.js/build.gradle.kts b/compiler/ir/serialization.js/build.gradle.kts index bf3a438b718..5ce22dcd9e5 100644 --- a/compiler/ir/serialization.js/build.gradle.kts +++ b/compiler/ir/serialization.js/build.gradle.kts @@ -8,7 +8,6 @@ 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 d4916d2d254..b8b3e64796e 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 @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport import org.jetbrains.kotlin.analyzer.AnalysisResult import org.jetbrains.kotlin.backend.common.LoggingContext import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension @@ -18,11 +19,6 @@ 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.CompilerMessageLocation -import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity -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 @@ -59,11 +55,8 @@ import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.utils.DFS import java.io.File -import java.util.* -import kotlin.collections.ArrayList import org.jetbrains.kotlin.konan.file.File as KFile - val KotlinLibrary.moduleName: String get() = manifestProperties.getProperty(KLIB_PROPERTY_UNIQUE_NAME) @@ -96,6 +89,7 @@ class KotlinFileSerializedData(val metadata: ByteArray, val irData: SerializedIr fun generateKLib( project: Project, files: List, + analyzer: AbstractAnalyzerWithCompilerReport, configuration: CompilerConfiguration, allDependencies: KotlinLibraryResolveResult, friendDependencies: List, @@ -131,7 +125,8 @@ fun generateKLib( icData = emptyList() } - val depsDescriptors = ModulesStructure(project, MainModule.SourceFiles(files), configuration, allDependencies, friendDependencies) + val depsDescriptors = + ModulesStructure(project, MainModule.SourceFiles(files), analyzer, configuration, allDependencies, friendDependencies) val psi2IrContext = runAnalysisAndPreparePsi2Ir(depsDescriptors) @@ -180,11 +175,12 @@ private fun sortDependencies(dependencies: List, mapping: Map ): IrModuleInfo { - val depsDescriptors = ModulesStructure(project, mainModule, configuration, allDependencies, friendDependencies) + val depsDescriptors = ModulesStructure(project, mainModule, analyzer, configuration, allDependencies, friendDependencies) when (mainModule) { is MainModule.SourceFiles -> { @@ -323,6 +319,7 @@ sealed class MainModule { private class ModulesStructure( private val project: Project, private val mainModule: MainModule, + private val analyzer: AbstractAnalyzerWithCompilerReport, val compilerConfiguration: CompilerConfiguration, val allDependencies: KotlinLibraryResolveResult, private val friendDependencies: List @@ -345,16 +342,7 @@ private class ModulesStructure( require(mainModule is MainModule.SourceFiles) val files = mainModule.files - // TODO: Should we not provide default message collector? - val messageCollector: MessageCollector = - compilerConfiguration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) ?: MessageCollector.NONE - - val analyzerWithCompilerReport = AnalyzerWithCompilerReport( - messageCollector, - compilerConfiguration.languageVersionSettings - ) - - analyzerWithCompilerReport.analyzeAndReport(files) { + analyzer.analyzeAndReport(files) { TopDownAnalyzerFacadeForJSIR.analyzeFiles( files, project, @@ -368,12 +356,12 @@ private class ModulesStructure( ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() - val analysisResult = analyzerWithCompilerReport.analysisResult + val analysisResult = analyzer.analysisResult if (IncrementalCompilation.isEnabledForJs()) { /** can throw [IncrementalNextRoundException] */ compareMetadataAndGoToNextICRoundIfNeeded(analysisResult, compilerConfiguration, files) } - if (analyzerWithCompilerReport.hasErrors() || analysisResult !is JsAnalysisResult) + if (analyzer.hasErrors() || analysisResult !is JsAnalysisResult) throw JsIrCompilationError TopDownAnalyzerFacadeForJSIR.checkForErrors(files, analysisResult.bindingContext) @@ -557,4 +545,4 @@ private fun KlibMetadataIncrementalSerializer( metadataVersion = configuration.metadataVersion, descriptorTable = descriptorTable, skipExpects = !configuration.klibMpp -) \ No newline at end of file +) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt index ee89b6b88bc..4ce9a94ddf6 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.js.test import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.common.phaser.toPhaseMap +import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.js.messageCollectorLogger import org.jetbrains.kotlin.ir.backend.js.* @@ -113,6 +114,7 @@ abstract class BasicIrBoxTest( val compiledModule = compile( project = config.project, mainModule = MainModule.SourceFiles(filesToCompile), + analyzer = AnalyzerWithCompilerReport(config.configuration), configuration = config.configuration, phaseConfig = phaseConfig, allDependencies = resolvedLibraries, @@ -140,6 +142,7 @@ abstract class BasicIrBoxTest( generateKLib( project = config.project, files = filesToCompile, + analyzer = AnalyzerWithCompilerReport(config.configuration), configuration = config.configuration, allDependencies = resolvedLibraries, friendDependencies = emptyList(), diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicWasmBoxTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicWasmBoxTest.kt index 1cad5bb502d..defd42195a2 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicWasmBoxTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicWasmBoxTest.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.common.phaser.toPhaseMap import org.jetbrains.kotlin.backend.wasm.compileWasm import org.jetbrains.kotlin.backend.wasm.wasmPhases +import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.config.CommonConfigurationKeys @@ -112,6 +113,7 @@ abstract class BasicWasmBoxTest( val compilerResult = compileWasm( project = config.project, files = filesToCompile, + analyzer = AnalyzerWithCompilerReport(config.configuration), configuration = config.configuration, phaseConfig = phaseConfig, // TODO: Bypass the resolver fow wasm.