[AA FIR] KtFirVisibilityChecker: drop redundant resolve
We can collect a designation path by psi declaration without resolution ^KT-59454 Fixed
This commit is contained in:
committed by
Space Team
parent
ca521a81f8
commit
94d727a9ce
+3
-29
@@ -15,12 +15,10 @@ import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
|||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDesignation
|
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
|
||||||
import org.jetbrains.kotlin.analysis.utils.printer.parentsOfType
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.collectContainingDeclarationsIfNonLocal
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
|
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.effectiveVisibility
|
import org.jetbrains.kotlin.fir.declarations.utils.effectiveVisibility
|
||||||
@@ -30,7 +28,6 @@ import org.jetbrains.kotlin.fir.resolve.transformers.publishedApiEffectiveVisibi
|
|||||||
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
||||||
import org.jetbrains.kotlin.fir.visibilityChecker
|
import org.jetbrains.kotlin.fir.visibilityChecker
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||||
|
|
||||||
internal class KtFirVisibilityChecker(
|
internal class KtFirVisibilityChecker(
|
||||||
@@ -52,7 +49,7 @@ internal class KtFirVisibilityChecker(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val useSiteFirFile = useSiteFile.firSymbol.fir
|
val useSiteFirFile = useSiteFile.firSymbol.fir
|
||||||
val containers = collectContainingDeclarations(position)
|
val containers = position.collectContainingDeclarationsIfNonLocal(analysisSession.firResolveSession).orEmpty()
|
||||||
|
|
||||||
val dispatchReceiverCanBeExplicit = candidateSymbol is KtCallableSymbol && !candidateSymbol.isExtension
|
val dispatchReceiverCanBeExplicit = candidateSymbol is KtCallableSymbol && !candidateSymbol.isExtension
|
||||||
val explicitDispatchReceiver = runIf(dispatchReceiverCanBeExplicit) {
|
val explicitDispatchReceiver = runIf(dispatchReceiverCanBeExplicit) {
|
||||||
@@ -61,6 +58,7 @@ internal class KtFirVisibilityChecker(
|
|||||||
|
|
||||||
val candidateFirSymbol = candidateSymbol.firSymbol.fir as FirMemberDeclaration
|
val candidateFirSymbol = candidateSymbol.firSymbol.fir as FirMemberDeclaration
|
||||||
|
|
||||||
|
val rootModuleSession = rootModuleSession
|
||||||
return rootModuleSession.visibilityChecker.isVisible(
|
return rootModuleSession.visibilityChecker.isVisible(
|
||||||
candidateFirSymbol,
|
candidateFirSymbol,
|
||||||
rootModuleSession,
|
rootModuleSession,
|
||||||
@@ -112,28 +110,4 @@ internal class KtFirVisibilityChecker(
|
|||||||
declaration.lazyResolveToPhase(FirResolvePhase.STATUS)
|
declaration.lazyResolveToPhase(FirResolvePhase.STATUS)
|
||||||
return declaration.effectiveVisibility.publicApi || declaration.publishedApiEffectiveVisibility?.publicApi == true
|
return declaration.effectiveVisibility.publicApi || declaration.publishedApiEffectiveVisibility?.publicApi == true
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun collectContainingDeclarations(position: PsiElement): List<FirDeclaration> {
|
|
||||||
val nonLocalContainer = findContainingNonLocalDeclaration(position)
|
|
||||||
val nonLocalContainerFir = nonLocalContainer?.getOrBuildFirSafe<FirDeclaration>(analysisSession.firResolveSession)
|
|
||||||
?: return emptyList()
|
|
||||||
|
|
||||||
val designation = nonLocalContainerFir.collectDesignation()
|
|
||||||
|
|
||||||
return designation
|
|
||||||
.toSequence(includeTarget = true) // we include the starting declaration in case it is a class or an object
|
|
||||||
.filterIsInstance<FirDeclaration>()
|
|
||||||
.toList()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun findContainingNonLocalDeclaration(element: PsiElement): KtDeclaration? {
|
|
||||||
return element
|
|
||||||
.parentsOfType<KtDeclaration>()
|
|
||||||
.firstOrNull { it.isNotLocal }
|
|
||||||
}
|
|
||||||
|
|
||||||
private val KtDeclaration.isNotLocal
|
|
||||||
get() = this is KtNamedFunction && (isTopLevel || containingClassOrObject?.isLocal == false) ||
|
|
||||||
this is KtProperty && (isTopLevel || containingClassOrObject?.isLocal == false) ||
|
|
||||||
this is KtClassOrObject && (isTopLevel() || !isLocal)
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user