FIR: implement separate diagnostic collector/reporter for IDE

This commit is contained in:
Mikhail Glukhikh
2019-12-09 15:29:54 +03:00
parent fbf1dbf2da
commit 83ccd7dd1c
4 changed files with 48 additions and 6 deletions
@@ -26,7 +26,7 @@ abstract class AbstractDiagnosticCollector {
protected abstract fun initializeCollector()
protected abstract fun getCollectedDiagnostics(): Iterable<ConeDiagnostic>
internal abstract fun runCheck(block: (DiagnosticReporter) -> Unit)
abstract fun runCheck(block: (DiagnosticReporter) -> Unit)
private val components: MutableList<AbstractDiagnosticCollectorComponent> = mutableListOf()
private var componentsInitialized = false
@@ -0,0 +1,44 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.fir
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.AbstractDiagnosticCollector
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.registerAllComponents
import org.jetbrains.kotlin.psi.KtElement
class FirIdeDiagnosticsCollector(private val resolveState: FirResolveState) : AbstractDiagnosticCollector() {
init {
registerAllComponents()
}
private inner class Reporter : DiagnosticReporter() {
override fun report(diagnostic: ConeDiagnostic?) {
if (diagnostic == null) return
val psi = diagnostic.source.psi as? KtElement ?: return
resolveState.record(psi, diagnostic.diagnostic)
}
}
private lateinit var reporter: Reporter
override fun initializeCollector() {
reporter = Reporter()
}
override fun getCollectedDiagnostics(): Iterable<ConeDiagnostic> {
// Not necessary in IDE
return emptyList()
}
override fun runCheck(block: (DiagnosticReporter) -> Unit) {
block(reporter)
}
}
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.FirDiagnosticsCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDesignatedBodyResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.runResolve
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
@@ -145,8 +144,8 @@ fun KtFile.getOrBuildFirWithDiagnostics(state: FirResolveState): FirFile {
if (state.hasDiagnosticsForFile(this)) return firFile
val coneDiagnostics = FirDiagnosticsCollector.create().collectDiagnostics(firFile)
state.setDiagnosticsForFile(this, firFile, coneDiagnostics)
FirIdeDiagnosticsCollector(state).collectDiagnostics(firFile)
state.setDiagnosticsForFile(this, firFile)
return firFile
}
@@ -67,7 +67,7 @@ interface FirResolveState {
fun record(psi: KtElement, diagnostic: Diagnostic)
fun setDiagnosticsForFile(file: KtFile, fir: FirFile, diagnostics: Iterable<ConeDiagnostic>)
fun setDiagnosticsForFile(file: KtFile, fir: FirFile, diagnostics: Iterable<ConeDiagnostic> = emptyList())
}
class FirResolveStateImpl(override val sessionProvider: FirSessionProvider) : FirResolveState {
@@ -92,7 +92,6 @@ class FirResolveStateImpl(override val sessionProvider: FirSessionProvider) : Fi
}
override fun record(psi: KtElement, diagnostic: Diagnostic) {
// TODO: consider implementing custom FirIdeDiagnosticReported/Collector
val list = diagnosticCache.getOrPut(psi) { mutableListOf() }
list += diagnostic
}