FIR IDE: refactor: move designation & transformer creation in lazy resolve to separate functions

This commit is contained in:
Ilya Kirillov
2020-12-17 17:47:20 +01:00
parent c61b0d1f31
commit c5788290f3
@@ -149,23 +149,25 @@ internal class FirLazyDeclarationResolver(
) { ) {
val nonLocalDeclarationToResolve = firDeclarationToResolve.getNonLocalDeclarationToResolve(provider, moduleFileCache) val nonLocalDeclarationToResolve = firDeclarationToResolve.getNonLocalDeclarationToResolve(provider, moduleFileCache)
val designation = mutableListOf<FirDeclaration>(containerFirFile) val designation = nonLocalDeclarationToResolve.getDesignation(containerFirFile, provider, moduleFileCache)
if (nonLocalDeclarationToResolve !is FirFile) {
val ktDeclaration = nonLocalDeclarationToResolve.ktDeclaration
designation += ktDeclaration.parentsOfType<KtClassOrObject>()
.filter { it !is KtEnumEntry }
.map { it.findSourceNonLocalFirDeclaration(firFileBuilder, provider.symbolProvider, moduleFileCache, containerFirFile) }
.toList()
.asReversed()
if (nonLocalDeclarationToResolve is FirCallableDeclaration<*>) {
designation += nonLocalDeclarationToResolve
}
}
if (designation.all { it.resolvePhase >= phase }) { if (designation.all { it.resolvePhase >= phase }) {
return return
} }
val transformer = when (phase) {
val transformer = phase.createLazyTransformer(designation, containerFirFile, scopeSession, towerDataContextCollector)
firFileBuilder.firPhaseRunner.runPhaseWithCustomResolve(phase) {
containerFirFile.transform<FirFile, ResolutionMode>(transformer, ResolutionMode.ContextDependent)
}
}
private fun FirResolvePhase.createLazyTransformer(
designation: List<FirDeclaration>,
containerFirFile: FirFile,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?
) = when (this) {
FirResolvePhase.CONTRACTS -> FirDesignatedContractsResolveTransformerForIDE( FirResolvePhase.CONTRACTS -> FirDesignatedContractsResolveTransformerForIDE(
designation.iterator(), designation.iterator(),
containerFirFile.session, containerFirFile.session,
@@ -182,11 +184,26 @@ internal class FirLazyDeclarationResolver(
scopeSession, scopeSession,
towerDataContextCollector towerDataContextCollector
) )
else -> error("Non-lazy phase $phase") else -> error("Non-lazy phase $this")
} }
firFileBuilder.firPhaseRunner.runPhaseWithCustomResolve(phase) { @OptIn(ExperimentalStdlibApi::class)
containerFirFile.transform<FirFile, ResolutionMode>(transformer, ResolutionMode.ContextDependent) private fun FirDeclaration.getDesignation(
containerFirFile: FirFile,
provider: FirProvider,
moduleFileCache: ModuleFileCache
): List<FirDeclaration> = buildList {
if (this !is FirFile) {
val ktDeclaration = ktDeclaration
ktDeclaration.parentsOfType<KtClassOrObject>(withSelf = true)
.filter { it !is KtEnumEntry }
.map { it.findSourceNonLocalFirDeclaration(firFileBuilder, provider.symbolProvider, moduleFileCache, containerFirFile) }
.toList()
.asReversed()
.let(::addAll)
if (this@getDesignation is FirCallableDeclaration<*>) {
add(this@getDesignation)
}
} }
} }