Refactor IR reporting and infrastructure

This commit is contained in:
Ilya Chernikov
2021-10-05 16:32:46 +02:00
parent da2d3f29da
commit fc176e9845
16 changed files with 221 additions and 169 deletions
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.codegen.CodegenFactory
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticReporter
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.backend.Fir2IrResult
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver
@@ -127,9 +128,14 @@ object FirKotlinToJvmBytecodeCompiler {
if (!checkKotlinPackageUsage(moduleConfiguration, allSources)) return null
val firResult = runFrontend(allSources).also {
val diagnosticsReporter = DiagnosticReporterFactory.createReporter()
val firResult = runFrontend(allSources, diagnosticsReporter).also {
performanceManager?.notifyAnalysisFinished()
} ?: return null
}
if (firResult == null) {
FirDiagnosticsCompilerResultsReporter.reportToCollector(diagnosticsReporter, messageCollector)
return null
}
performanceManager?.notifyGenerationStarted()
performanceManager?.notifyIRTranslationStarted()
@@ -143,9 +149,12 @@ object FirKotlinToJvmBytecodeCompiler {
allSources,
fir2IrResult,
extensions,
firResult.session
firResult.session,
diagnosticsReporter
)
FirDiagnosticsCompilerResultsReporter.reportToCollector(diagnosticsReporter, messageCollector)
performanceManager?.notifyIRGenerationFinished()
performanceManager?.notifyGenerationFinished()
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
@@ -159,7 +168,7 @@ object FirKotlinToJvmBytecodeCompiler {
val fir: List<FirFile>
)
private fun CompilationContext.runFrontend(ktFiles: List<KtFile>): FirResult? {
private fun CompilationContext.runFrontend(ktFiles: List<KtFile>, diagnosticsReporter: BaseDiagnosticReporter): FirResult? {
@Suppress("NAME_SHADOWING")
var ktFiles = ktFiles
val syntaxErrors = ktFiles.fold(false) { errorsFound, ktFile ->
@@ -243,7 +252,6 @@ object FirKotlinToJvmBytecodeCompiler {
val commonRawFir = commonSession?.buildFirFromKtFiles(commonKtFiles)
val rawFir = session.buildFirFromKtFiles(ktFiles)
val diagnosticsReporter = DiagnosticReporterFactory.createReporter()
commonSession?.apply {
val (commonScopeSession, commonFir) = runResolution(commonRawFir!!)
runCheckers(commonScopeSession, commonFir, diagnosticsReporter)
@@ -252,9 +260,7 @@ object FirKotlinToJvmBytecodeCompiler {
val (scopeSession, fir) = session.runResolution(rawFir)
session.runCheckers(scopeSession, fir, diagnosticsReporter)
val hasErrors = FirDiagnosticsCompilerResultsReporter.reportToCollector(diagnosticsReporter, messageCollector)
return if (syntaxErrors || hasErrors) null else FirResult(session, scopeSession, fir)
return if (syntaxErrors || diagnosticsReporter.hasErrors) null else FirResult(session, scopeSession, fir)
}
private fun CompilationContext.createComponentsForIncrementalCompilation(
@@ -280,7 +286,8 @@ object FirKotlinToJvmBytecodeCompiler {
ktFiles: List<KtFile>,
fir2IrResult: Fir2IrResult,
extensions: JvmGeneratorExtensionsImpl,
session: FirSession
session: FirSession,
diagnosticsReporter: BaseDiagnosticReporter
): GenerationState {
val (moduleFragment, symbolTable, components) = fir2IrResult
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext
@@ -304,6 +311,8 @@ object FirKotlinToJvmBytecodeCompiler {
true
).jvmBackendClassResolver(
FirJvmBackendClassResolver(components)
).diagnosticReporter(
diagnosticsReporter
).build()
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.checkKotlinPackageUsage
import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoot
import org.jetbrains.kotlin.cli.common.fir.FirDiagnosticsCompilerResultsReporter
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
import org.jetbrains.kotlin.cli.common.toLogger
import org.jetbrains.kotlin.cli.jvm.config.*
@@ -40,6 +41,7 @@ import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.ir.backend.jvm.jvmResolveLibraries
import org.jetbrains.kotlin.load.kotlin.ModuleVisibilityManager
import org.jetbrains.kotlin.modules.Module
@@ -332,6 +334,8 @@ object KotlinToJVMBytecodeCompiler {
codegenFactory: CodegenFactory,
backendInput: CodegenFactory.BackendInput,
): GenerationState {
val diagnosticsReporter = DiagnosticReporterFactory.createReporter()
val state = GenerationState.Builder(
environment.project,
ClassBuilderFactories.BINARIES,
@@ -343,6 +347,7 @@ object KotlinToJVMBytecodeCompiler {
.codegenFactory(codegenFactory)
.withModule(module)
.onIndependentPartCompilationEnd(createOutputFilesFlushingCallbackIfPossible(configuration))
.diagnosticReporter(diagnosticsReporter)
.build()
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
@@ -370,6 +375,7 @@ object KotlinToJVMBytecodeCompiler {
),
environment.messageCollector
)
FirDiagnosticsCompilerResultsReporter.reportToCollector(diagnosticsReporter, environment.messageCollector)
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
return state