[FIR] Add unified diagnostics for psi and light tree

This commit is contained in:
Dmitriy Novozhilov
2020-03-23 12:24:29 +03:00
parent 1a3fef5fa1
commit 2c37627b15
28 changed files with 499 additions and 183 deletions
@@ -8,9 +8,9 @@ package org.jetbrains.kotlin.idea.fir
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollector
import org.jetbrains.kotlin.fir.analysis.collectors.registerAllComponents
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
import org.jetbrains.kotlin.psi.KtElement
class FirIdeDiagnosticsCollector(session: FirSession, private val resolveState: FirModuleResolveState) : AbstractDiagnosticCollector(session) {
@@ -20,12 +20,11 @@ class FirIdeDiagnosticsCollector(session: FirSession, private val resolveState:
}
private inner class Reporter : DiagnosticReporter() {
override fun report(diagnostic: FirDiagnostic?) {
if (diagnostic == null) return
val psi = diagnostic.source.psi as? KtElement ?: return
resolveState.record(psi, diagnostic.diagnostic)
override fun report(diagnostic: FirDiagnostic<*>?) {
if (diagnostic !is FirPsiDiagnostic<*>) return
val psi = diagnostic.element.psi as? KtElement ?: return
resolveState.record(psi, diagnostic.asPsiBasedDiagnostic())
}
}
private lateinit var reporter: Reporter
@@ -34,7 +33,7 @@ class FirIdeDiagnosticsCollector(session: FirSession, private val resolveState:
reporter = Reporter()
}
override fun getCollectedDiagnostics(): Iterable<FirDiagnostic> {
override fun getCollectedDiagnostics(): Iterable<FirDiagnostic<*>> {
// Not necessary in IDE
return emptyList()
}
@@ -12,9 +12,9 @@ import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
import org.jetbrains.kotlin.psi.KtElement
@@ -49,7 +49,7 @@ interface FirModuleResolveState {
fun record(psi: KtElement, diagnostic: Diagnostic)
fun setDiagnosticsForFile(file: KtFile, fir: FirFile, diagnostics: Iterable<FirDiagnostic> = emptyList())
fun setDiagnosticsForFile(file: KtFile, fir: FirFile, diagnostics: Iterable<FirDiagnostic<*>> = emptyList())
}
class FirModuleResolveStateImpl(override val sessionProvider: FirProjectSessionProvider) : FirModuleResolveState {
@@ -91,9 +91,11 @@ class FirModuleResolveStateImpl(override val sessionProvider: FirProjectSessionP
list += diagnostic
}
override fun setDiagnosticsForFile(file: KtFile, fir: FirFile, diagnostics: Iterable<FirDiagnostic>) {
override fun setDiagnosticsForFile(file: KtFile, fir: FirFile, diagnostics: Iterable<FirDiagnostic<*>>) {
for (diagnostic in diagnostics) {
(diagnostic.source.psi as? KtElement)?.let { record(it, diagnostic.diagnostic) }
require(diagnostic is FirPsiDiagnostic<*>)
val psi = diagnostic.element.psi as? KtElement ?: continue
record(psi, diagnostic.asPsiBasedDiagnostic())
}
diagnosedFiles[file] = file.modificationStamp