From 78da5907c84d4a944c94ae6c752e45c162417766 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 21 Jul 2022 15:21:27 +0200 Subject: [PATCH] K2 checkers: separate report committer from other diagnostic components --- .../AbstractFirIdeDiagnosticsCollector.kt | 7 ++++--- .../FileStructureElementDiagnosticRetriever.kt | 11 +++++++---- ...FileStructureElementDiagnosticsCollector.kt | 4 ++-- .../fir/diagnostics/LLFirDiagnosticVisitor.kt | 18 ++++++++++++------ ...LFirStructureElementDiagnosticsCollector.kt | 6 +++--- .../collectors/AbstractDiagnosticCollector.kt | 4 ++-- ...CheckerRunningDiagnosticCollectorVisitor.kt | 9 ++++----- .../DiagnosticCollectorComponents.kt | 14 ++++++++++++++ .../collectors/SimpleDiagnosticsCollector.kt | 4 ++-- .../AbstractDiagnosticCollectorComponent.kt | 2 -- .../components/DiagnosticComponentsFactory.kt | 7 ++++--- .../ReportCommiterDiagnosticComponent.kt | 2 +- 12 files changed, 55 insertions(+), 33 deletions(-) create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/DiagnosticCollectorComponents.kt diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/AbstractFirIdeDiagnosticsCollector.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/AbstractFirIdeDiagnosticsCollector.kt index 21e27a318ed..eed64f7477c 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/AbstractFirIdeDiagnosticsCollector.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/AbstractFirIdeDiagnosticsCollector.kt @@ -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 { + ): 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)) } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/FileStructureElementDiagnosticRetriever.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/FileStructureElementDiagnosticRetriever.kt index 83c9789222e..14a4c0bcd6d 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/FileStructureElementDiagnosticRetriever.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/FileStructureElementDiagnosticRetriever.kt @@ -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 + 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, + components: DiagnosticCollectorComponents, moduleComponents: LLFirModuleResolveComponents, ) : LLFirDiagnosticVisitor( PersistentCheckerContextFactory.createEmptyPersistenceCheckerContext( diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/FileStructureElementDiagnosticsCollector.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/FileStructureElementDiagnosticsCollector.kt index bda622fbcfd..ae54ed253fa 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/FileStructureElementDiagnosticsCollector.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/FileStructureElementDiagnosticsCollector.kt @@ -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) -> CheckerRunningDiagnosticCollectorVisitor, + createVisitor: (components: DiagnosticCollectorComponents) -> CheckerRunningDiagnosticCollectorVisitor, ): FileStructureElementDiagnosticList { val reporter = LLFirDiagnosticReporter() val collector = LLFirStructureElementDiagnosticsCollector( diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/LLFirDiagnosticVisitor.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/LLFirDiagnosticVisitor.kt index 79747f80c7a..f44501261ea 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/LLFirDiagnosticVisitor.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/LLFirDiagnosticVisitor.kt @@ -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, + 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) } } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/fir/LLFirStructureElementDiagnosticsCollector.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/fir/LLFirStructureElementDiagnosticsCollector.kt index c744d4c7e0a..2371e4c0039 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/fir/LLFirStructureElementDiagnosticsCollector.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/fir/LLFirStructureElementDiagnosticsCollector.kt @@ -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) -> CheckerRunningDiagnosticCollectorVisitor, + private val doCreateVisitor: (components: DiagnosticCollectorComponents) -> CheckerRunningDiagnosticCollectorVisitor, useExtendedCheckers: Boolean, ) : AbstractLLFirDiagnosticsCollector( session, useExtendedCheckers, ) { - override fun createVisitor(components: List): CheckerRunningDiagnosticCollectorVisitor { + override fun createVisitor(components: DiagnosticCollectorComponents): CheckerRunningDiagnosticCollectorVisitor { return doCreateVisitor(components) } } \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/AbstractDiagnosticCollector.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/AbstractDiagnosticCollector.kt index 7ab8a4c40ba..89fc61bad5f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/AbstractDiagnosticCollector.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/AbstractDiagnosticCollector.kt @@ -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, + 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): CheckerRunningDiagnosticCollectorVisitor + protected abstract fun createVisitor(components: DiagnosticCollectorComponents): CheckerRunningDiagnosticCollectorVisitor companion object { const val SUPPRESS_ALL_INFOS = "infos" diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/CheckerRunningDiagnosticCollectorVisitor.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/CheckerRunningDiagnosticCollectorVisitor.kt index 6f2d15fdcba..7a0b0c6d7ee 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/CheckerRunningDiagnosticCollectorVisitor.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/CheckerRunningDiagnosticCollectorVisitor.kt @@ -13,19 +13,18 @@ import org.jetbrains.kotlin.fir.declarations.FirFile open class CheckerRunningDiagnosticCollectorVisitor( context: CheckerContext, - protected val components: List + 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) } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/DiagnosticCollectorComponents.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/DiagnosticCollectorComponents.kt new file mode 100644 index 00000000000..0b0f664a96d --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/DiagnosticCollectorComponents.kt @@ -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, + val reportCommitter: ReportCommitterDiagnosticComponent +) \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/SimpleDiagnosticsCollector.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/SimpleDiagnosticsCollector.kt index 6f087569674..d4e1d341ead 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/SimpleDiagnosticsCollector.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/SimpleDiagnosticsCollector.kt @@ -15,9 +15,9 @@ import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFull class SimpleDiagnosticsCollector( session: FirSession, scopeSession: ScopeSession, - createComponents: (DiagnosticReporter) -> List, + createComponents: (DiagnosticReporter) -> DiagnosticCollectorComponents, ) : AbstractDiagnosticCollector(session, scopeSession, createComponents) { - override fun createVisitor(components: List): CheckerRunningDiagnosticCollectorVisitor { + override fun createVisitor(components: DiagnosticCollectorComponents): CheckerRunningDiagnosticCollectorVisitor { return CheckerRunningDiagnosticCollectorVisitor( MutableCheckerContext( this, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/AbstractDiagnosticCollectorComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/AbstractDiagnosticCollectorComponent.kt index 25ba5f77029..133bf5de13c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/AbstractDiagnosticCollectorComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/AbstractDiagnosticCollectorComponent.kt @@ -23,6 +23,4 @@ abstract class AbstractDiagnosticCollectorComponent( val source = element.source ?: return reporter.checkAndCommitReportsOn(source, context) } - - open fun endOfFile(file: FirFile) {} } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DiagnosticComponentsFactory.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DiagnosticComponentsFactory.kt index 3c5263d827c..8289c8a7588 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DiagnosticComponentsFactory.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DiagnosticComponentsFactory.kt @@ -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 { - 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)) } } \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ReportCommiterDiagnosticComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ReportCommiterDiagnosticComponent.kt index 2d34c21e3fa..482f92b56a8 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ReportCommiterDiagnosticComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ReportCommiterDiagnosticComponent.kt @@ -19,7 +19,7 @@ class ReportCommitterDiagnosticComponent( checkAndCommitReportsOn(element, data) } - override fun endOfFile(file: FirFile) { + fun endOfFile(file: FirFile) { checkAndCommitReportsOn(file, null) } } \ No newline at end of file