diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/highlighter/KotlinHighLevelDiagnosticHighlightingPass.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/highlighter/KotlinHighLevelDiagnosticHighlightingPass.kt index f4f5ce128a9..c633c2d8ca0 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/highlighter/KotlinHighLevelDiagnosticHighlightingPass.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/highlighter/KotlinHighLevelDiagnosticHighlightingPass.kt @@ -23,6 +23,7 @@ import com.intellij.openapi.editor.Editor import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.project.Project import com.intellij.psi.PsiFile +import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.idea.frontend.api.analyze import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnostic import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnosticWithPsi @@ -50,12 +51,18 @@ class KotlinHighLevelDiagnosticHighlightingPass( private fun addDiagnostic(diagnostic: KtDiagnosticWithPsi) { val fixes = service().getQuickFixesFor(diagnostic as KtFirDiagnostic) annotationHolder.runAnnotatorWithContext(diagnostic.psi) { element, annotator -> - annotationHolder.newAnnotation(HighlightSeverity.ERROR, diagnostic.getMessageToRender()) + annotationHolder.newAnnotation(diagnostic.getHighlightSeverity(), diagnostic.getMessageToRender()) .addFixes(fixes) .create() } } + private fun KtDiagnosticWithPsi.getHighlightSeverity() = when (severity) { + Severity.INFO -> HighlightSeverity.INFORMATION + Severity.ERROR -> HighlightSeverity.ERROR + Severity.WARNING -> HighlightSeverity.WARNING + } + private fun AnnotationBuilder.addFixes(fixes: List) = fixes.fold(this, AnnotationBuilder::withFix) diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/diagnostics/KtDiagnostic.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/diagnostics/KtDiagnostic.kt index 1eb30e9f077..7b630d693b4 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/diagnostics/KtDiagnostic.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/diagnostics/KtDiagnostic.kt @@ -7,11 +7,13 @@ package org.jetbrains.kotlin.idea.frontend.api.diagnostics import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import kotlin.reflect.KClass interface KtDiagnostic : ValidityTokenOwner { + val severity: Severity val factoryName: String? val defaultMessage: String } @@ -22,11 +24,13 @@ interface KtDiagnosticWithPsi : KtDiagnostic { val diagnosticClass: KClass } -class KtSimpleDiagnostic( +class KtNonBoundToPsiErrorDiagnostic( override val factoryName: String?, override val defaultMessage: String, override val token: ValidityToken, -) : KtDiagnostic +) : KtDiagnostic { + override val severity: Severity get() = Severity.ERROR +} fun KtDiagnostic.getDefaultMessageWithFactoryName(): String = if (factoryName == null) defaultMessage diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCallResolver.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCallResolver.kt index 43aeddcd1cd..127e30df7fd 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCallResolver.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCallResolver.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.components import org.jetbrains.kotlin.builtins.StandardNames -import org.jetbrains.kotlin.fir.analysis.diagnostics.toFirDiagnostic import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression @@ -25,7 +24,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirSafe import org.jetbrains.kotlin.idea.frontend.api.* import org.jetbrains.kotlin.idea.frontend.api.calls.* import org.jetbrains.kotlin.idea.frontend.api.components.KtCallResolver -import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtSimpleDiagnostic +import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtNonBoundToPsiErrorDiagnostic import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.* @@ -113,13 +112,13 @@ internal class KtFirCallResolver( private fun FirErrorNamedReference.createErrorCallTarget(): KtErrorCallTarget = KtErrorCallTarget( getCandidateSymbols().mapNotNull { it.fir.buildSymbol(firSymbolBuilder) as? KtFunctionLikeSymbol }, - source?.let { diagnostic.asKtDiagnostic(it) } ?: KtSimpleDiagnostic(factoryName = null, diagnostic.reason, token) + source?.let { diagnostic.asKtDiagnostic(it) } ?: KtNonBoundToPsiErrorDiagnostic(factoryName = null, diagnostic.reason, token) ) private fun FirErrorReferenceWithCandidate.createErrorCallTarget(): KtErrorCallTarget = KtErrorCallTarget( getCandidateSymbols().mapNotNull { it.fir.buildSymbol(firSymbolBuilder) as? KtFunctionLikeSymbol }, - source?.let { diagnostic.asKtDiagnostic(it) } ?: KtSimpleDiagnostic(factoryName = null, diagnostic.reason, token) + source?.let { diagnostic.asKtDiagnostic(it) } ?: KtNonBoundToPsiErrorDiagnostic(factoryName = null, diagnostic.reason, token) ) private fun FirResolvedNamedReference.getKtFunctionOrConstructorSymbol(): KtFunctionLikeSymbol? = diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtAbstractFirDiagnostic.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtAbstractFirDiagnostic.kt index 0d62f581e04..85773383b8f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtAbstractFirDiagnostic.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtAbstractFirDiagnostic.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.diagnostics import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDefaultErrorMessages import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderer @@ -35,4 +36,7 @@ internal interface KtAbstractFirDiagnostic : KtDiagnosticWithPsi { override val psi: PsiElement get() = firDiagnostic.psiElement + + override val severity: Severity + get() = firDiagnostic.severity }