[FIR IDE] Rename refactoring and speed improvements

This commit is contained in:
Igor Yakovlev
2021-05-04 16:27:28 +02:00
committed by TeamCityServer
parent 966743c704
commit 384b2ad048
24 changed files with 79 additions and 83 deletions
@@ -47,7 +47,7 @@ abstract class KtAnalysisSession(final override val token: ValidityToken) : Vali
override val analysisSession: KtAnalysisSession get() = this
abstract fun createContextDependentCopy(originalKtFile: KtFile, dependencyKtElement: KtElement): KtAnalysisSession
abstract fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession
internal val smartCastProvider: KtSmartCastProvider get() = smartCastProviderImpl
protected abstract val smartCastProviderImpl: KtSmartCastProvider
@@ -38,11 +38,11 @@ abstract class KtAnalysisSessionProvider : Disposable {
@InvalidWayOfUsingAnalysisSession
inline fun <R> analyseInDependedAnalysisSession(
originalFile: KtFile,
dependencyExpression: KtElement,
elementToReanalyze: KtElement,
action: KtAnalysisSession.() -> R
): R {
val dependedAnalysisSession = getAnalysisSession(originalFile, ReadActionConfinementValidityTokenFactory)
.createContextDependentCopy(originalFile, dependencyExpression)
.createContextDependentCopy(originalFile, elementToReanalyze)
return analyse(dependedAnalysisSession, ReadActionConfinementValidityTokenFactory, action)
}
@@ -95,10 +95,10 @@ inline fun <R> analyseWithCustomToken(
@OptIn(InvalidWayOfUsingAnalysisSession::class)
inline fun <R> analyseInDependedAnalysisSession(
originalFile: KtFile,
dependencyExpression: KtElement,
elementToReanalyze: KtElement,
action: KtAnalysisSession.() -> R
): R =
originalFile.project.service<KtAnalysisSessionProvider>().analyseInDependedAnalysisSession(originalFile, dependencyExpression, action)
originalFile.project.service<KtAnalysisSessionProvider>().analyseInDependedAnalysisSession(originalFile, elementToReanalyze, action)
/**
* Execute given [action] in [KtAnalysisSession] context like [analyse] does but execute it in read action
@@ -69,7 +69,6 @@ internal class FirModuleResolveStateImpl(
override fun collectDiagnosticsForFile(ktFile: KtFile, filter: DiagnosticCheckerFilter): Collection<FirPsiDiagnostic<*>> =
diagnosticsCollector.collectDiagnosticsForFile(ktFile, filter)
@TestOnly
internal fun getBuiltFirFileOrNull(ktFile: KtFile): FirFile? {
val cache = sessionProvider.getModuleCache(ktFile.getModuleInfo() as ModuleSourceInfo)
return firFileBuilder.getBuiltFirFileOrNull(ktFile, cache)
@@ -36,7 +36,6 @@ internal class FirPhaseRunner {
FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE -> implicitTypesResolveLock.withLock {
runPhaseWithoutLock(firFile, phase, scopeSession)
}
//TODO: Make correct sync for TYPES
else -> {
runPhaseWithoutLock(firFile, phase, scopeSession)
}
@@ -52,7 +51,6 @@ internal class FirPhaseRunner {
FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE -> implicitTypesResolveLock.withLock {
runPhaseWithCustomResolveWithoutLock(resolve)
}
//TODO: Make correct sync for TYPES
else -> {
runPhaseWithCustomResolveWithoutLock(resolve)
}
@@ -20,12 +20,10 @@ import org.jetbrains.kotlin.psi.*
object DeclarationCopyBuilder {
fun <T : KtElement> createDeclarationCopy(
state: FirModuleResolveState,
nonLocalDeclaration: KtDeclaration,
replacement: RawFirReplacement<T>
): FirDeclaration {
val nonLocalDeclaration = LowLevelFirApiFacadeForDependentCopy.findEnclosingNonLocalDeclaration(replacement.from)
?: error("Cannot find enclosing declaration for ${replacement.from.getElementTextInContext()}")
return when (nonLocalDeclaration) {
is KtNamedFunction -> createFunctionCopy(
nonLocalDeclaration,
@@ -11,26 +11,26 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.builder.RawFirReplacement
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.realPsi
import org.jetbrains.kotlin.fir.resolve.FirTowerDataContext
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer
import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.scopes.createImportingScopes
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveStateDepended
import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveStateImpl
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerContextProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerDataContextAllElementsCollector
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.SingleElementTowerProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FileTowerProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.file.structure.FirElementsRecorder
import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirProviderInterceptorForIDE
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSourcesSession
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirProviderInterceptorForIDE
import org.jetbrains.kotlin.idea.fir.low.level.api.util.originalDeclaration
import org.jetbrains.kotlin.idea.util.getElementTextInContext
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
object LowLevelFirApiFacadeForDependentCopy {
object LowLevelFirApiFacadeForResolveOnAir {
private fun KtDeclaration.canBeEnclosingDeclaration(): Boolean = when (this) {
is KtNamedFunction -> isTopLevel || containingClassOrObject?.isLocal == false
@@ -40,7 +40,7 @@ object LowLevelFirApiFacadeForDependentCopy {
else -> false
}
fun findEnclosingNonLocalDeclaration(position: KtElement): KtNamedDeclaration? =
private fun findEnclosingNonLocalDeclaration(position: KtElement): KtNamedDeclaration? =
position.parentsOfType<KtNamedDeclaration>().firstOrNull { ktDeclaration ->
ktDeclaration.canBeEnclosingDeclaration()
}
@@ -71,7 +71,7 @@ object LowLevelFirApiFacadeForDependentCopy {
require(!elementToResolve.isPhysical)
val collector = FirTowerDataContextAllElementsCollector()
val declaration = runBodyResolve(
val declaration = runResolveBodyResolveOnAir(
state = state,
replacement = RawFirReplacement(place, elementToResolve),
collector = null,
@@ -102,10 +102,10 @@ object LowLevelFirApiFacadeForDependentCopy {
require(place.isPhysical)
return if (place is KtFile) {
onAirGetTowerContextForFile(state, place)
FileTowerProvider(place, onAirGetTowerContextForFile(state, place))
} else {
FirTowerDataContextAllElementsCollector().also {
runBodyResolve(state, collector = it, replacement = RawFirReplacement(place, place))
runResolveBodyResolveOnAir(state, collector = it, replacement = RawFirReplacement(place, place))
}
}
}
@@ -113,44 +113,38 @@ object LowLevelFirApiFacadeForDependentCopy {
private fun onAirGetTowerContextForFile(
state: FirModuleResolveState,
file: KtFile,
): FirTowerContextProvider {
): FirTowerDataContext {
require(file.isPhysical)
val session = state.getSessionFor(file.getModuleInfo()) as FirIdeSourcesSession
val firFile = session.firFileBuilder.getFirFileResolvedToPhaseWithCaching(
file,
session.cache,
FirResolvePhase.IMPORTS,
ScopeSession(),
checkPCE = false
)
val firFile = state.getOrBuildFirFor(file) as FirFile
val fileTransformer = object : FirBodyResolveTransformer(
session = firFile.declarationSiteSession,
phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE,
implicitTypeOnly = true,
scopeSession = ScopeSession()
) {
var result: FirTowerDataContext? = null
private set
override fun transformDeclarationContent(declaration: FirDeclaration, data: ResolutionMode): FirDeclaration {
check(declaration is FirFile)
result = context.towerDataContext
return declaration
}
}
firFile.transform<FirFile, ResolutionMode>(fileTransformer, ResolutionMode.ContextDependent)
val fileContext = fileTransformer.result
check(fileContext != null) { "File context not found for physical file" }
return SingleElementTowerProvider(file, fileContext)
val importingScopes = createImportingScopes(firFile, firFile.declarationSiteSession, ScopeSession(), useCaching = false)
val fileScopeElements = importingScopes.map { it.asTowerDataElement(isLocal = false) }
return FirTowerDataContext().addNonLocalTowerDataElements(fileScopeElements)
}
fun getResolveStateForDependedCopy(
fun getResolveStateForDependentCopy(
originalState: FirModuleResolveState,
originalKtFile: KtFile,
dependencyKtElement: KtElement
elementToAnalyze: KtElement
): FirModuleResolveState {
require(originalState is FirModuleResolveStateImpl)
require(dependencyKtElement !is KtFile) { "KtFile for dependency element not supported" }
require(!dependencyKtElement.isPhysical) { "Depended state should be build only for non-physical elements" }
require(elementToAnalyze !is KtFile) { "KtFile for dependency element not supported" }
require(!elementToAnalyze.isPhysical) { "Depended state should be build only for non-physical elements" }
val dependencyNonLocalDeclaration = findEnclosingNonLocalDeclaration(elementToAnalyze)
?: return FirModuleResolveStateDepended(
originalState,
FileTowerProvider(elementToAnalyze.containingKtFile, onAirGetTowerContextForFile(originalState, originalKtFile)),
emptyMap()
)
val dependencyNonLocalDeclaration = findEnclosingNonLocalDeclaration(dependencyKtElement)
?: error("Cannot find enclosing declaration for ${dependencyKtElement.getElementTextInContext()}")
val sameDeclarationInOriginalFile = locateDeclarationInFileByOffset(dependencyNonLocalDeclaration, originalKtFile)
?: error("Cannot find original function matching to ${dependencyNonLocalDeclaration.getElementTextInContext()} in $originalKtFile")
@@ -161,7 +155,7 @@ object LowLevelFirApiFacadeForDependentCopy {
)
val collector = FirTowerDataContextAllElementsCollector()
val copiedFirDeclaration = runBodyResolve(
val copiedFirDeclaration = runResolveBodyResolveOnAir(
originalState,
collector = collector,
replacement = RawFirReplacement(sameDeclarationInOriginalFile, dependencyNonLocalDeclaration),
@@ -172,18 +166,24 @@ object LowLevelFirApiFacadeForDependentCopy {
return FirModuleResolveStateDepended(originalState, collector, recordedMap)
}
private fun <T : KtElement> runBodyResolve(
private fun <T : KtElement> runResolveBodyResolveOnAir(
state: FirModuleResolveStateImpl,
replacement: RawFirReplacement<T>,
collector: FirTowerDataContextCollector? = null,
useFirProviderInterceptor: Boolean = false
): FirDeclaration {
val nonLocalDeclaration = findEnclosingNonLocalDeclaration(replacement.from)
?: error("Cannot find enclosing declaration for ${replacement.from.getElementTextInContext()}")
val copiedFirDeclaration = DeclarationCopyBuilder.createDeclarationCopy(
state = state,
nonLocalDeclaration = nonLocalDeclaration,
replacement = replacement,
)
val originalFirFile = state.getOrBuildFirFor(replacement.from.containingKtFile) as FirFile
val originalFirFile = state.getBuiltFirFileOrNull(replacement.from.containingKtFile)
?: error("Original fir file should be already built")
val firProviderInterceptor =
if (useFirProviderInterceptor) FirProviderInterceptorForIDE.createForFirElement(
@@ -19,12 +19,12 @@ interface FirTowerContextProvider {
fun getClosestAvailableParentContext(ktElement: KtElement): FirTowerDataContext?
}
internal class SingleElementTowerProvider(
private val element: KtElement,
internal class FileTowerProvider(
private val file: KtFile,
private val context: FirTowerDataContext
) : FirTowerContextProvider {
override fun getClosestAvailableParentContext(ktElement: KtElement): FirTowerDataContext? =
if (element == ktElement) context else null
if (file == ktElement.containingKtFile) context else null
}
internal class FirTowerDataContextAllElementsCollector : FirTowerDataContextCollector, FirTowerContextProvider {
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.getNonLocalCo
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.*
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.*
import org.jetbrains.kotlin.idea.fir.low.level.api.util.*
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
@@ -34,6 +34,7 @@ internal class FirLazyDeclarationResolver(
moduleFileCache: ModuleFileCache,
scopeSession: ScopeSession,
) {
check(firFile.resolvePhase >= FirResolvePhase.IMPORTS)
firFileBuilder.runCustomResolveUnderLock(firFile, moduleFileCache) {
val transformer = FirFileAnnotationsResolveTransformer(firFile.moduleData.session, scopeSession)
firFile.accept(transformer, ResolutionMode.ContextDependent)
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.fir.low.level.api.trasformers
package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.fir.low.level.api.trasformers
package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.fir.low.level.api.trasformers
package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.fir.low.level.api.trasformers
package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.FirStatusResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.StatusComputationSession
import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirLazyTransformerForIDE.Companion.ensurePhase
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.ensurePhase
class FirDesignatedStatusResolveTransformerForIDE(
private val designation: FirDeclarationDesignation,
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.fir.low.level.api.trasformers
package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.FirProviderInterceptorForSu
import org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverVisitor
import org.jetbrains.kotlin.fir.resolve.transformers.SupertypeComputationSession
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirLazyTransformerForIDE.Companion.ensurePhase
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.ensurePhase
internal class FirDesignatedSupertypeResolverTransformerForIDE(
private val designation: FirDeclarationDesignation,
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.fir.low.level.api.trasformers
package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirTypeResolveTransformer
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirLazyTransformerForIDE.Companion.ensurePhase
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.ensurePhase
class FirDesignatedTypeResolverTransformerForIDE(
private val originalFile: FirFile,
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.fir.low.level.api.trasformers
package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
@@ -1,4 +1,4 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.trasformers
package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.fir.low.level.api.trasformers
package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.fir.low.level.api.trasformers
package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.fir.low.level.api.trasformers
package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
@@ -73,16 +73,16 @@ private constructor(
override val subtypingComponentImpl = KtFirSubtypingComponent(this, token)
override fun createContextDependentCopy(originalKtFile: KtFile, dependencyKtElement: KtElement): KtAnalysisSession {
override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession {
check(mode == AnalysisSessionMode.REGULAR) {
"Cannot create context-dependent copy of KtAnalysis session from a context dependent one"
}
require(!dependencyKtElement.isPhysical) { "Depended context should be build only for non-physical elements" }
require(!elementToReanalyze.isPhysical) { "Depended context should be build only for non-physical elements" }
val contextResolveState = LowLevelFirApiFacadeForDependentCopy.getResolveStateForDependedCopy(
val contextResolveState = LowLevelFirApiFacadeForResolveOnAir.getResolveStateForDependentCopy(
originalState = firResolveState,
originalKtFile = originalKtFile,
dependencyKtElement = dependencyKtElement
elementToAnalyze = elementToReanalyze
)
return KtFirAnalysisSession(
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.idea.frontend.api.InvalidWayOfUsingAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProvider
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.EntityWasGarbageCollectedException
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
@OptIn(InvalidWayOfUsingAnalysisSession::class)
@@ -23,6 +24,6 @@ internal inline fun <R> analyzeWithSymbolAsContext(
val analysisSessionProvider = resolveState.project.service<KtAnalysisSessionProvider>()
check(analysisSessionProvider is KtFirAnalysisSessionProvider)
val analysisSession = analysisSessionProvider.getCachedAnalysisSession(resolveState, token)
?: error("KtAnalysisSession assotiated with symbol was invalidated")
?: throw EntityWasGarbageCollectedException("KtAnalysisSession")
return action(analysisSession)
}
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.components
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForDependentCopy.getTowerContextProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForResolveOnAir.getTowerContextProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getFirFile
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirOfType
import org.jetbrains.kotlin.idea.fir.low.level.api.resolver.ResolutionParameters
@@ -45,8 +45,7 @@ import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.fir.types.lowerBoundIfFlexible
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForDependentCopy
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForDependentCopy.getTowerContextProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForResolveOnAir
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerContextProvider
import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken
@@ -76,7 +75,7 @@ internal class KtFirReferenceShortener(
val firDeclaration = declarationToVisit.getOrBuildFir(firResolveState)
val towerContext =
LowLevelFirApiFacadeForDependentCopy.onAirGetTowerContextProvider(firResolveState, declarationToVisit)
LowLevelFirApiFacadeForResolveOnAir.onAirGetTowerContextProvider(firResolveState, declarationToVisit)
val collector = ElementsToShortenCollector(context, towerContext)
firDeclaration.accept(collector)
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.resolve.scope
import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.scopes.impl.*
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForDependentCopy.getTowerContextProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForResolveOnAir.getTowerContextProvider
import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.components.KtImplicitReceiver