From bdf0b41026bcb89f7ca2d353ebbe9f9db1ad0948 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Fri, 21 Apr 2023 09:58:13 +0200 Subject: [PATCH] [FIR] Consolidate SYNTAX and SYNTAX_WITH_MESSAGE diagnostics --- .../diagnostics/KtFirDataClassConverters.kt | 6 ----- .../api/fir/diagnostics/KtFirDiagnostics.kt | 4 ---- .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 7 +----- .../diagnostics/FirSyntaxDiagnosticList.kt | 3 +-- .../coneDiagnosticToFirDiagnostic.kt | 3 ++- .../converter/DeclarationsConverter.kt | 11 +++++---- .../kotlin/fir/builder/FirSyntaxErrors.kt | 3 +-- .../builder/FirSyntaxErrorsDefaultMessages.kt | 6 ++--- .../diagnostics/KtDiagnosticRenderers.kt | 5 ++++ .../fir/handlers/FirDiagnosticsHandler.kt | 24 +++++++++++-------- 10 files changed, 32 insertions(+), 40 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index fbbb5fe91a0..485b5767b00 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -5083,12 +5083,6 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirSyntaxErrors.SYNTAX) { firDiagnostic -> SyntaxImpl( - firDiagnostic as KtPsiDiagnostic, - token, - ) - } - add(FirSyntaxErrors.SYNTAX_WITH_MESSAGE) { firDiagnostic -> - SyntaxWithMessageImpl( firDiagnostic.a, firDiagnostic as KtPsiDiagnostic, token, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 0b8b8cac205..1eaf5cda8f4 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -3539,10 +3539,6 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract class Syntax : KtFirDiagnostic() { override val diagnosticClass get() = Syntax::class - } - - abstract class SyntaxWithMessage : KtFirDiagnostic() { - override val diagnosticClass get() = SyntaxWithMessage::class abstract val message: String } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 4bbae14432c..a4a07e85cf2 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -4279,13 +4279,8 @@ internal class WrongOperationWithDynamicImpl( ) : KtFirDiagnostic.WrongOperationWithDynamic(), KtAbstractFirDiagnostic internal class SyntaxImpl( + override val message: String, override val firDiagnostic: KtPsiDiagnostic, override val token: KtLifetimeToken, ) : KtFirDiagnostic.Syntax(), KtAbstractFirDiagnostic -internal class SyntaxWithMessageImpl( - override val message: String, - override val firDiagnostic: KtPsiDiagnostic, - override val token: KtLifetimeToken, -) : KtFirDiagnostic.SyntaxWithMessage(), KtAbstractFirDiagnostic - diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirSyntaxDiagnosticList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirSyntaxDiagnosticList.kt index 140a8497a2d..6cd2f7bd0ef 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirSyntaxDiagnosticList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirSyntaxDiagnosticList.kt @@ -13,8 +13,7 @@ import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.DiagnosticL @OptIn(PrivateForInline::class) object SYNTAX_DIAGNOSTIC_LIST : DiagnosticList("FirSyntaxErrors") { val Syntax by object : DiagnosticGroup("Syntax") { - val SYNTAX by error() - val SYNTAX_WITH_MESSAGE by error() { + val SYNTAX by error { parameter("message") } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt index 3c153e7923d..d28a5d16955 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt @@ -102,6 +102,7 @@ private fun ConeDiagnostic.toKtDiagnostic( is ConeSimpleDiagnostic -> when { source.kind is KtFakeSourceElementKind && source.kind != KtFakeSourceElementKind.ReferenceInAtomicQualifiedAccess -> null + kind == DiagnosticKind.Syntax -> FirSyntaxErrors.SYNTAX.createOn(qualifiedAccessSource ?: source, reason) else -> this.getFactory(source).createOn(qualifiedAccessSource ?: source) } @@ -486,7 +487,6 @@ private val NewConstraintError.upperConeType: ConeKotlinType get() = upperType a private fun ConeSimpleDiagnostic.getFactory(source: KtSourceElement): KtDiagnosticFactory0 { return when (kind) { - DiagnosticKind.Syntax -> FirSyntaxErrors.SYNTAX DiagnosticKind.ReturnNotAllowed -> FirErrors.RETURN_NOT_ALLOWED DiagnosticKind.NotAFunctionLabel -> FirErrors.NOT_A_FUNCTION_LABEL DiagnosticKind.UnresolvedLabel -> FirErrors.UNRESOLVED_LABEL @@ -532,6 +532,7 @@ private fun ConeSimpleDiagnostic.getFactory(source: KtSourceElement): KtDiagnost DiagnosticKind.UnresolvedSupertype, DiagnosticKind.UnresolvedExpandedType, DiagnosticKind.Other -> FirErrors.OTHER_ERROR + DiagnosticKind.Syntax -> error("Must not be called on `Syntax` because a message is required.") } } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 9d8da81f371..8944f39b777 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -90,11 +90,12 @@ class DeclarationsConverter( override fun reportSyntaxError(node: LighterASTNode) { val message = PsiBuilderImpl.getErrorMessage(node) - if (message == null) { - diagnosticsReporter?.reportOn(node.toFirSourceElement(), FirSyntaxErrors.SYNTAX, diagnosticContext!!) - } else { - diagnosticsReporter?.reportOn(node.toFirSourceElement(), FirSyntaxErrors.SYNTAX_WITH_MESSAGE, message, diagnosticContext!!) - } + diagnosticsReporter?.reportOn( + node.toFirSourceElement(), + FirSyntaxErrors.SYNTAX, + message ?: "Unspecified", + diagnosticContext!!, + ) } /** diff --git a/compiler/fir/raw-fir/raw-fir.common/gen/org/jetbrains/kotlin/fir/builder/FirSyntaxErrors.kt b/compiler/fir/raw-fir/raw-fir.common/gen/org/jetbrains/kotlin/fir/builder/FirSyntaxErrors.kt index d6eaa794f78..30d12323b3e 100644 --- a/compiler/fir/raw-fir/raw-fir.common/gen/org/jetbrains/kotlin/fir/builder/FirSyntaxErrors.kt +++ b/compiler/fir/raw-fir/raw-fir.common/gen/org/jetbrains/kotlin/fir/builder/FirSyntaxErrors.kt @@ -16,8 +16,7 @@ import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory object FirSyntaxErrors { // Syntax - val SYNTAX by error0() - val SYNTAX_WITH_MESSAGE by error1() + val SYNTAX by error1() init { RootDiagnosticRendererFactory.registerFactory(FirSyntaxErrorsDefaultMessages) diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/FirSyntaxErrorsDefaultMessages.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/FirSyntaxErrorsDefaultMessages.kt index 0e9abd55fa8..25b8441853f 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/FirSyntaxErrorsDefaultMessages.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/FirSyntaxErrorsDefaultMessages.kt @@ -6,14 +6,12 @@ package org.jetbrains.kotlin.fir.builder import org.jetbrains.kotlin.diagnostics.KtDiagnosticFactoryToRendererMap -import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderers.TO_STRING +import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderers.OPTIONAL_COLON_TO_STRING import org.jetbrains.kotlin.diagnostics.rendering.BaseDiagnosticRendererFactory -import org.jetbrains.kotlin.diagnostics.rendering.Renderer @Suppress("unused") object FirSyntaxErrorsDefaultMessages : BaseDiagnosticRendererFactory() { override val MAP = KtDiagnosticFactoryToRendererMap("FIR").also { map -> - map.put(FirSyntaxErrors.SYNTAX, "Syntax error") - map.put(FirSyntaxErrors.SYNTAX_WITH_MESSAGE, "Syntax error: {0}", TO_STRING) + map.put(FirSyntaxErrors.SYNTAX, "Syntax error{0}", OPTIONAL_COLON_TO_STRING) } } diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/KtDiagnosticRenderers.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/KtDiagnosticRenderers.kt index 8068baa6585..8ba72bd0fe5 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/KtDiagnosticRenderers.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/KtDiagnosticRenderers.kt @@ -16,6 +16,11 @@ object KtDiagnosticRenderers { element.toString() } + val OPTIONAL_COLON_TO_STRING = Renderer { element: Any? -> + val string = element.toString() + if (string.isNotEmpty()) ": $string" else "" + } + val EMPTY = Renderer { _: Any? -> "" } val VISIBILITY = Renderer { visibility: Visibility -> diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt index 18d978715a3..3bee981e913 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.test.frontend.fir.handlers +import com.intellij.lang.impl.PsiBuilderImpl import com.intellij.psi.PsiElement import org.jetbrains.kotlin.* import org.jetbrains.kotlin.checkers.diagnostics.factories.DebugInfoDiagnosticFactory0 @@ -106,7 +107,7 @@ class FirDiagnosticsHandler(testServices: TestServices) : FirAnalysisHandler(tes ) { val metaInfos = if (firFile.psi != null) { AnalyzingUtils.getSyntaxErrorRanges(firFile.psi!!).flatMap { - FirSyntaxErrors.SYNTAX.on(KtRealPsiSourceElement(it), positioningStrategy = null) + FirSyntaxErrors.SYNTAX.on(KtRealPsiSourceElement(it), it.errorDescription, positioningStrategy = null) .toMetaInfos( module, testFile, @@ -118,15 +119,18 @@ class FirDiagnosticsHandler(testServices: TestServices) : FirAnalysisHandler(tes } } else { collectLightTreeSyntaxErrors(firFile).flatMap { sourceElement -> - FirSyntaxErrors.SYNTAX.on(sourceElement, positioningStrategy = null) - .toMetaInfos( - module, - testFile, - globalMetadataInfoHandler1 = globalMetadataInfoHandler, - lightTreeEnabled, - lightTreeComparingModeEnabled, - forceRenderArguments, - ) + FirSyntaxErrors.SYNTAX.on( + sourceElement, + PsiBuilderImpl.getErrorMessage(sourceElement.lighterASTNode) ?: "Syntax error", + positioningStrategy = null + ).toMetaInfos( + module, + testFile, + globalMetadataInfoHandler1 = globalMetadataInfoHandler, + lightTreeEnabled, + lightTreeComparingModeEnabled, + forceRenderArguments, + ) } }