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.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<KtQuickFixService>().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<IntentionAction>) =
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.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<out KtDiagnosticWithPsi>
}
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
@@ -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? =
@@ -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
}