[LL FIR] Simplify imports resolve

This commit is contained in:
Ilya Kirillov
2022-12-29 12:58:43 +01:00
committed by teamcity
parent 28ccdd5bde
commit edbee51edd
2 changed files with 7 additions and 25 deletions
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.transformers.LLFirFirProviderInterceptor
import org.jetbrains.kotlin.analysis.low.level.api.fir.transformers.LLFirLazyTransformerExecutor
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkCanceled
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getContainingFile
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry
import org.jetbrains.kotlin.analysis.utils.errors.rethrowExceptionWithDetails
import org.jetbrains.kotlin.fir.FirElement
@@ -25,7 +26,6 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.psi.KtClassBody
@@ -69,7 +69,9 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
else -> throwUnexpectedFirElementError(this)
}
private fun resolveFileToImports(firFile: FirFile) {
private fun resolveContainingFileToImports(target: FirElementWithResolvePhase) {
if (target.resolvePhase >= FirResolvePhase.IMPORTS) return
val firFile = target.getContainingFile() ?: return
if (firFile.resolvePhase >= FirResolvePhase.IMPORTS) return
moduleComponents.globalResolveComponents.lockProvider.runCustomResolveUnderLock(firFile) {
resolveFileToImportsWithoutLock(firFile)
@@ -83,19 +85,6 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
firFile.replaceResolvePhase(FirResolvePhase.IMPORTS)
}
private fun fastTrackForImportsPhase(target: FirElementWithResolvePhase): Boolean {
val provider = target.moduleData.session.firProvider
val firFile = when (target) {
is FirFile -> target
is FirCallableDeclaration -> provider.getFirCallableContainerFile(target.symbol)
is FirClassLikeDeclaration -> provider.getFirClassifierContainerFile(target.symbol)
else -> null
} ?: return false
resolveFileToImports(firFile)
return true
}
/**
* Run designated resolve only designation with fully resolved path (synchronized).
* Suitable for body resolve or/and on-air resolve.
@@ -121,11 +110,8 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
toPhase: FirResolvePhase,
) {
if (target.resolvePhase >= toPhase) return
if (toPhase == FirResolvePhase.IMPORTS) {
if (fastTrackForImportsPhase(target)) {
return
}
}
resolveContainingFileToImports(target)
if (toPhase == FirResolvePhase.IMPORTS) return
for (designation in declarationDesignationsToResolve(target)) {
if (!designation.target.isValidForResolve()) continue
@@ -166,10 +152,6 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
scopeSession: ScopeSession,
toPhase: FirResolvePhase,
) {
if (toPhase == FirResolvePhase.RAW_FIR) return
resolveFileToImportsWithoutLock(designation.firFile)
if (toPhase == FirResolvePhase.IMPORTS) return
val declarationResolvePhase = designation.target.resolvePhase
if (declarationResolvePhase >= toPhase) return
@@ -22,7 +22,7 @@ fun FirElementWithResolvePhase.getContainingFile(): FirFile? {
is FirPropertyAccessor -> propertySymbol.fir.getContainingFile()
is FirValueParameter -> containingFunctionSymbol.fir.getContainingFile()
is FirCallableDeclaration -> provider.getFirCallableContainerFile(symbol)
is FirClassLikeDeclaration -> provider.getFirClassifierContainerFile(symbol)
is FirClassLikeDeclaration -> provider.getFirClassifierContainerFileIfAny(symbol)
is FirDanglingModifierList -> {
val ktFile = psi?.containingFile as? KtFile
?: error("File for dangling modifier list cannot be null")