From f6dabafe34516f3537bf496188a3d517e5b25698 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 28 May 2020 12:41:46 +0300 Subject: [PATCH] [FIR] Make creating of resolve processors type safe Also get rid of `CompilerMode` enum --- .../FirResolveModularizedTotalKotlinTest.kt | 4 +-- .../transformers/FirTotalResolveProcessor.kt | 31 ++++++++++++------- .../resolve/transformers/ResolvePhaseUtils.kt | 28 ++++++++++------- .../kotlin/fir/AbstractFirDiagnosticTest.kt | 5 ++- .../AbstractFirOldFrontendDiagnosticsTest.kt | 5 ++- 5 files changed, 42 insertions(+), 31 deletions(-) diff --git a/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/FirResolveModularizedTotalKotlinTest.kt b/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/FirResolveModularizedTotalKotlinTest.kt index 8a09c34e81c..41e3acddc18 100644 --- a/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/FirResolveModularizedTotalKotlinTest.kt +++ b/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/FirResolveModularizedTotalKotlinTest.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.dump.MultiModuleHtmlFirDump import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl -import org.jetbrains.kotlin.fir.resolve.transformers.createAllResolveProcessors +import org.jetbrains.kotlin.fir.resolve.transformers.createAllCompilerResolveProcessors import org.jetbrains.kotlin.fir.scopes.ProcessorAction import java.io.File import java.io.FileOutputStream @@ -55,7 +55,7 @@ class FirResolveModularizedTotalKotlinTest : AbstractModularizedTest() { .uniteWith(TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(project)) val librariesScope = ProjectScope.getLibrariesScope(project) val session = createSession(environment, scope, librariesScope, moduleData.qualifiedName) - val processors = createAllResolveProcessors(session) + val processors = createAllCompilerResolveProcessors(session) val firProvider = session.firProvider as FirProviderImpl val firFiles = if (useLightTree) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTotalResolveProcessor.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTotalResolveProcessor.kt index a4535962163..d10798379b2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTotalResolveProcessor.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTotalResolveProcessor.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession class FirTotalResolveProcessor(session: FirSession) { val scopeSession: ScopeSession = ScopeSession() - private val processors: List = createAllResolveProcessors(session, scopeSession) + private val processors: List = createAllCompilerResolveProcessors(session, scopeSession) fun process(files: List) { for (processor in processors) { @@ -31,22 +31,31 @@ class FirTotalResolveProcessor(session: FirSession) { } } -fun createAllResolveProcessors( +fun createAllCompilerResolveProcessors( session: FirSession, - scopeSession: ScopeSession? = null, - mode: CompilerMode = CompilerMode.CLI + scopeSession: ScopeSession? = null ): List { - @Suppress("NAME_SHADOWING") - val scopeSession = scopeSession ?: ScopeSession() - return FirResolvePhase.values() - .drop(1) // to remove RAW_FIR phase - .map { it.createProcessorByPhase(session, scopeSession, mode) } + return createAllResolveProcessors(scopeSession) { + createCompilerProcessorByPhase(session, it) + } } fun createAllTransformerBasedResolveProcessors( session: FirSession, scopeSession: ScopeSession? = null, ): List { - @Suppress("UNCHECKED_CAST") - return createAllResolveProcessors(session, scopeSession, CompilerMode.IDE) as List + return createAllResolveProcessors(scopeSession) { + createTransformerBasedProcessorByPhase(session, it) + } +} + +private inline fun createAllResolveProcessors( + scopeSession: ScopeSession? = null, + creator: FirResolvePhase.(ScopeSession) -> T +): List { + @Suppress("NAME_SHADOWING") + val scopeSession = scopeSession ?: ScopeSession() + return FirResolvePhase.values() + .drop(1) // to remove RAW_FIR phase + .map { it.creator(scopeSession) } } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt index 454123f09ff..a7f86c0e19c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt @@ -16,10 +16,9 @@ import org.jetbrains.kotlin.fir.resolve.transformers.plugin.FirGlobalExtensionSt import org.jetbrains.kotlin.fir.resolve.transformers.plugin.FirPluginAnnotationsResolveProcessor import org.jetbrains.kotlin.fir.resolve.transformers.plugin.FirTransformerBasedExtensionStatusProcessor -fun FirResolvePhase.createProcessorByPhase( +fun FirResolvePhase.createCompilerProcessorByPhase( session: FirSession, - scopeSession: ScopeSession, - compilerMode: CompilerMode = CompilerMode.CLI + scopeSession: ScopeSession ): FirResolveProcessor { return when (this) { RAW_FIR -> throw IllegalStateException("Raw FIR building phase does not have a transformer") @@ -29,10 +28,7 @@ fun FirResolvePhase.createProcessorByPhase( SUPER_TYPES -> FirSupertypeResolverProcessor(session, scopeSession) SEALED_CLASS_INHERITORS -> FirSealedClassInheritorsProcessor(session, scopeSession) TYPES -> FirTypeResolveProcessor(session, scopeSession) - EXTENSION_STATUS_UPDATE -> when (compilerMode) { - CompilerMode.CLI -> FirGlobalExtensionStatusProcessor(session, scopeSession) - CompilerMode.IDE -> FirTransformerBasedExtensionStatusProcessor(session, scopeSession) - } + EXTENSION_STATUS_UPDATE -> FirGlobalExtensionStatusProcessor(session, scopeSession) STATUS -> FirStatusResolveProcessor(session, scopeSession) CONTRACTS -> FirContractResolveProcessor(session, scopeSession) IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveProcessor(session, scopeSession) @@ -41,9 +37,17 @@ fun FirResolvePhase.createProcessorByPhase( } fun FirResolvePhase.createTransformerBasedProcessorByPhase(session: FirSession, scopeSession: ScopeSession): FirTransformerBasedResolveProcessor { - return createProcessorByPhase(session, scopeSession, CompilerMode.IDE) as FirTransformerBasedResolveProcessor + return when (this) { + RAW_FIR -> throw IllegalStateException("Raw FIR building phase does not have a transformer") + ANNOTATIONS_FOR_PLUGINS -> FirPluginAnnotationsResolveProcessor(session, scopeSession) + IMPORTS -> FirImportResolveProcessor(session, scopeSession) + SUPER_TYPES -> FirSupertypeResolverProcessor(session, scopeSession) + SEALED_CLASS_INHERITORS -> FirSealedClassInheritorsProcessor(session, scopeSession) + TYPES -> FirTypeResolveProcessor(session, scopeSession) + EXTENSION_STATUS_UPDATE -> FirTransformerBasedExtensionStatusProcessor(session, scopeSession) + STATUS -> FirStatusResolveProcessor(session, scopeSession) + CONTRACTS -> FirContractResolveProcessor(session, scopeSession) + IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveProcessor(session, scopeSession) + BODY_RESOLVE -> FirBodyResolveProcessor(session, scopeSession) + } } - -enum class CompilerMode { - CLI, IDE -} \ No newline at end of file diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticTest.kt index 239c732a258..d054a1ef022 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticTest.kt @@ -28,8 +28,7 @@ import org.jetbrains.kotlin.fir.resolve.dfa.cfg.CFGNode import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ControlFlowGraph import org.jetbrains.kotlin.fir.resolve.dfa.cfg.EdgeKind import org.jetbrains.kotlin.fir.resolve.dfa.cfg.FirControlFlowGraphRenderVisitor -import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveProcessor -import org.jetbrains.kotlin.fir.resolve.transformers.createAllResolveProcessors +import org.jetbrains.kotlin.fir.resolve.transformers.createAllCompilerResolveProcessors import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol @@ -77,7 +76,7 @@ abstract class AbstractFirDiagnosticsTest : AbstractFirBaseDiagnosticsTest() { for ((session, firFiles) in firFilesPerSession) { doFirResolveTestBench( firFiles, - createAllResolveProcessors(session), + createAllCompilerResolveProcessors(session), gc = false ) } diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirOldFrontendDiagnosticsTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirOldFrontendDiagnosticsTest.kt index b2c9f254188..8b82542fa11 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirOldFrontendDiagnosticsTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirOldFrontendDiagnosticsTest.kt @@ -6,8 +6,7 @@ package org.jetbrains.kotlin.fir import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveProcessor -import org.jetbrains.kotlin.fir.resolve.transformers.createAllResolveProcessors +import org.jetbrains.kotlin.fir.resolve.transformers.createAllCompilerResolveProcessors import org.jetbrains.kotlin.test.KotlinTestUtils import java.io.File @@ -33,7 +32,7 @@ abstract class AbstractFirOldFrontendDiagnosticsTest : AbstractFirDiagnosticsTes override fun runAnalysis(testDataFile: File, testFiles: List, firFilesPerSession: Map>) { val failure: FirRuntimeException? = try { for ((session, firFiles) in firFilesPerSession) { - doFirResolveTestBench(firFiles, createAllResolveProcessors(session), gc = false) + doFirResolveTestBench(firFiles, createAllCompilerResolveProcessors(session), gc = false) } null } catch (e: FirRuntimeException) {