[LL FIR] allow collecting tower data context for entire FirFile

Before, it was done only for import statements

^KT-57966
This commit is contained in:
Ilya Kirillov
2023-04-26 18:06:05 +02:00
committed by Space Team
parent 8073e65162
commit 793cb02c7d
2 changed files with 17 additions and 1 deletions
@@ -9,6 +9,7 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.analysis.low.level.api.fir.DeclarationCopyBuilder.withBodyFrom
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirResolveSessionDepended
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirWholeFileResolveTarget
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FileTowerProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerDataContextAllElementsCollector
@@ -116,7 +117,13 @@ object LowLevelFirApiFacadeForResolveOnAir {
require(firResolveSession is LLFirResolvableResolveSession)
return if (place is KtFile) {
FileTowerProvider(place, onAirGetTowerContextForFile(firResolveSession, place))
FirTowerDataContextAllElementsCollector().also { collector ->
val session = firResolveSession.getSessionFor(place.getKtModule(firResolveSession.project)) as LLFirResolvableModuleSession
val moduleComponents = session.moduleComponents
val onAirFirFile = RawFirNonLocalDeclarationBuilder.buildNewFile(session, session.kotlinScopeProvider, place)
val target = LLFirWholeFileResolveTarget(onAirFirFile)
moduleComponents.firModuleLazyDeclarationResolver.lazyResolveTarget(target, FirResolvePhase.BODY_RESOLVE, collector)
}
} else {
val validPlace = PsiTreeUtil.findFirstParent(place, false) {
RawFirReplacement.isApplicableForReplacement(it as KtElement)
@@ -61,6 +61,15 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
}
companion object {
fun buildNewFile(
session: FirSession,
scopeProvider: FirScopeProvider,
file: KtFile,
): FirFile {
val builder = RawFirBuilder(session,scopeProvider, bodyBuildingMode = BodyBuildingMode.LAZY_BODIES)
return builder.buildFirFile(file)
}
fun buildNewSimpleFunction(
session: FirSession,
scopeProvider: FirScopeProvider,