[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:
committed by
Space Team
parent
8073e65162
commit
793cb02c7d
+8
-1
@@ -9,6 +9,7 @@ import com.intellij.psi.PsiElement
|
|||||||
import com.intellij.psi.util.PsiTreeUtil
|
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.DeclarationCopyBuilder.withBodyFrom
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirResolveSessionDepended
|
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.FileTowerProvider
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerDataContextAllElementsCollector
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerDataContextAllElementsCollector
|
||||||
@@ -116,7 +117,13 @@ object LowLevelFirApiFacadeForResolveOnAir {
|
|||||||
require(firResolveSession is LLFirResolvableResolveSession)
|
require(firResolveSession is LLFirResolvableResolveSession)
|
||||||
|
|
||||||
return if (place is KtFile) {
|
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 {
|
} else {
|
||||||
val validPlace = PsiTreeUtil.findFirstParent(place, false) {
|
val validPlace = PsiTreeUtil.findFirstParent(place, false) {
|
||||||
RawFirReplacement.isApplicableForReplacement(it as KtElement)
|
RawFirReplacement.isApplicableForReplacement(it as KtElement)
|
||||||
|
|||||||
+9
@@ -61,6 +61,15 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
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(
|
fun buildNewSimpleFunction(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
scopeProvider: FirScopeProvider,
|
scopeProvider: FirScopeProvider,
|
||||||
|
|||||||
Reference in New Issue
Block a user