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