K2 checkers: separate report committer from other diagnostic components
This commit is contained in:
+4
-3
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.type.ComposedTypeCheckers
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.type.TypeCheckers
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollector
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.DiagnosticCollectorComponents
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.components.*
|
||||
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
|
||||
import org.jetbrains.kotlin.fir.analysis.extensions.additionalCheckers
|
||||
@@ -46,7 +47,7 @@ private object CheckersFactory {
|
||||
session: FirSession,
|
||||
reporter: DiagnosticReporter,
|
||||
useExtendedCheckers: Boolean
|
||||
): List<AbstractDiagnosticCollectorComponent> {
|
||||
): DiagnosticCollectorComponents {
|
||||
val module = session.firKtModuleBasedModuleData.ktModule
|
||||
val platform = module.platform.componentPlatforms.first()
|
||||
val extensionCheckers = session.extensionService.additionalCheckers
|
||||
@@ -54,7 +55,7 @@ private object CheckersFactory {
|
||||
val expressionCheckers = createExpressionCheckers(useExtendedCheckers, platform, extensionCheckers)
|
||||
val typeCheckers = createTypeCheckers(useExtendedCheckers, platform, extensionCheckers)
|
||||
|
||||
return buildList {
|
||||
val regularComponents = buildList {
|
||||
if (!useExtendedCheckers) {
|
||||
add(ErrorNodeDiagnosticCollectorComponent(session, reporter))
|
||||
}
|
||||
@@ -62,8 +63,8 @@ private object CheckersFactory {
|
||||
add(ExpressionCheckersDiagnosticComponent(session, reporter, expressionCheckers))
|
||||
add(TypeCheckersDiagnosticComponent(session, reporter, typeCheckers))
|
||||
add(ControlFlowAnalysisDiagnosticComponent(session, reporter, declarationCheckers))
|
||||
add(ReportCommitterDiagnosticComponent(session, reporter))
|
||||
}
|
||||
return DiagnosticCollectorComponents(regularComponents, ReportCommitterDiagnosticComponent(session, reporter))
|
||||
}
|
||||
|
||||
|
||||
|
||||
+7
-4
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.fir.Persisten
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.fir.PersistentCheckerContextFactory
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.components.AbstractDiagnosticCollectorComponent
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.DiagnosticCollectorComponents
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
|
||||
import org.jetbrains.kotlin.name.StandardClassIds
|
||||
@@ -44,7 +44,7 @@ internal class SingleNonLocalDeclarationDiagnosticRetriever(
|
||||
private class Visitor(
|
||||
private val structureElementDeclaration: FirDeclaration,
|
||||
context: CheckerContext,
|
||||
components: List<AbstractDiagnosticCollectorComponent>
|
||||
components: DiagnosticCollectorComponents
|
||||
) : LLFirDiagnosticVisitor(context, components) {
|
||||
private var insideAlwaysVisitableDeclarations = 0
|
||||
|
||||
@@ -61,7 +61,10 @@ internal class SingleNonLocalDeclarationDiagnosticRetriever(
|
||||
return when {
|
||||
structureElementDeclaration !is FirRegularClass -> true
|
||||
structureElementDeclaration == declaration -> true
|
||||
declaration.hasAnnotation(StandardClassIds.Annotations.Suppress) -> true
|
||||
declaration.hasAnnotation(StandardClassIds.Annotations.Suppress) -> {
|
||||
useRegularComponents = false
|
||||
true
|
||||
}
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
@@ -104,7 +107,7 @@ internal object FileDiagnosticRetriever : FileStructureElementDiagnosticRetrieve
|
||||
}
|
||||
|
||||
private class Visitor(
|
||||
components: List<AbstractDiagnosticCollectorComponent>,
|
||||
components: DiagnosticCollectorComponents,
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
) : LLFirDiagnosticVisitor(
|
||||
PersistentCheckerContextFactory.createEmptyPersistenceCheckerContext(
|
||||
|
||||
+2
-2
@@ -6,9 +6,9 @@
|
||||
package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics
|
||||
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.CheckerRunningDiagnosticCollectorVisitor
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.components.AbstractDiagnosticCollectorComponent
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.fir.LLFirStructureElementDiagnosticsCollector
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.DiagnosticCollectorComponents
|
||||
|
||||
internal class FileStructureElementDiagnosticsCollector private constructor(private val useExtendedCheckers: Boolean) {
|
||||
companion object {
|
||||
@@ -18,7 +18,7 @@ internal class FileStructureElementDiagnosticsCollector private constructor(priv
|
||||
|
||||
fun collectForStructureElement(
|
||||
firDeclaration: FirDeclaration,
|
||||
createVisitor: (components: List<AbstractDiagnosticCollectorComponent>) -> CheckerRunningDiagnosticCollectorVisitor,
|
||||
createVisitor: (components: DiagnosticCollectorComponents) -> CheckerRunningDiagnosticCollectorVisitor,
|
||||
): FileStructureElementDiagnosticList {
|
||||
val reporter = LLFirDiagnosticReporter()
|
||||
val collector = LLFirStructureElementDiagnosticsCollector(
|
||||
|
||||
+12
-6
@@ -8,16 +8,18 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.CheckerRunningDiagnosticCollectorVisitor
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.components.AbstractDiagnosticCollectorComponent
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkCanceled
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.DiagnosticCollectorComponents
|
||||
|
||||
internal open class LLFirDiagnosticVisitor(
|
||||
context: CheckerContext,
|
||||
components: List<AbstractDiagnosticCollectorComponent>,
|
||||
components: DiagnosticCollectorComponents,
|
||||
) : CheckerRunningDiagnosticCollectorVisitor(context, components) {
|
||||
private val beforeElementDiagnosticCollectionHandler = context.session.beforeElementDiagnosticCollectionHandler
|
||||
|
||||
protected var useRegularComponents = true
|
||||
|
||||
override fun visitNestedElements(element: FirElement) {
|
||||
if (element is FirDeclaration) {
|
||||
beforeElementDiagnosticCollectionHandler?.beforeGoingNestedDeclaration(element, context)
|
||||
@@ -26,10 +28,14 @@ internal open class LLFirDiagnosticVisitor(
|
||||
}
|
||||
|
||||
override fun checkElement(element: FirElement) {
|
||||
beforeElementDiagnosticCollectionHandler?.beforeCollectingForElement(element)
|
||||
components.forEach {
|
||||
checkCanceled()
|
||||
element.accept(it, context)
|
||||
if (useRegularComponents) {
|
||||
beforeElementDiagnosticCollectionHandler?.beforeCollectingForElement(element)
|
||||
components.regularComponents.forEach {
|
||||
checkCanceled()
|
||||
element.accept(it, context)
|
||||
}
|
||||
}
|
||||
checkCanceled()
|
||||
element.accept(components.reportCommitter, context)
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -7,18 +7,18 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.fir
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.CheckerRunningDiagnosticCollectorVisitor
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.components.AbstractDiagnosticCollectorComponent
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.AbstractLLFirDiagnosticsCollector
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.DiagnosticCollectorComponents
|
||||
|
||||
internal class LLFirStructureElementDiagnosticsCollector(
|
||||
session: FirSession,
|
||||
private val doCreateVisitor: (components: List<AbstractDiagnosticCollectorComponent>) -> CheckerRunningDiagnosticCollectorVisitor,
|
||||
private val doCreateVisitor: (components: DiagnosticCollectorComponents) -> CheckerRunningDiagnosticCollectorVisitor,
|
||||
useExtendedCheckers: Boolean,
|
||||
) : AbstractLLFirDiagnosticsCollector(
|
||||
session,
|
||||
useExtendedCheckers,
|
||||
) {
|
||||
override fun createVisitor(components: List<AbstractDiagnosticCollectorComponent>): CheckerRunningDiagnosticCollectorVisitor {
|
||||
override fun createVisitor(components: DiagnosticCollectorComponents): CheckerRunningDiagnosticCollectorVisitor {
|
||||
return doCreateVisitor(components)
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.name.StandardClassIds
|
||||
abstract class AbstractDiagnosticCollector(
|
||||
override val session: FirSession,
|
||||
override val scopeSession: ScopeSession = ScopeSession(),
|
||||
protected val createComponents: (DiagnosticReporter) -> List<AbstractDiagnosticCollectorComponent>,
|
||||
protected val createComponents: (DiagnosticReporter) -> DiagnosticCollectorComponents,
|
||||
) : SessionHolder {
|
||||
fun collectDiagnostics(firDeclaration: FirDeclaration, reporter: DiagnosticReporter) {
|
||||
val components = createComponents(reporter)
|
||||
@@ -31,7 +31,7 @@ abstract class AbstractDiagnosticCollector(
|
||||
firDeclaration.accept(visitor, null)
|
||||
}
|
||||
|
||||
protected abstract fun createVisitor(components: List<AbstractDiagnosticCollectorComponent>): CheckerRunningDiagnosticCollectorVisitor
|
||||
protected abstract fun createVisitor(components: DiagnosticCollectorComponents): CheckerRunningDiagnosticCollectorVisitor
|
||||
|
||||
companion object {
|
||||
const val SUPPRESS_ALL_INFOS = "infos"
|
||||
|
||||
+4
-5
@@ -13,19 +13,18 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
|
||||
open class CheckerRunningDiagnosticCollectorVisitor(
|
||||
context: CheckerContext,
|
||||
protected val components: List<AbstractDiagnosticCollectorComponent>
|
||||
protected val components: DiagnosticCollectorComponents
|
||||
) : AbstractDiagnosticCollectorVisitor(context) {
|
||||
|
||||
override fun checkElement(element: FirElement) {
|
||||
components.forEach {
|
||||
components.regularComponents.forEach {
|
||||
element.accept(it, context)
|
||||
}
|
||||
element.accept(components.reportCommitter, context)
|
||||
}
|
||||
|
||||
override fun onDeclarationExit(declaration: FirDeclaration) {
|
||||
if (declaration !is FirFile) return
|
||||
components.forEach {
|
||||
it.endOfFile(declaration)
|
||||
}
|
||||
components.reportCommitter.endOfFile(declaration)
|
||||
}
|
||||
}
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright 2010-2022 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.fir.analysis.collectors
|
||||
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.components.AbstractDiagnosticCollectorComponent
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.components.ReportCommitterDiagnosticComponent
|
||||
|
||||
class DiagnosticCollectorComponents(
|
||||
val regularComponents: List<AbstractDiagnosticCollectorComponent>,
|
||||
val reportCommitter: ReportCommitterDiagnosticComponent
|
||||
)
|
||||
+2
-2
@@ -15,9 +15,9 @@ import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFull
|
||||
class SimpleDiagnosticsCollector(
|
||||
session: FirSession,
|
||||
scopeSession: ScopeSession,
|
||||
createComponents: (DiagnosticReporter) -> List<AbstractDiagnosticCollectorComponent>,
|
||||
createComponents: (DiagnosticReporter) -> DiagnosticCollectorComponents,
|
||||
) : AbstractDiagnosticCollector(session, scopeSession, createComponents) {
|
||||
override fun createVisitor(components: List<AbstractDiagnosticCollectorComponent>): CheckerRunningDiagnosticCollectorVisitor {
|
||||
override fun createVisitor(components: DiagnosticCollectorComponents): CheckerRunningDiagnosticCollectorVisitor {
|
||||
return CheckerRunningDiagnosticCollectorVisitor(
|
||||
MutableCheckerContext(
|
||||
this,
|
||||
|
||||
-2
@@ -23,6 +23,4 @@ abstract class AbstractDiagnosticCollectorComponent(
|
||||
val source = element.source ?: return
|
||||
reporter.checkAndCommitReportsOn(source, context)
|
||||
}
|
||||
|
||||
open fun endOfFile(file: FirFile) {}
|
||||
}
|
||||
|
||||
+4
-3
@@ -7,17 +7,18 @@ package org.jetbrains.kotlin.fir.analysis.collectors.components
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.collectors.DiagnosticCollectorComponents
|
||||
|
||||
object DiagnosticComponentsFactory {
|
||||
fun createAllDiagnosticComponents(session: FirSession, reporter: DiagnosticReporter): List<AbstractDiagnosticCollectorComponent> {
|
||||
return listOf(
|
||||
fun createAllDiagnosticComponents(session: FirSession, reporter: DiagnosticReporter): DiagnosticCollectorComponents {
|
||||
val regularComponents = listOf(
|
||||
DeclarationCheckersDiagnosticComponent(session, reporter),
|
||||
ExpressionCheckersDiagnosticComponent(session, reporter),
|
||||
TypeCheckersDiagnosticComponent(session, reporter),
|
||||
ErrorNodeDiagnosticCollectorComponent(session, reporter),
|
||||
ControlFlowAnalysisDiagnosticComponent(session, reporter),
|
||||
ReportCommitterDiagnosticComponent(session, reporter)
|
||||
)
|
||||
return DiagnosticCollectorComponents(regularComponents, ReportCommitterDiagnosticComponent(session, reporter))
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -19,7 +19,7 @@ class ReportCommitterDiagnosticComponent(
|
||||
checkAndCommitReportsOn(element, data)
|
||||
}
|
||||
|
||||
override fun endOfFile(file: FirFile) {
|
||||
fun endOfFile(file: FirFile) {
|
||||
checkAndCommitReportsOn(file, null)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user