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 initializeCollector()
|
||||||
protected abstract fun getCollectedDiagnostics(): Iterable<ConeDiagnostic>
|
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 val components: MutableList<AbstractDiagnosticCollectorComponent> = mutableListOf()
|
||||||
private var componentsInitialized = false
|
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.render
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
|
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.body.resolve.FirDesignatedBodyResolveTransformer
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.runResolve
|
import org.jetbrains.kotlin.fir.resolve.transformers.runResolve
|
||||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||||
@@ -145,8 +144,8 @@ fun KtFile.getOrBuildFirWithDiagnostics(state: FirResolveState): FirFile {
|
|||||||
|
|
||||||
if (state.hasDiagnosticsForFile(this)) return firFile
|
if (state.hasDiagnosticsForFile(this)) return firFile
|
||||||
|
|
||||||
val coneDiagnostics = FirDiagnosticsCollector.create().collectDiagnostics(firFile)
|
FirIdeDiagnosticsCollector(state).collectDiagnostics(firFile)
|
||||||
state.setDiagnosticsForFile(this, firFile, coneDiagnostics)
|
state.setDiagnosticsForFile(this, firFile)
|
||||||
return firFile
|
return firFile
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ interface FirResolveState {
|
|||||||
|
|
||||||
fun record(psi: KtElement, diagnostic: Diagnostic)
|
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 {
|
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) {
|
override fun record(psi: KtElement, diagnostic: Diagnostic) {
|
||||||
// TODO: consider implementing custom FirIdeDiagnosticReported/Collector
|
|
||||||
val list = diagnosticCache.getOrPut(psi) { mutableListOf() }
|
val list = diagnosticCache.getOrPut(psi) { mutableListOf() }
|
||||||
list += diagnostic
|
list += diagnostic
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user