From 27db8ce1bb6da8904628a15ad5bc435f52388ce9 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Wed, 15 Feb 2023 18:52:09 +0100 Subject: [PATCH] FIR LT: extract syntax diagnostic info from error element #KT-56701 fixed --- .../api/fir/diagnostics/KtFirDataClassConverters.kt | 7 +++++++ .../analysis/api/fir/diagnostics/KtFirDiagnostics.kt | 5 +++++ .../analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 6 ++++++ .../generator/diagnostics/FirSyntaxDiagnosticList.kt | 3 +++ .../fir/lightTree/converter/DeclarationsConverter.kt | 8 +++++++- .../org/jetbrains/kotlin/fir/builder/FirSyntaxErrors.kt | 1 + .../kotlin/fir/builder/FirSyntaxErrorsDefaultMessages.kt | 3 +++ compiler/testData/cli/jvm/firSyntaxError.out | 2 +- 8 files changed, 33 insertions(+), 2 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 5c46ebc92f8..be73d4be3eb 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 @@ -4931,4 +4931,11 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert 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 cf3d1b37016..31db23eaff1 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 @@ -3428,4 +3428,9 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { 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 c1b0caf42b1..1629a02bf12 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 @@ -4150,3 +4150,9 @@ internal class SyntaxImpl( 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 d14c4ae64f2..140a8497a2d 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 @@ -14,5 +14,8 @@ import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.DiagnosticL object SYNTAX_DIAGNOSTIC_LIST : DiagnosticList("FirSyntaxErrors") { val Syntax by object : DiagnosticGroup("Syntax") { val SYNTAX by error() + val SYNTAX_WITH_MESSAGE by error() { + parameter("message") + } } } \ No newline at end of file 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 51e7f162871..b821dec1942 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 @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.lightTree.converter import com.intellij.lang.LighterASTNode +import com.intellij.lang.impl.PsiBuilderImpl import com.intellij.psi.TokenType import com.intellij.util.diff.FlyweightCapableTreeStructure import org.jetbrains.kotlin.* @@ -91,7 +92,12 @@ class DeclarationsConverter( private val expressionConverter = ExpressionsConverter(session, tree, this, context) override fun reportSyntaxError(node: LighterASTNode) { - diagnosticsReporter?.reportOn(node.toFirSourceElement(), FirSyntaxErrors.SYNTAX, diagnosticContext!!) + 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!!) + } } /** 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 13fbbc8ccfb..d6eaa794f78 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 @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory object FirSyntaxErrors { // Syntax val SYNTAX by error0() + val SYNTAX_WITH_MESSAGE 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 5c813e0ded0..0e9abd55fa8 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,11 +6,14 @@ 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.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) } } diff --git a/compiler/testData/cli/jvm/firSyntaxError.out b/compiler/testData/cli/jvm/firSyntaxError.out index e030b36e891..2287b142cb2 100644 --- a/compiler/testData/cli/jvm/firSyntaxError.out +++ b/compiler/testData/cli/jvm/firSyntaxError.out @@ -1,5 +1,5 @@ warning: language version 2.0 is experimental, there are no backwards compatibility guarantees for new language and library features -compiler/testData/cli/jvm/firSyntaxError.kt:1:10: error: syntax error +compiler/testData/cli/jvm/firSyntaxError.kt:1:10: error: syntax error: Expecting '}' fun a() { ^ COMPILATION_ERROR