diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/fir/FirDiagnosticsCompilerResultsReporter.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/fir/FirDiagnosticsCompilerResultsReporter.kt index af2ad92163c..1bce081f94d 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/fir/FirDiagnosticsCompilerResultsReporter.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/fir/FirDiagnosticsCompilerResultsReporter.kt @@ -8,12 +8,9 @@ package org.jetbrains.kotlin.cli.common.fir import org.jetbrains.kotlin.AbstractKtSourceElement import org.jetbrains.kotlin.KtLightSourceElement import org.jetbrains.kotlin.KtPsiSourceElement -import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport -import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSourceLocation -import org.jetbrains.kotlin.cli.common.messages.MessageCollector -import org.jetbrains.kotlin.cli.common.messages.MessageUtil +import org.jetbrains.kotlin.cli.common.messages.* import org.jetbrains.kotlin.diagnostics.* -import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticReporter +import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory import java.io.Closeable import java.io.File @@ -29,10 +26,26 @@ object FirDiagnosticsCompilerResultsReporter { return hasErrors } - fun reportToCollector(diagnosticsReporter: BaseDiagnosticReporter, messageCollector: MessageCollector): Boolean { + fun reportToMessageCollector(diagnosticsCollector: BaseDiagnosticsCollector, messageCollector: MessageCollector): Boolean { + return reportByFile(diagnosticsCollector) { diagnostic, location -> + reportDiagnosticToMessageCollector(diagnostic, location, messageCollector) + } + } + + fun throwFirstErrorAsException( + diagnosticsCollector: BaseDiagnosticsCollector, messageRenderer: MessageRenderer = MessageRenderer.PLAIN_RELATIVE_PATHS + ): Boolean { + return reportByFile(diagnosticsCollector) { diagnostic, location -> + throwErrorDiagnosticAsException(diagnostic, location, messageRenderer) + } + } + + fun reportByFile( + diagnosticsCollector: BaseDiagnosticsCollector, report: (KtDiagnostic, CompilerMessageSourceLocation) -> Unit + ): Boolean { var hasErrors = false - for (filePath in diagnosticsReporter.diagnosticsByFilePath.keys) { - for (diagnostic in diagnosticsReporter.diagnosticsByFilePath[filePath].orEmpty().sortedWith(SingleFileDiagnosticComparator)) { + for (filePath in diagnosticsCollector.diagnosticsByFilePath.keys) { + for (diagnostic in diagnosticsCollector.diagnosticsByFilePath[filePath].orEmpty().sortedWith(SingleFileDiagnosticComparator)) { var filePositionFinder: SequentialFilePositionFinder? = null try { when { @@ -49,7 +62,7 @@ object FirDiagnosticsCompilerResultsReporter { MessageUtil.createMessageLocation(filePath, position.lineContent, position.line, position.column, -1, -1) } }?.let { location -> - reportDiagnostic(diagnostic, location, messageCollector) + report(diagnostic, location) hasErrors = hasErrors || diagnostic.severity == Severity.ERROR } } finally { @@ -75,12 +88,12 @@ object FirDiagnosticsCompilerResultsReporter { private fun reportDiagnostic(diagnostic: KtDiagnostic, reporter: MessageCollector): Boolean { if (!diagnostic.isValid) return false diagnostic.location()?.let { - reportDiagnostic(diagnostic, it, reporter) + reportDiagnosticToMessageCollector(diagnostic, it, reporter) } return diagnostic.severity == Severity.ERROR } - private fun reportDiagnostic( + private fun reportDiagnosticToMessageCollector( diagnostic: KtDiagnostic, location: CompilerMessageSourceLocation, reporter: MessageCollector @@ -90,6 +103,19 @@ object FirDiagnosticsCompilerResultsReporter { reporter.report(severity, renderer.render(diagnostic), location) } + private fun throwErrorDiagnosticAsException( + diagnostic: KtDiagnostic, + location: CompilerMessageSourceLocation, + messageRenderer: MessageRenderer + ) { + if (diagnostic.severity == Severity.ERROR) { + val severity = AnalyzerWithCompilerReport.convertSeverity(diagnostic.severity) + val renderer = RootDiagnosticRendererFactory(diagnostic) + val diagnosticText = messageRenderer.render(severity, renderer.render(diagnostic), location) + throw IllegalStateException("${diagnostic.factory.name}: $diagnosticText") + } + } + private fun KtDiagnostic.location(): CompilerMessageSourceLocation? = when (val element = element) { is KtPsiSourceElement -> element.location(this) is KtLightSourceElement -> element.location(this) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt index fa11f30aa50..0fac7a16cb7 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt @@ -24,7 +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.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.backend.Fir2IrResult import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver @@ -133,7 +133,7 @@ object FirKotlinToJvmBytecodeCompiler { performanceManager?.notifyAnalysisFinished() } if (firResult == null) { - FirDiagnosticsCompilerResultsReporter.reportToCollector(diagnosticsReporter, messageCollector) + FirDiagnosticsCompilerResultsReporter.reportToMessageCollector(diagnosticsReporter, messageCollector) return null } @@ -153,7 +153,7 @@ object FirKotlinToJvmBytecodeCompiler { diagnosticsReporter ) - FirDiagnosticsCompilerResultsReporter.reportToCollector(diagnosticsReporter, messageCollector) + FirDiagnosticsCompilerResultsReporter.reportToMessageCollector(diagnosticsReporter, messageCollector) performanceManager?.notifyIRGenerationFinished() performanceManager?.notifyGenerationFinished() @@ -168,7 +168,7 @@ object FirKotlinToJvmBytecodeCompiler { val fir: List ) - private fun CompilationContext.runFrontend(ktFiles: List, diagnosticsReporter: BaseDiagnosticReporter): FirResult? { + private fun CompilationContext.runFrontend(ktFiles: List, diagnosticsReporter: BaseDiagnosticsCollector): FirResult? { @Suppress("NAME_SHADOWING") var ktFiles = ktFiles val syntaxErrors = ktFiles.fold(false) { errorsFound, ktFile -> @@ -287,7 +287,7 @@ object FirKotlinToJvmBytecodeCompiler { fir2IrResult: Fir2IrResult, extensions: JvmGeneratorExtensionsImpl, session: FirSession, - diagnosticsReporter: BaseDiagnosticReporter + diagnosticsReporter: BaseDiagnosticsCollector ): GenerationState { val (moduleFragment, symbolTable, components) = fir2IrResult val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt index e38114c8ad5..87a94497059 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt @@ -375,7 +375,7 @@ object KotlinToJVMBytecodeCompiler { ), environment.messageCollector ) - FirDiagnosticsCompilerResultsReporter.reportToCollector(diagnosticsReporter, environment.messageCollector) + FirDiagnosticsCompilerResultsReporter.reportToMessageCollector(diagnosticsReporter, environment.messageCollector) ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() return state diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/DiagnosticReporterFactory.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/DiagnosticReporterFactory.kt index 0becc55a5bc..20dc034b2a8 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/DiagnosticReporterFactory.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/DiagnosticReporterFactory.kt @@ -5,16 +5,16 @@ package org.jetbrains.kotlin.diagnostics -import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticReporter -import org.jetbrains.kotlin.diagnostics.impl.DiagnosticReporterWithSuppress -import org.jetbrains.kotlin.diagnostics.impl.SimpleDiagnosticReporter +import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector +import org.jetbrains.kotlin.diagnostics.impl.DiagnosticsCollectorWithSuppress +import org.jetbrains.kotlin.diagnostics.impl.SimpleDiagnosticsCollector object DiagnosticReporterFactory { - fun createReporter(disableSuppress: Boolean = false): BaseDiagnosticReporter { + fun createReporter(disableSuppress: Boolean = false): BaseDiagnosticsCollector { return if (disableSuppress) { - SimpleDiagnosticReporter() + SimpleDiagnosticsCollector() } else { - DiagnosticReporterWithSuppress() + DiagnosticsCollectorWithSuppress() } } } \ No newline at end of file diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/BaseDiagnosticReporter.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/BaseDiagnosticsCollector.kt similarity index 89% rename from compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/BaseDiagnosticReporter.kt rename to compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/BaseDiagnosticsCollector.kt index 3039ecd09be..8ed5c055f9b 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/BaseDiagnosticReporter.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/BaseDiagnosticsCollector.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.diagnostics.impl import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.KtDiagnostic -abstract class BaseDiagnosticReporter : DiagnosticReporter() { +abstract class BaseDiagnosticsCollector : DiagnosticReporter() { abstract val diagnostics: List abstract val diagnosticsByFilePath: Map> abstract val hasErrors: Boolean diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/DiagnosticReporterWithSuppress.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/DiagnosticsCollectorWithSuppress.kt similarity index 94% rename from compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/DiagnosticReporterWithSuppress.kt rename to compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/DiagnosticsCollectorWithSuppress.kt index 0caa49ee02b..f92fcd6018d 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/DiagnosticReporterWithSuppress.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/DiagnosticsCollectorWithSuppress.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticContext import org.jetbrains.kotlin.diagnostics.KtDiagnostic import org.jetbrains.kotlin.diagnostics.Severity -class DiagnosticReporterWithSuppress : BaseDiagnosticReporter() { +class DiagnosticsCollectorWithSuppress : BaseDiagnosticsCollector() { private val _diagnosticsByFilePath: MutableMap> = mutableMapOf() override val diagnostics: List get() = _diagnosticsByFilePath.flatMap { it.value } diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticReporter.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticsCollector.kt similarity index 94% rename from compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticReporter.kt rename to compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticsCollector.kt index 8d241605bf2..00c4ed550dd 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticReporter.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticsCollector.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticContext import org.jetbrains.kotlin.diagnostics.KtDiagnostic import org.jetbrains.kotlin.diagnostics.Severity -class SimpleDiagnosticReporter : BaseDiagnosticReporter() { +class SimpleDiagnosticsCollector : BaseDiagnosticsCollector() { private val _diagnosticsByFilePath: MutableMap> = mutableMapOf() override val diagnostics: List get() = _diagnosticsByFilePath.flatMap { it.value } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/JvmBackendDiagnosticsHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/JvmBackendDiagnosticsHandler.kt index 6228f0a32e0..f178b4952f2 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/JvmBackendDiagnosticsHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/JvmBackendDiagnosticsHandler.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.test.backend.handlers -import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticReporter +import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.frontend.classic.handlers.ClassicDiagnosticReporter import org.jetbrains.kotlin.test.frontend.classic.handlers.withNewInferenceModeEnabled @@ -32,7 +32,7 @@ class JvmBackendDiagnosticsHandler(testServices: TestServices) : JvmBinaryArtifa val testFile = ktFileToTestFileMap[ktFile] ?: continue reporter.reportDiagnostic(diagnostic, module, testFile, configuration, withNewInferenceModeEnabled) } - val ktDiagnosticReporter = generationState.diagnosticReporter as BaseDiagnosticReporter + val ktDiagnosticReporter = generationState.diagnosticReporter as BaseDiagnosticsCollector val globalMetadataInfoHandler = testServices.globalMetadataInfoHandler for ((testFile, ktFile) in testFileToKtFileMap.entries) { val ktDiagnostics = ktDiagnosticReporter.diagnosticsByFilePath[ktFile.virtualFilePath] ?: continue diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/NoJvmSpecificCompilationErrorsHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/NoJvmSpecificCompilationErrorsHandler.kt index 931bf0e2c9f..fee3d0b766c 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/NoJvmSpecificCompilationErrorsHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/NoJvmSpecificCompilationErrorsHandler.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.test.backend.handlers import org.jetbrains.kotlin.TestsCompiletimeError +import org.jetbrains.kotlin.cli.common.fir.FirDiagnosticsCompilerResultsReporter +import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.resolve.AnalyzingUtils import org.jetbrains.kotlin.test.model.BinaryArtifacts import org.jetbrains.kotlin.test.model.TestModule @@ -16,6 +18,7 @@ class NoJvmSpecificCompilationErrorsHandler(testServices: TestServices) : JvmBin val generationState = info.classFileFactory.generationState try { AnalyzingUtils.throwExceptionOnErrors(generationState.collectedExtraJvmDiagnostics) + FirDiagnosticsCompilerResultsReporter.throwFirstErrorAsException(generationState.diagnosticReporter as BaseDiagnosticsCollector) } catch (e: Throwable) { throw TestsCompiletimeError(e) }