[FIR] Make creating of resolve processors type safe

Also get rid of `CompilerMode` enum
This commit is contained in:
Dmitriy Novozhilov
2020-05-28 12:41:46 +03:00
parent c919f6172e
commit f6dabafe34
5 changed files with 42 additions and 31 deletions
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.dump.MultiModuleHtmlFirDump
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.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.createAllResolveProcessors import org.jetbrains.kotlin.fir.resolve.transformers.createAllCompilerResolveProcessors
import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
@@ -55,7 +55,7 @@ class FirResolveModularizedTotalKotlinTest : AbstractModularizedTest() {
.uniteWith(TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(project)) .uniteWith(TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(project))
val librariesScope = ProjectScope.getLibrariesScope(project) val librariesScope = ProjectScope.getLibrariesScope(project)
val session = createSession(environment, scope, librariesScope, moduleData.qualifiedName) val session = createSession(environment, scope, librariesScope, moduleData.qualifiedName)
val processors = createAllResolveProcessors(session) val processors = createAllCompilerResolveProcessors(session)
val firProvider = session.firProvider as FirProviderImpl val firProvider = session.firProvider as FirProviderImpl
val firFiles = if (useLightTree) { val firFiles = if (useLightTree) {
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession
class FirTotalResolveProcessor(session: FirSession) { class FirTotalResolveProcessor(session: FirSession) {
val scopeSession: ScopeSession = ScopeSession() val scopeSession: ScopeSession = ScopeSession()
private val processors: List<FirResolveProcessor> = createAllResolveProcessors(session, scopeSession) private val processors: List<FirResolveProcessor> = createAllCompilerResolveProcessors(session, scopeSession)
fun process(files: List<FirFile>) { fun process(files: List<FirFile>) {
for (processor in processors) { for (processor in processors) {
@@ -31,22 +31,31 @@ class FirTotalResolveProcessor(session: FirSession) {
} }
} }
fun createAllResolveProcessors( fun createAllCompilerResolveProcessors(
session: FirSession, session: FirSession,
scopeSession: ScopeSession? = null, scopeSession: ScopeSession? = null
mode: CompilerMode = CompilerMode.CLI
): List<FirResolveProcessor> { ): List<FirResolveProcessor> {
@Suppress("NAME_SHADOWING") return createAllResolveProcessors(scopeSession) {
val scopeSession = scopeSession ?: ScopeSession() createCompilerProcessorByPhase(session, it)
return FirResolvePhase.values() }
.drop(1) // to remove RAW_FIR phase
.map { it.createProcessorByPhase(session, scopeSession, mode) }
} }
fun createAllTransformerBasedResolveProcessors( fun createAllTransformerBasedResolveProcessors(
session: FirSession, session: FirSession,
scopeSession: ScopeSession? = null, scopeSession: ScopeSession? = null,
): List<FirTransformerBasedResolveProcessor> { ): List<FirTransformerBasedResolveProcessor> {
@Suppress("UNCHECKED_CAST") return createAllResolveProcessors(scopeSession) {
return createAllResolveProcessors(session, scopeSession, CompilerMode.IDE) as List<FirTransformerBasedResolveProcessor> createTransformerBasedProcessorByPhase(session, it)
}
}
private inline fun <T : FirResolveProcessor> createAllResolveProcessors(
scopeSession: ScopeSession? = null,
creator: FirResolvePhase.(ScopeSession) -> T
): List<T> {
@Suppress("NAME_SHADOWING")
val scopeSession = scopeSession ?: ScopeSession()
return FirResolvePhase.values()
.drop(1) // to remove RAW_FIR phase
.map { it.creator(scopeSession) }
} }
@@ -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.FirPluginAnnotationsResolveProcessor
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.FirTransformerBasedExtensionStatusProcessor import org.jetbrains.kotlin.fir.resolve.transformers.plugin.FirTransformerBasedExtensionStatusProcessor
fun FirResolvePhase.createProcessorByPhase( fun FirResolvePhase.createCompilerProcessorByPhase(
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession
compilerMode: CompilerMode = CompilerMode.CLI
): FirResolveProcessor { ): FirResolveProcessor {
return when (this) { return when (this) {
RAW_FIR -> throw IllegalStateException("Raw FIR building phase does not have a transformer") 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) SUPER_TYPES -> FirSupertypeResolverProcessor(session, scopeSession)
SEALED_CLASS_INHERITORS -> FirSealedClassInheritorsProcessor(session, scopeSession) SEALED_CLASS_INHERITORS -> FirSealedClassInheritorsProcessor(session, scopeSession)
TYPES -> FirTypeResolveProcessor(session, scopeSession) TYPES -> FirTypeResolveProcessor(session, scopeSession)
EXTENSION_STATUS_UPDATE -> when (compilerMode) { EXTENSION_STATUS_UPDATE -> FirGlobalExtensionStatusProcessor(session, scopeSession)
CompilerMode.CLI -> FirGlobalExtensionStatusProcessor(session, scopeSession)
CompilerMode.IDE -> FirTransformerBasedExtensionStatusProcessor(session, scopeSession)
}
STATUS -> FirStatusResolveProcessor(session, scopeSession) STATUS -> FirStatusResolveProcessor(session, scopeSession)
CONTRACTS -> FirContractResolveProcessor(session, scopeSession) CONTRACTS -> FirContractResolveProcessor(session, scopeSession)
IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveProcessor(session, scopeSession) IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveProcessor(session, scopeSession)
@@ -41,9 +37,17 @@ fun FirResolvePhase.createProcessorByPhase(
} }
fun FirResolvePhase.createTransformerBasedProcessorByPhase(session: FirSession, scopeSession: ScopeSession): FirTransformerBasedResolveProcessor { 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)
enum class CompilerMode { IMPORTS -> FirImportResolveProcessor(session, scopeSession)
CLI, IDE 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)
}
} }
@@ -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.ControlFlowGraph
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.EdgeKind import org.jetbrains.kotlin.fir.resolve.dfa.cfg.EdgeKind
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.FirControlFlowGraphRenderVisitor import org.jetbrains.kotlin.fir.resolve.dfa.cfg.FirControlFlowGraphRenderVisitor
import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveProcessor import org.jetbrains.kotlin.fir.resolve.transformers.createAllCompilerResolveProcessors
import org.jetbrains.kotlin.fir.resolve.transformers.createAllResolveProcessors
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
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
@@ -77,7 +76,7 @@ abstract class AbstractFirDiagnosticsTest : AbstractFirBaseDiagnosticsTest() {
for ((session, firFiles) in firFilesPerSession) { for ((session, firFiles) in firFilesPerSession) {
doFirResolveTestBench( doFirResolveTestBench(
firFiles, firFiles,
createAllResolveProcessors(session), createAllCompilerResolveProcessors(session),
gc = false gc = false
) )
} }
@@ -6,8 +6,7 @@
package org.jetbrains.kotlin.fir package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveProcessor import org.jetbrains.kotlin.fir.resolve.transformers.createAllCompilerResolveProcessors
import org.jetbrains.kotlin.fir.resolve.transformers.createAllResolveProcessors
import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.KotlinTestUtils
import java.io.File import java.io.File
@@ -33,7 +32,7 @@ abstract class AbstractFirOldFrontendDiagnosticsTest : AbstractFirDiagnosticsTes
override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFilesPerSession: Map<FirSession, List<FirFile>>) { override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFilesPerSession: Map<FirSession, List<FirFile>>) {
val failure: FirRuntimeException? = try { val failure: FirRuntimeException? = try {
for ((session, firFiles) in firFilesPerSession) { for ((session, firFiles) in firFilesPerSession) {
doFirResolveTestBench(firFiles, createAllResolveProcessors(session), gc = false) doFirResolveTestBench(firFiles, createAllCompilerResolveProcessors(session), gc = false)
} }
null null
} catch (e: FirRuntimeException) { } catch (e: FirRuntimeException) {