FIR IDE: add severity to KtDiagnostic

This commit is contained in:
Ilya Kirillov
2021-01-29 19:59:06 +01:00
parent f5ec37db95
commit aaba5742dc
4 changed files with 21 additions and 7 deletions
@@ -23,6 +23,7 @@ import com.intellij.openapi.editor.Editor
import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile 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.analyze
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnostic import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnostic
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnosticWithPsi import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnosticWithPsi
@@ -50,12 +51,18 @@ class KotlinHighLevelDiagnosticHighlightingPass(
private fun addDiagnostic(diagnostic: KtDiagnosticWithPsi) { private fun addDiagnostic(diagnostic: KtDiagnosticWithPsi) {
val fixes = service<KtQuickFixService>().getQuickFixesFor(diagnostic as KtFirDiagnostic) val fixes = service<KtQuickFixService>().getQuickFixesFor(diagnostic as KtFirDiagnostic)
annotationHolder.runAnnotatorWithContext(diagnostic.psi) { element, annotator -> annotationHolder.runAnnotatorWithContext(diagnostic.psi) { element, annotator ->
annotationHolder.newAnnotation(HighlightSeverity.ERROR, diagnostic.getMessageToRender()) annotationHolder.newAnnotation(diagnostic.getHighlightSeverity(), diagnostic.getMessageToRender())
.addFixes(fixes) .addFixes(fixes)
.create() .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<IntentionAction>) = private fun AnnotationBuilder.addFixes(fixes: List<IntentionAction>) =
fixes.fold(this, AnnotationBuilder::withFix) fixes.fold(this, AnnotationBuilder::withFix)
@@ -7,11 +7,13 @@ package org.jetbrains.kotlin.idea.frontend.api.diagnostics
import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement 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.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import kotlin.reflect.KClass import kotlin.reflect.KClass
interface KtDiagnostic : ValidityTokenOwner { interface KtDiagnostic : ValidityTokenOwner {
val severity: Severity
val factoryName: String? val factoryName: String?
val defaultMessage: String val defaultMessage: String
} }
@@ -22,11 +24,13 @@ interface KtDiagnosticWithPsi : KtDiagnostic {
val diagnosticClass: KClass<out KtDiagnosticWithPsi> val diagnosticClass: KClass<out KtDiagnosticWithPsi>
} }
class KtSimpleDiagnostic( class KtNonBoundToPsiErrorDiagnostic(
override val factoryName: String?, override val factoryName: String?,
override val defaultMessage: String, override val defaultMessage: String,
override val token: ValidityToken, override val token: ValidityToken,
) : KtDiagnostic ) : KtDiagnostic {
override val severity: Severity get() = Severity.ERROR
}
fun KtDiagnostic.getDefaultMessageWithFactoryName(): String = fun KtDiagnostic.getDefaultMessageWithFactoryName(): String =
if (factoryName == null) defaultMessage if (factoryName == null) defaultMessage
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.components package org.jetbrains.kotlin.idea.frontend.api.fir.components
import org.jetbrains.kotlin.builtins.StandardNames 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.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression 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.*
import org.jetbrains.kotlin.idea.frontend.api.calls.* import org.jetbrains.kotlin.idea.frontend.api.calls.*
import org.jetbrains.kotlin.idea.frontend.api.components.KtCallResolver 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.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.*
@@ -113,13 +112,13 @@ internal class KtFirCallResolver(
private fun FirErrorNamedReference.createErrorCallTarget(): KtErrorCallTarget = private fun FirErrorNamedReference.createErrorCallTarget(): KtErrorCallTarget =
KtErrorCallTarget( KtErrorCallTarget(
getCandidateSymbols().mapNotNull { it.fir.buildSymbol(firSymbolBuilder) as? KtFunctionLikeSymbol }, 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 = private fun FirErrorReferenceWithCandidate.createErrorCallTarget(): KtErrorCallTarget =
KtErrorCallTarget( KtErrorCallTarget(
getCandidateSymbols().mapNotNull { it.fir.buildSymbol(firSymbolBuilder) as? KtFunctionLikeSymbol }, 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? = private fun FirResolvedNamedReference.getKtFunctionOrConstructorSymbol(): KtFunctionLikeSymbol? =
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.diagnostics
import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement 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.FirDefaultErrorMessages
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderer import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderer
@@ -35,4 +36,7 @@ internal interface KtAbstractFirDiagnostic : KtDiagnosticWithPsi {
override val psi: PsiElement override val psi: PsiElement
get() = firDiagnostic.psiElement get() = firDiagnostic.psiElement
override val severity: Severity
get() = firDiagnostic.severity
} }