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 86b5da43eb3..da4f8e88bc7 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 @@ -41,14 +41,16 @@ import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.constant.EvaluatedConstTracker -import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory +import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar -import org.jetbrains.kotlin.fir.pipeline.* +import org.jetbrains.kotlin.fir.pipeline.FirResult +import org.jetbrains.kotlin.fir.pipeline.buildResolveAndCheckFirViaLightTree +import org.jetbrains.kotlin.fir.pipeline.convertToIrAndActualizeForJvm import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.session.IncrementalCompilationContext import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment @@ -256,7 +258,7 @@ fun compileModuleToAnalyzedFir( environment: ModuleCompilerEnvironment, previousStepsSymbolProviders: List, incrementalExcludesScope: AbstractProjectFileSearchScope?, - diagnosticsReporter: DiagnosticReporter, + diagnosticsReporter: BaseDiagnosticsCollector, performanceManager: CommonCompilerPerformanceManager? ): FirResult { val projectEnvironment = environment.projectEnvironment 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 3ee244844e8..63f99a60aba 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 @@ -5,7 +5,8 @@ package org.jetbrains.kotlin.fir.pipeline -import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.KtDiagnostic +import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.analysis.collectors.FirDiagnosticsCollector import org.jetbrains.kotlin.fir.declarations.FirFile @@ -19,7 +20,11 @@ fun FirSession.runResolution(firFiles: List): Pair, reporter: DiagnosticReporter) { +fun FirSession.runCheckers( + scopeSession: ScopeSession, + firFiles: List, + reporter: BaseDiagnosticsCollector +): Map> { val collector = FirDiagnosticsCollector.create(this, scopeSession) collector.collectDiagnosticsInSettings(reporter) for (file in firFiles) { @@ -27,4 +32,8 @@ fun FirSession.runCheckers(scopeSession: ScopeSession, firFiles: List, collector.collectDiagnostics(file, reporter) } } + return firFiles.associateWith { + val path = it.sourceFile?.path ?: return@associateWith emptyList() + reporter.diagnosticsByFilePath[path] ?: emptyList() + } } diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/firUtils.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/firUtils.kt index 38c1630faa0..38793e8be3e 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/firUtils.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/firUtils.kt @@ -66,7 +66,7 @@ fun buildResolveAndCheckFirFromKtFiles( fun resolveAndCheckFir( session: FirSession, firFiles: List, - diagnosticsReporter: DiagnosticReporter + diagnosticsReporter: BaseDiagnosticsCollector ): ModuleCompilerAnalyzedOutput { val (scopeSession, fir) = session.runResolution(firFiles) session.runCheckers(scopeSession, fir, diagnosticsReporter) @@ -76,7 +76,7 @@ fun resolveAndCheckFir( fun buildResolveAndCheckFirViaLightTree( session: FirSession, ktFiles: Collection, - diagnosticsReporter: DiagnosticReporter, + diagnosticsReporter: BaseDiagnosticsCollector, countFilesAndLines: KFunction2? ): ModuleCompilerAnalyzedOutput { val firFiles = session.buildFirViaLightTree(ktFiles, diagnosticsReporter, countFilesAndLines) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirLazyDeclarationResolver.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirLazyDeclarationResolver.kt index c88aedda2b6..7a6e1e62c00 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirLazyDeclarationResolver.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirLazyDeclarationResolver.kt @@ -30,11 +30,11 @@ abstract class FirLazyDeclarationResolver : FirSessionComponent { lazyResolveContractChecksEnabled = false } - inline fun disableLazyResolveContractChecksInside(action: () -> Unit) { + inline fun disableLazyResolveContractChecksInside(action: () -> T): T { val current = lazyResolveContractChecksEnabled lazyResolveContractChecksEnabled = false try { - action() + return action() } finally { lazyResolveContractChecksEnabled = current } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt index 3589b343b23..7c7af5dccc3 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.lazyDeclarationResolver import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid import org.jetbrains.kotlin.name.FqNameUnsafe @@ -80,9 +81,11 @@ class FirDiagnosticsHandler(testServices: TestServices) : FirAnalysisHandler(tes override fun processModule(module: TestModule, info: FirOutputArtifact) { for (part in info.partsForDependsOnModules) { - val diagnosticsPerFile = part.firAnalyzerFacade.runCheckers() - val currentModule = part.module + val firAnalyzerFacade = part.firAnalyzerFacade + val lazyDeclarationResolver = firAnalyzerFacade.result.outputs.single().session.lazyDeclarationResolver + val diagnosticsPerFile = lazyDeclarationResolver.disableLazyResolveContractChecksInside { firAnalyzerFacade.runCheckers() } + val currentModule = part.module val lightTreeComparingModeEnabled = FirDiagnosticsDirectives.COMPARE_WITH_LIGHT_TREE in currentModule.directives val lightTreeEnabled = currentModule.directives.singleValue(FirDiagnosticsDirectives.FIR_PARSER) == FirParser.LightTree val forceRenderArguments = FirDiagnosticsDirectives.RENDER_DIAGNOSTICS_MESSAGES in currentModule.directives diff --git a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt index e1f524ab834..947e39cb765 100644 --- a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt +++ b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt @@ -9,17 +9,17 @@ import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.diagnostics.KtDiagnostic -import org.jetbrains.kotlin.fir.analysis.collectors.FirDiagnosticsCollector import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter import org.jetbrains.kotlin.fir.builder.PsiRawFirBuilder import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.pipeline.ModuleCompilerAnalyzedOutput +import org.jetbrains.kotlin.fir.pipeline.runCheckers +import org.jetbrains.kotlin.fir.pipeline.runResolution import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl -import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveProcessor import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.sourceFiles.LightTreeFile @@ -79,25 +79,14 @@ class FirAnalyzerFacade( override fun runResolution(): List { if (firFiles == null) buildRawFir() if (_scopeSession != null) return firFiles!! - val resolveProcessor = FirTotalResolveProcessor(session) - resolveProcessor.process(firFiles!!) - _scopeSession = resolveProcessor.scopeSession + _scopeSession = session.runResolution(firFiles!!).first return firFiles!! } override fun runCheckers(): Map> { if (_scopeSession == null) runResolution() if (collectedDiagnostics != null) return collectedDiagnostics!! - val collector = FirDiagnosticsCollector.create(session, scopeSession) - collectedDiagnostics = buildMap { - for (file in firFiles!!) { - withFileAnalysisExceptionWrapping(file) { - val reporter = DiagnosticReporterFactory.createPendingReporter() - collector.collectDiagnostics(file, reporter) - put(file, reporter.diagnostics) - } - } - } + collectedDiagnostics = session.runCheckers(scopeSession, firFiles!!, DiagnosticReporterFactory.createPendingReporter()) return collectedDiagnostics!! }