FIR IDE: implement generators for IDE diagnostics

This commit is contained in:
Ilya Kirillov
2021-01-27 14:08:14 +01:00
parent c87684a6ef
commit e41ad2ea06
27 changed files with 3829 additions and 39 deletions
@@ -9,6 +9,7 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.frontend.api.calls.KtCall
import org.jetbrains.kotlin.idea.frontend.api.components.*
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.scopes.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithDeclarations
@@ -84,7 +85,7 @@ abstract class KtAnalysisSession(final override val token: ValidityToken) : Vali
fun KtElement.getDiagnostics(): Collection<KtDiagnostic> = diagnosticProvider.getDiagnosticsForElement(this)
fun KtFile.collectDiagnosticsForFile(): Collection<KtDiagnostic> = diagnosticProvider.collectDiagnosticsForFile(this)
fun KtFile.collectDiagnosticsForFile(): Collection<KtDiagnosticWithPsi> = diagnosticProvider.collectDiagnosticsForFile(this)
fun KtSymbolWithKind.getContainingSymbol(): KtSymbolWithKind? = containingDeclarationProvider.getContainingDeclaration(this)
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.idea.frontend.api.components
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnostic
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnosticWithPsi
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile
abstract class KtDiagnosticProvider : KtAnalysisSessionComponent() {
abstract fun getDiagnosticsForElement(element: KtElement): Collection<KtDiagnostic>
abstract fun collectDiagnosticsForFile(ktFile: KtFile): Collection<KtDiagnostic>
abstract fun getDiagnosticsForElement(element: KtElement): Collection<KtDiagnosticWithPsi>
abstract fun collectDiagnosticsForFile(ktFile: KtFile): Collection<KtDiagnosticWithPsi>
}
@@ -6,20 +6,28 @@
package org.jetbrains.kotlin.idea.frontend.api.diagnostics
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import kotlin.reflect.KClass
interface KtDiagnostic {
interface KtDiagnostic : ValidityTokenOwner {
val factoryName: String?
val message: String
val textRanges: Collection<TextRange>
val isValid: Boolean get() = true
val defaultMessage: String
}
fun KtDiagnostic.getMessageWithFactoryName(): String =
if (factoryName == null) message
else "[$factoryName] $message"
interface KtDiagnosticWithPsi : KtDiagnostic {
val psi: PsiElement
val textRanges: Collection<TextRange>
val diagnosticClass: KClass<out KtDiagnosticWithPsi>
}
data class KtSimpleDiagnostic(
class KtSimpleDiagnostic(
override val factoryName: String?,
override val message: String,
override val textRanges: Collection<TextRange>,
) : KtDiagnostic
override val defaultMessage: String,
override val token: ValidityToken,
) : KtDiagnostic
fun KtDiagnostic.getDefaultMessageWithFactoryName(): String =
if (factoryName == null) defaultMessage
else "[$factoryName] $defaultMessage"