From 8c305d6143a4f29a7724e1cdf48a38598514a0f5 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 14 Jul 2023 18:03:30 +0200 Subject: [PATCH] K2: introduce infrastructure for LanguageVersionSettings checkers --- .../jvm/compiler/pipeline/compilerPipeline.kt | 4 ++- .../kotlin/fir/analysis/CheckersComponent.kt | 12 +++++++ .../CommonLanguageVersionSettingsCheckers.kt | 15 +++++++++ ...ExtendedLanguageVersionSettingsCheckers.kt | 13 ++++++++ .../LanguageVersionSettingsCheckers.kt | 16 +++++++++ ...ComposedLanguageVersionSettingsCheckers.kt | 23 +++++++++++++ .../FirLanguageVersionSettingsChecker.kt | 18 ++++++++++ .../FirOptInLanguageVersionSettingsChecker.kt | 13 ++++++++ .../collectors/AbstractDiagnosticCollector.kt | 9 +++-- .../AbstractDiagnosticCollectorVisitor.kt | 2 ++ ...heckerRunningDiagnosticCollectorVisitor.kt | 4 +++ .../AbstractDiagnosticCollectorComponent.kt | 3 +- .../components/DiagnosticComponentsFactory.kt | 1 + ...guageVersionSettingsDiagnosticComponent.kt | 33 +++++++++++++++++++ .../FirAdditionalCheckersExtension.kt | 2 ++ .../kotlin/fir/checkers/CheckersContainers.kt | 2 ++ .../jetbrains/kotlin/fir/pipeline/analyse.kt | 1 + .../fir/session/FirSessionConfigurator.kt | 6 ++++ .../diagnostics/DiagnosticReporterFactory.kt | 10 +++--- .../impl/BaseDiagnosticsCollector.kt | 2 ++ ...PendingDiagnosticsCollectorWithSuppress.kt | 2 +- .../impl/SimpleDiagnosticsCollector.kt | 2 +- .../SimpleDiagnosticsCollectorWithSuppress.kt | 2 +- 23 files changed, 183 insertions(+), 12 deletions(-) create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonLanguageVersionSettingsCheckers.kt create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ExtendedLanguageVersionSettingsCheckers.kt create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/LanguageVersionSettingsCheckers.kt create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/ComposedLanguageVersionSettingsCheckers.kt create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/FirLanguageVersionSettingsChecker.kt create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/FirOptInLanguageVersionSettingsChecker.kt create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/LanguageVersionSettingsDiagnosticComponent.kt diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt index 0cce9a57f24..86b5da43eb3 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt @@ -103,7 +103,9 @@ fun compileModulesUsingFrontendIrAndLightTree( ) val renderDiagnosticName = moduleConfiguration.getBoolean(CLIConfigurationKeys.RENDER_DIAGNOSTIC_INTERNAL_NAME) - val diagnosticsReporter = DiagnosticReporterFactory.createPendingReporter() + val diagnosticsReporter = DiagnosticReporterFactory.createPendingReporter { isError, message -> + messageCollector.report(if (isError) CompilerMessageSeverity.ERROR else CompilerMessageSeverity.WARNING, message) + } val compilerEnvironment = ModuleCompilerEnvironment(projectEnvironment, diagnosticsReporter) performanceManager?.notifyAnalysisStarted() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/CheckersComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/CheckersComponent.kt index eb41314eb0f..b35cabb3648 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/CheckersComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/CheckersComponent.kt @@ -9,6 +9,8 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.NoMutableState import org.jetbrains.kotlin.fir.SessionConfiguration +import org.jetbrains.kotlin.fir.analysis.checkers.LanguageVersionSettingsCheckers +import org.jetbrains.kotlin.fir.analysis.checkers.config.ComposedLanguageVersionSettingsCheckers import org.jetbrains.kotlin.fir.analysis.checkers.declaration.ComposedDeclarationCheckers import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers import org.jetbrains.kotlin.fir.analysis.checkers.expression.ComposedExpressionCheckers @@ -31,6 +33,9 @@ class CheckersComponent : FirSessionComponent { val typeCheckers: TypeCheckers get() = _typeCheckers private val _typeCheckers = ComposedTypeCheckers() + val languageVersionSettingsCheckers: LanguageVersionSettingsCheckers get() = _languageVersionSettingsCheckers + private val _languageVersionSettingsCheckers = ComposedLanguageVersionSettingsCheckers() + @SessionConfiguration @OptIn(CheckersComponentInternal::class) fun register(checkers: DeclarationCheckers) { @@ -49,11 +54,18 @@ class CheckersComponent : FirSessionComponent { _typeCheckers.register(checkers) } + @SessionConfiguration + @OptIn(CheckersComponentInternal::class) + fun register(checkers: LanguageVersionSettingsCheckers) { + _languageVersionSettingsCheckers.register(checkers) + } + @SessionConfiguration fun register(checkers: FirAdditionalCheckersExtension) { register(checkers.declarationCheckers) register(checkers.expressionCheckers) register(checkers.typeCheckers) + register(checkers.languageVersionSettingsCheckers) } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonLanguageVersionSettingsCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonLanguageVersionSettingsCheckers.kt new file mode 100644 index 00000000000..fa709f72cf1 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonLanguageVersionSettingsCheckers.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2023 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.checkers + +import org.jetbrains.kotlin.fir.analysis.checkers.config.FirLanguageVersionSettingsChecker +import org.jetbrains.kotlin.fir.analysis.checkers.config.FirOptInLanguageVersionSettingsChecker + +object CommonLanguageVersionSettingsCheckers : LanguageVersionSettingsCheckers() { + + override val languageVersionSettingsCheckers: Set + get() = setOf(FirOptInLanguageVersionSettingsChecker) +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ExtendedLanguageVersionSettingsCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ExtendedLanguageVersionSettingsCheckers.kt new file mode 100644 index 00000000000..fa01793c156 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ExtendedLanguageVersionSettingsCheckers.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2023 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.checkers + +import org.jetbrains.kotlin.fir.analysis.checkers.config.FirLanguageVersionSettingsChecker + +object ExtendedLanguageVersionSettingsCheckers : LanguageVersionSettingsCheckers() { + override val languageVersionSettingsCheckers: Set + get() = setOf() +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/LanguageVersionSettingsCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/LanguageVersionSettingsCheckers.kt new file mode 100644 index 00000000000..12b51904360 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/LanguageVersionSettingsCheckers.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2023 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.checkers + +import org.jetbrains.kotlin.fir.analysis.checkers.config.FirLanguageVersionSettingsChecker + +abstract class LanguageVersionSettingsCheckers { + companion object { + val EMPTY: LanguageVersionSettingsCheckers = object : LanguageVersionSettingsCheckers() {} + } + + open val languageVersionSettingsCheckers: Set = emptySet() +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/ComposedLanguageVersionSettingsCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/ComposedLanguageVersionSettingsCheckers.kt new file mode 100644 index 00000000000..50db9b8250f --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/ComposedLanguageVersionSettingsCheckers.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2023 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.checkers.config + +import org.jetbrains.kotlin.fir.analysis.CheckersComponentInternal +import org.jetbrains.kotlin.fir.analysis.checkers.LanguageVersionSettingsCheckers + +class ComposedLanguageVersionSettingsCheckers : LanguageVersionSettingsCheckers() { + + override val languageVersionSettingsCheckers: Set + get() = _languageVersionSettingsCheckers + + private val _languageVersionSettingsCheckers: MutableSet = mutableSetOf() + + @CheckersComponentInternal + fun register(checkers: LanguageVersionSettingsCheckers) { + _languageVersionSettingsCheckers += checkers.languageVersionSettingsCheckers + } + +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/FirLanguageVersionSettingsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/FirLanguageVersionSettingsChecker.kt new file mode 100644 index 00000000000..325c15766d2 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/FirLanguageVersionSettingsChecker.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2023 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.checkers.config + +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext + +abstract class FirLanguageVersionSettingsChecker { + /** + * This API allows us to check language version settings independently of particular code pieces. + * + * [rawReport] allows to report a diagnostic directly to a message collector. + * This function accepts isError: Boolean and message: String as parameters. + */ + abstract fun check(context: CheckerContext, rawReport: (Boolean, String) -> Unit) +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/FirOptInLanguageVersionSettingsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/FirOptInLanguageVersionSettingsChecker.kt new file mode 100644 index 00000000000..364b25f6f6b --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/FirOptInLanguageVersionSettingsChecker.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2023 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.checkers.config + +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext + +object FirOptInLanguageVersionSettingsChecker : FirLanguageVersionSettingsChecker() { + override fun check(context: CheckerContext, rawReport: (Boolean, String) -> Unit) { + } +} \ 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 e3da24154bb..2dd20e1163f 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 @@ -25,9 +25,14 @@ abstract class AbstractDiagnosticCollector( override val scopeSession: ScopeSession = ScopeSession(), protected val createComponents: (DiagnosticReporter) -> DiagnosticCollectorComponents, ) : SessionHolder { + + fun collectDiagnosticsInSettings(reporter: DiagnosticReporter) { + val visitor = createVisitor(createComponents(reporter)) + visitor.checkSettings() + } + fun collectDiagnostics(firDeclaration: FirDeclaration, reporter: DiagnosticReporter) { - val components = createComponents(reporter) - val visitor = createVisitor(components) + val visitor = createVisitor(createComponents(reporter)) session.lazyDeclarationResolver.disableLazyResolveContractChecksInside { firDeclaration.accept(visitor, null) } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/AbstractDiagnosticCollectorVisitor.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/AbstractDiagnosticCollectorVisitor.kt index cd195728daa..9696551da1b 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/AbstractDiagnosticCollectorVisitor.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/AbstractDiagnosticCollectorVisitor.kt @@ -36,6 +36,8 @@ abstract class AbstractDiagnosticCollectorVisitor( protected abstract fun checkElement(element: FirElement) + open fun checkSettings() {} + override fun visitElement(element: FirElement, data: Nothing?) { when (element) { is FirAnnotationContainer -> withAnnotationContainer(element) { 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 8c61e8d504d..1a7658cc35d 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 @@ -15,6 +15,10 @@ open class CheckerRunningDiagnosticCollectorVisitor( protected val components: DiagnosticCollectorComponents ) : AbstractDiagnosticCollectorVisitor(context) { + override fun checkSettings() { + components.regularComponents.forEach { it.checkSettings(context) } + } + override fun checkElement(element: FirElement) { components.regularComponents.forEach { element.accept(it, context) 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 133bf5de13c..db5645553b6 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 @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.visitors.FirVisitor abstract class AbstractDiagnosticCollectorComponent( @@ -19,6 +18,8 @@ abstract class AbstractDiagnosticCollectorComponent( ) : FirVisitor() { override fun visitElement(element: FirElement, data: CheckerContext) {} + open fun checkSettings(data: CheckerContext) {} + protected fun checkAndCommitReportsOn(element: FirElement, context: DiagnosticContext?) { val source = element.source ?: return reporter.checkAndCommitReportsOn(source, context) 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 8289c8a7588..250aa51c364 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 @@ -17,6 +17,7 @@ object DiagnosticComponentsFactory { TypeCheckersDiagnosticComponent(session, reporter), ErrorNodeDiagnosticCollectorComponent(session, reporter), ControlFlowAnalysisDiagnosticComponent(session, reporter), + LanguageVersionSettingsDiagnosticComponent(session, reporter) ) return DiagnosticCollectorComponents(regularComponents, ReportCommitterDiagnosticComponent(session, reporter)) } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/LanguageVersionSettingsDiagnosticComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/LanguageVersionSettingsDiagnosticComponent.kt new file mode 100644 index 00000000000..95a02c9c687 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/LanguageVersionSettingsDiagnosticComponent.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2023 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.components + +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.analysis.CheckersComponentInternal +import org.jetbrains.kotlin.fir.analysis.checkers.LanguageVersionSettingsCheckers +import org.jetbrains.kotlin.fir.analysis.checkers.config.FirLanguageVersionSettingsChecker +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkersComponent + +@OptIn(CheckersComponentInternal::class) +class LanguageVersionSettingsDiagnosticComponent( + session: FirSession, + reporter: DiagnosticReporter, + private val checkers: LanguageVersionSettingsCheckers = session.checkersComponent.languageVersionSettingsCheckers, +) : AbstractDiagnosticCollectorComponent(session, reporter) { + override fun checkSettings(data: CheckerContext) { + checkers.languageVersionSettingsCheckers.check(data) + } + + private fun Collection.check(context: CheckerContext) { + val rawReport = (reporter as? BaseDiagnosticsCollector)?.rawReport ?: return + for (checker in this) { + checker.check(context, rawReport) + } + } +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/extensions/FirAdditionalCheckersExtension.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/extensions/FirAdditionalCheckersExtension.kt index 5160240b623..1dd9dda793b 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/extensions/FirAdditionalCheckersExtension.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/extensions/FirAdditionalCheckersExtension.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.analysis.extensions import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.analysis.checkers.LanguageVersionSettingsCheckers import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers import org.jetbrains.kotlin.fir.analysis.checkers.type.TypeCheckers @@ -22,6 +23,7 @@ abstract class FirAdditionalCheckersExtension(session: FirSession) : FirExtensio open val declarationCheckers: DeclarationCheckers = DeclarationCheckers.EMPTY open val expressionCheckers: ExpressionCheckers = ExpressionCheckers.EMPTY open val typeCheckers: TypeCheckers = TypeCheckers.EMPTY + open val languageVersionSettingsCheckers: LanguageVersionSettingsCheckers = LanguageVersionSettingsCheckers.EMPTY final override val name: FirExtensionPointName get() = NAME diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt index 84466e490de..603b55f5ab6 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt @@ -19,12 +19,14 @@ fun FirSessionConfigurator.registerCommonCheckers() { useCheckers(CommonDeclarationCheckers) useCheckers(CommonExpressionCheckers) useCheckers(CommonTypeCheckers) + useCheckers(CommonLanguageVersionSettingsCheckers) } fun FirSessionConfigurator.registerExtendedCommonCheckers() { useCheckers(ExtendedExpressionCheckers) useCheckers(ExtendedDeclarationCheckers) useCheckers(ExtendedTypeCheckers) + useCheckers(ExtendedLanguageVersionSettingsCheckers) } fun FirSessionConfigurator.registerJvmCheckers() { diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/analyse.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/analyse.kt index 6b6487b61dd..3ee244844e8 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/analyse.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/analyse.kt @@ -21,6 +21,7 @@ fun FirSession.runResolution(firFiles: List): Pair, reporter: DiagnosticReporter) { val collector = FirDiagnosticsCollector.create(this, scopeSession) + collector.collectDiagnosticsInSettings(reporter) for (file in firFiles) { withFileAnalysisExceptionWrapping(file) { collector.collectDiagnostics(file, reporter) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionConfigurator.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionConfigurator.kt index f90e3ec4ca0..17f82455d26 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionConfigurator.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionConfigurator.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.session import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.SessionConfiguration +import org.jetbrains.kotlin.fir.analysis.checkers.LanguageVersionSettingsCheckers import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers import org.jetbrains.kotlin.fir.analysis.checkers.type.TypeCheckers @@ -36,6 +37,11 @@ class FirSessionConfigurator(private val session: FirSession) { session.checkersComponent.register(checkers) } + @OptIn(SessionConfiguration::class) + fun useCheckers(checkers: LanguageVersionSettingsCheckers) { + session.checkersComponent.register(checkers) + } + @OptIn(PluginServicesInitialization::class) @SessionConfiguration fun configure() { diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/DiagnosticReporterFactory.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/DiagnosticReporterFactory.kt index 050f1e6b2cb..397a4f7c76f 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/DiagnosticReporterFactory.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/DiagnosticReporterFactory.kt @@ -11,14 +11,14 @@ import org.jetbrains.kotlin.diagnostics.impl.SimpleDiagnosticsCollector import org.jetbrains.kotlin.diagnostics.impl.SimpleDiagnosticsCollectorWithSuppress object DiagnosticReporterFactory { - fun createReporter(disableSuppress: Boolean = false): BaseDiagnosticsCollector { + fun createReporter(rawReport: (Boolean, String) -> Unit = { _, _ -> }, disableSuppress: Boolean = false): BaseDiagnosticsCollector { return if (disableSuppress) { - SimpleDiagnosticsCollector() + SimpleDiagnosticsCollector(rawReport) } else { - SimpleDiagnosticsCollectorWithSuppress() + SimpleDiagnosticsCollectorWithSuppress(rawReport) } } - fun createPendingReporter(): PendingDiagnosticsCollectorWithSuppress = - PendingDiagnosticsCollectorWithSuppress() + fun createPendingReporter(rawReport: (Boolean, String) -> Unit = { _, _ -> }): PendingDiagnosticsCollectorWithSuppress = + PendingDiagnosticsCollectorWithSuppress(rawReport) } \ No newline at end of file diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/BaseDiagnosticsCollector.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/BaseDiagnosticsCollector.kt index 8ed5c055f9b..935de078b90 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/BaseDiagnosticsCollector.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/BaseDiagnosticsCollector.kt @@ -12,4 +12,6 @@ abstract class BaseDiagnosticsCollector : DiagnosticReporter() { abstract val diagnostics: List abstract val diagnosticsByFilePath: Map> abstract val hasErrors: Boolean + + abstract val rawReport: (Boolean, String) -> Unit } diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/PendingDiagnosticsCollectorWithSuppress.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/PendingDiagnosticsCollectorWithSuppress.kt index 4ce19c410a9..480ba716f4c 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/PendingDiagnosticsCollectorWithSuppress.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/PendingDiagnosticsCollectorWithSuppress.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticContext import org.jetbrains.kotlin.diagnostics.KtDiagnostic import org.jetbrains.kotlin.diagnostics.Severity -class PendingDiagnosticsCollectorWithSuppress : BaseDiagnosticsCollector() { +class PendingDiagnosticsCollectorWithSuppress(override val rawReport: (Boolean, String) -> Unit) : BaseDiagnosticsCollector() { private val pendingDiagnosticsByFilePath: MutableMap> = mutableMapOf() private val _diagnosticsByFilePath: MutableMap> = mutableMapOf() override val diagnostics: List diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticsCollector.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticsCollector.kt index 00c4ed550dd..2e28cba9f67 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticsCollector.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticsCollector.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticContext import org.jetbrains.kotlin.diagnostics.KtDiagnostic import org.jetbrains.kotlin.diagnostics.Severity -class SimpleDiagnosticsCollector : BaseDiagnosticsCollector() { +class SimpleDiagnosticsCollector(override val rawReport: (Boolean, String) -> Unit = { _, _ -> }) : BaseDiagnosticsCollector() { private val _diagnosticsByFilePath: MutableMap> = mutableMapOf() override val diagnostics: List get() = _diagnosticsByFilePath.flatMap { it.value } diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticsCollectorWithSuppress.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticsCollectorWithSuppress.kt index 7e8b0b01734..117ddab9a09 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticsCollectorWithSuppress.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/impl/SimpleDiagnosticsCollectorWithSuppress.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticContext import org.jetbrains.kotlin.diagnostics.KtDiagnostic import org.jetbrains.kotlin.diagnostics.Severity -class SimpleDiagnosticsCollectorWithSuppress : BaseDiagnosticsCollector() { +class SimpleDiagnosticsCollectorWithSuppress(override val rawReport: (Boolean, String) -> Unit) : BaseDiagnosticsCollector() { private val _diagnosticsByFilePath: MutableMap> = mutableMapOf() override val diagnostics: List get() = _diagnosticsByFilePath.flatMap { it.value }