FIR LT: extract syntax diagnostic info from error element

#KT-56701 fixed
This commit is contained in:
Ilya Chernikov
2023-02-15 18:52:09 +01:00
committed by Space Team
parent e39eb62e6e
commit 27db8ce1bb
8 changed files with 33 additions and 2 deletions
@@ -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,
)
}
}
@@ -3428,4 +3428,9 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = Syntax::class
}
abstract class SyntaxWithMessage : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = SyntaxWithMessage::class
abstract val message: String
}
}
@@ -4150,3 +4150,9 @@ internal class SyntaxImpl(
override val token: KtLifetimeToken,
) : KtFirDiagnostic.Syntax(), KtAbstractFirDiagnostic<PsiElement>
internal class SyntaxWithMessageImpl(
override val message: String,
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,
) : KtFirDiagnostic.SyntaxWithMessage(), KtAbstractFirDiagnostic<PsiElement>
@@ -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<PsiElement>()
val SYNTAX_WITH_MESSAGE by error<PsiElement>() {
parameter<String>("message")
}
}
}
@@ -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!!)
}
}
/**
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory
object FirSyntaxErrors {
// Syntax
val SYNTAX by error0<PsiElement>()
val SYNTAX_WITH_MESSAGE by error1<PsiElement, String>()
init {
RootDiagnosticRendererFactory.registerFactory(FirSyntaxErrorsDefaultMessages)
@@ -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)
}
}
+1 -1
View File
@@ -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