[Test] Reuse runResolution and runCheckers from analyze.kt

This commit is contained in:
Ivan Kylchik
2023-07-14 16:00:38 +02:00
committed by Space Team
parent d4a7b7a1f6
commit 34f8228441
6 changed files with 29 additions and 26 deletions
@@ -41,14 +41,16 @@ import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.constant.EvaluatedConstTracker
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory 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.Fir2IrConfiguration
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension
import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar 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.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.session.IncrementalCompilationContext import org.jetbrains.kotlin.fir.session.IncrementalCompilationContext
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
@@ -256,7 +258,7 @@ fun compileModuleToAnalyzedFir(
environment: ModuleCompilerEnvironment, environment: ModuleCompilerEnvironment,
previousStepsSymbolProviders: List<FirSymbolProvider>, previousStepsSymbolProviders: List<FirSymbolProvider>,
incrementalExcludesScope: AbstractProjectFileSearchScope?, incrementalExcludesScope: AbstractProjectFileSearchScope?,
diagnosticsReporter: DiagnosticReporter, diagnosticsReporter: BaseDiagnosticsCollector,
performanceManager: CommonCompilerPerformanceManager? performanceManager: CommonCompilerPerformanceManager?
): FirResult { ): FirResult {
val projectEnvironment = environment.projectEnvironment val projectEnvironment = environment.projectEnvironment
@@ -5,7 +5,8 @@
package org.jetbrains.kotlin.fir.pipeline 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.FirSession
import org.jetbrains.kotlin.fir.analysis.collectors.FirDiagnosticsCollector import org.jetbrains.kotlin.fir.analysis.collectors.FirDiagnosticsCollector
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
@@ -19,7 +20,11 @@ fun FirSession.runResolution(firFiles: List<FirFile>): Pair<ScopeSession, List<F
return resolveProcessor.scopeSession to firFiles return resolveProcessor.scopeSession to firFiles
} }
fun FirSession.runCheckers(scopeSession: ScopeSession, firFiles: List<FirFile>, reporter: DiagnosticReporter) { fun FirSession.runCheckers(
scopeSession: ScopeSession,
firFiles: List<FirFile>,
reporter: BaseDiagnosticsCollector
): Map<FirFile, List<KtDiagnostic>> {
val collector = FirDiagnosticsCollector.create(this, scopeSession) val collector = FirDiagnosticsCollector.create(this, scopeSession)
collector.collectDiagnosticsInSettings(reporter) collector.collectDiagnosticsInSettings(reporter)
for (file in firFiles) { for (file in firFiles) {
@@ -27,4 +32,8 @@ fun FirSession.runCheckers(scopeSession: ScopeSession, firFiles: List<FirFile>,
collector.collectDiagnostics(file, reporter) collector.collectDiagnostics(file, reporter)
} }
} }
return firFiles.associateWith {
val path = it.sourceFile?.path ?: return@associateWith emptyList()
reporter.diagnosticsByFilePath[path] ?: emptyList()
}
} }
@@ -66,7 +66,7 @@ fun buildResolveAndCheckFirFromKtFiles(
fun resolveAndCheckFir( fun resolveAndCheckFir(
session: FirSession, session: FirSession,
firFiles: List<FirFile>, firFiles: List<FirFile>,
diagnosticsReporter: DiagnosticReporter diagnosticsReporter: BaseDiagnosticsCollector
): ModuleCompilerAnalyzedOutput { ): ModuleCompilerAnalyzedOutput {
val (scopeSession, fir) = session.runResolution(firFiles) val (scopeSession, fir) = session.runResolution(firFiles)
session.runCheckers(scopeSession, fir, diagnosticsReporter) session.runCheckers(scopeSession, fir, diagnosticsReporter)
@@ -76,7 +76,7 @@ fun resolveAndCheckFir(
fun buildResolveAndCheckFirViaLightTree( fun buildResolveAndCheckFirViaLightTree(
session: FirSession, session: FirSession,
ktFiles: Collection<KtSourceFile>, ktFiles: Collection<KtSourceFile>,
diagnosticsReporter: DiagnosticReporter, diagnosticsReporter: BaseDiagnosticsCollector,
countFilesAndLines: KFunction2<Int, Int, Unit>? countFilesAndLines: KFunction2<Int, Int, Unit>?
): ModuleCompilerAnalyzedOutput { ): ModuleCompilerAnalyzedOutput {
val firFiles = session.buildFirViaLightTree(ktFiles, diagnosticsReporter, countFilesAndLines) val firFiles = session.buildFirViaLightTree(ktFiles, diagnosticsReporter, countFilesAndLines)
@@ -30,11 +30,11 @@ abstract class FirLazyDeclarationResolver : FirSessionComponent {
lazyResolveContractChecksEnabled = false lazyResolveContractChecksEnabled = false
} }
inline fun disableLazyResolveContractChecksInside(action: () -> Unit) { inline fun <T> disableLazyResolveContractChecksInside(action: () -> T): T {
val current = lazyResolveContractChecksEnabled val current = lazyResolveContractChecksEnabled
lazyResolveContractChecksEnabled = false lazyResolveContractChecksEnabled = false
try { try {
action() return action()
} finally { } finally {
lazyResolveContractChecksEnabled = current lazyResolveContractChecksEnabled = current
} }
@@ -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.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol 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.types.*
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid
import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.FqNameUnsafe
@@ -80,9 +81,11 @@ class FirDiagnosticsHandler(testServices: TestServices) : FirAnalysisHandler(tes
override fun processModule(module: TestModule, info: FirOutputArtifact) { override fun processModule(module: TestModule, info: FirOutputArtifact) {
for (part in info.partsForDependsOnModules) { for (part in info.partsForDependsOnModules) {
val diagnosticsPerFile = part.firAnalyzerFacade.runCheckers() val firAnalyzerFacade = part.firAnalyzerFacade
val currentModule = part.module 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 lightTreeComparingModeEnabled = FirDiagnosticsDirectives.COMPARE_WITH_LIGHT_TREE in currentModule.directives
val lightTreeEnabled = currentModule.directives.singleValue(FirDiagnosticsDirectives.FIR_PARSER) == FirParser.LightTree val lightTreeEnabled = currentModule.directives.singleValue(FirDiagnosticsDirectives.FIR_PARSER) == FirParser.LightTree
val forceRenderArguments = FirDiagnosticsDirectives.RENDER_DIAGNOSTICS_MESSAGES in currentModule.directives val forceRenderArguments = FirDiagnosticsDirectives.RENDER_DIAGNOSTICS_MESSAGES in currentModule.directives
@@ -9,17 +9,17 @@ import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.diagnostics.KtDiagnostic 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.*
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
import org.jetbrains.kotlin.fir.builder.PsiRawFirBuilder import org.jetbrains.kotlin.fir.builder.PsiRawFirBuilder
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
import org.jetbrains.kotlin.fir.pipeline.ModuleCompilerAnalyzedOutput 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.ScopeSession
import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.resolve.providers.firProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl 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.ir.backend.jvm.serialization.JvmIrMangler
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.sourceFiles.LightTreeFile import org.jetbrains.kotlin.sourceFiles.LightTreeFile
@@ -79,25 +79,14 @@ class FirAnalyzerFacade(
override fun runResolution(): List<FirFile> { override fun runResolution(): List<FirFile> {
if (firFiles == null) buildRawFir() if (firFiles == null) buildRawFir()
if (_scopeSession != null) return firFiles!! if (_scopeSession != null) return firFiles!!
val resolveProcessor = FirTotalResolveProcessor(session) _scopeSession = session.runResolution(firFiles!!).first
resolveProcessor.process(firFiles!!)
_scopeSession = resolveProcessor.scopeSession
return firFiles!! return firFiles!!
} }
override fun runCheckers(): Map<FirFile, List<KtDiagnostic>> { override fun runCheckers(): Map<FirFile, List<KtDiagnostic>> {
if (_scopeSession == null) runResolution() if (_scopeSession == null) runResolution()
if (collectedDiagnostics != null) return collectedDiagnostics!! if (collectedDiagnostics != null) return collectedDiagnostics!!
val collector = FirDiagnosticsCollector.create(session, scopeSession) collectedDiagnostics = session.runCheckers(scopeSession, firFiles!!, DiagnosticReporterFactory.createPendingReporter())
collectedDiagnostics = buildMap {
for (file in firFiles!!) {
withFileAnalysisExceptionWrapping(file) {
val reporter = DiagnosticReporterFactory.createPendingReporter()
collector.collectDiagnostics(file, reporter)
put(file, reporter.diagnostics)
}
}
}
return collectedDiagnostics!! return collectedDiagnostics!!
} }