FIR: implement separate diagnostic collector/reporter for IDE
This commit is contained in:
+1
-1
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user