FIR: Declare manager as a property inside FirTowerResolverSession

This commit is contained in:
Denis Zharkov
2020-03-27 15:10:35 +03:00
parent f8227e4cb9
commit a39dbe8eec
3 changed files with 48 additions and 59 deletions
@@ -22,10 +22,10 @@ class FirTowerResolver(
collector: CandidateCollector = this.collector, collector: CandidateCollector = this.collector,
manager: TowerResolveManager = this.manager manager: TowerResolveManager = this.manager
): CandidateCollector { ): CandidateCollector {
val towerResolverSession = FirTowerResolverSession(components, implicitReceiverValues) val towerResolverSession = FirTowerResolverSession(components, implicitReceiverValues, manager)
manager.callResolutionContext = buildCallResolutionContext(info, collector, towerResolverSession) manager.callResolutionContext = buildCallResolutionContext(info, collector, towerResolverSession)
towerResolverSession.runResolve(manager, info) towerResolverSession.runResolution(info)
manager.runTasks() manager.runTasks()
return collector return collector
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.HIDES_MEMBERS_NAME_LIST
class FirTowerResolverSession( class FirTowerResolverSession(
val components: BodyResolveComponents, val components: BodyResolveComponents,
implicitReceiverValues: List<ImplicitReceiverValue<*>>, implicitReceiverValues: List<ImplicitReceiverValue<*>>,
private val manager: TowerResolveManager
) { ) {
private data class ImplicitReceiver( private data class ImplicitReceiver(
val receiver: ImplicitReceiverValue<*>, val receiver: ImplicitReceiverValue<*>,
@@ -56,18 +57,18 @@ class FirTowerResolverSession(
else else
components.typeParametersScopes.asReversed() + components.fileImportsScope.asReversed() components.typeParametersScopes.asReversed() + components.fileImportsScope.asReversed()
fun runResolve(manager: TowerResolveManager, info: CallInfo) { fun runResolution(info: CallInfo) {
when (val receiver = info.explicitReceiver) { when (val receiver = info.explicitReceiver) {
is FirResolvedQualifier -> manager.enqueueResolverTask { runResolverForQualifierReceiver(info, receiver, manager) } is FirResolvedQualifier -> manager.enqueueResolverTask { runResolverForQualifierReceiver(info, receiver) }
null -> manager.enqueueResolverTask { runResolverForNoReceiver(info, manager) } null -> manager.enqueueResolverTask { runResolverForNoReceiver(info) }
else -> run { else -> run {
if (receiver is FirQualifiedAccessExpression) { if (receiver is FirQualifiedAccessExpression) {
val calleeReference = receiver.calleeReference val calleeReference = receiver.calleeReference
if (calleeReference is FirSuperReference) { if (calleeReference is FirSuperReference) {
return@run manager.enqueueResolverTask { runResolverForSuperReceiver(info, receiver.typeRef, manager) } return@run manager.enqueueResolverTask { runResolverForSuperReceiver(info, receiver.typeRef) }
} }
} }
manager.enqueueResolverTask { runResolverForExpressionReceiver(info, receiver, manager) } manager.enqueueResolverTask { runResolverForExpressionReceiver(info, receiver) }
} }
} }
} }
@@ -91,7 +92,6 @@ class FirTowerResolverSession(
) )
private suspend fun processQualifierScopes( private suspend fun processQualifierScopes(
manager: TowerResolveManager,
info: CallInfo, qualifierReceiver: QualifierReceiver? info: CallInfo, qualifierReceiver: QualifierReceiver?
) { ) {
if (qualifierReceiver == null) return if (qualifierReceiver == null) return
@@ -104,7 +104,6 @@ class FirTowerResolverSession(
} }
private suspend fun processClassifierScope( private suspend fun processClassifierScope(
manager: TowerResolveManager,
info: CallInfo, qualifierReceiver: QualifierReceiver?, prioritized: Boolean info: CallInfo, qualifierReceiver: QualifierReceiver?, prioritized: Boolean
) { ) {
if (qualifierReceiver == null) return if (qualifierReceiver == null) return
@@ -121,19 +120,18 @@ class FirTowerResolverSession(
private suspend fun runResolverForQualifierReceiver( private suspend fun runResolverForQualifierReceiver(
info: CallInfo, info: CallInfo,
resolvedQualifier: FirResolvedQualifier, resolvedQualifier: FirResolvedQualifier
manager: TowerResolveManager
) { ) {
val qualifierReceiver = createQualifierReceiver(resolvedQualifier, session, components.scopeSession) val qualifierReceiver = createQualifierReceiver(resolvedQualifier, session, components.scopeSession)
when { when {
info.isPotentialQualifierPart -> { info.isPotentialQualifierPart -> {
processClassifierScope(manager, info, qualifierReceiver, prioritized = true) processClassifierScope(info, qualifierReceiver, prioritized = true)
processQualifierScopes(manager, info, qualifierReceiver) processQualifierScopes(info, qualifierReceiver)
} }
else -> { else -> {
processQualifierScopes(manager, info, qualifierReceiver) processQualifierScopes(info, qualifierReceiver)
processClassifierScope(manager, info, qualifierReceiver, prioritized = false) processClassifierScope(info, qualifierReceiver, prioritized = false)
} }
} }
@@ -142,31 +140,30 @@ class FirTowerResolverSession(
// NB: yet built-in Unit is used for "no-value" type // NB: yet built-in Unit is used for "no-value" type
if (info.callKind == CallKind.CallableReference) { if (info.callKind == CallKind.CallableReference) {
if (info.stubReceiver != null || typeRef !is FirImplicitBuiltinTypeRef) { if (info.stubReceiver != null || typeRef !is FirImplicitBuiltinTypeRef) {
runResolverForExpressionReceiver(info, resolvedQualifier, manager) runResolverForExpressionReceiver(info, resolvedQualifier)
} }
} else { } else {
if (typeRef !is FirImplicitBuiltinTypeRef) { if (typeRef !is FirImplicitBuiltinTypeRef) {
runResolverForExpressionReceiver(info, resolvedQualifier, manager) runResolverForExpressionReceiver(info, resolvedQualifier)
} }
} }
} }
} }
private suspend fun runResolverForNoReceiver( private suspend fun runResolverForNoReceiver(
info: CallInfo, info: CallInfo
manager: TowerResolveManager
) { ) {
manager.processExtensionsThatHideMembers(info, explicitReceiverValue = null) processExtensionsThatHideMembers(info, explicitReceiverValue = null)
val nonEmptyLocalScopes = mutableListOf<FirLocalScope>() val nonEmptyLocalScopes = mutableListOf<FirLocalScope>()
manager.processLocalScopesWithNoReceiver(info, nonEmptyLocalScopes) processLocalScopesWithNoReceiver(info, nonEmptyLocalScopes)
val emptyTopLevelScopes = mutableSetOf<FirScope>() val emptyTopLevelScopes = mutableSetOf<FirScope>()
manager.processImplicitReceiversWithNoExplicit(info, nonEmptyLocalScopes, emptyTopLevelScopes) processImplicitReceiversWithNoExplicit(info, nonEmptyLocalScopes, emptyTopLevelScopes)
manager.processTopLevelScopesNoReceiver(info, emptyTopLevelScopes) processTopLevelScopesNoReceiver(info, emptyTopLevelScopes)
} }
private suspend fun TowerResolveManager.processExtensionsThatHideMembers( private suspend fun processExtensionsThatHideMembers(
info: CallInfo, info: CallInfo,
explicitReceiverValue: ReceiverValue? explicitReceiverValue: ReceiverValue?
) { ) {
@@ -186,25 +183,25 @@ class FirTowerResolverSession(
} }
} }
private suspend fun TowerResolveManager.processHideMembersLevel( private suspend fun processHideMembersLevel(
receiverValue: ReceiverValue, receiverValue: ReceiverValue,
topLevelScope: FirScope, topLevelScope: FirScope,
info: CallInfo, info: CallInfo,
index: Int, index: Int,
depth: Int? depth: Int?
) = processLevel( ) = manager.processLevel(
topLevelScope.toScopeTowerLevel( topLevelScope.toScopeTowerLevel(
extensionReceiver = receiverValue, extensionsOnly = true extensionReceiver = receiverValue, extensionsOnly = true
), ),
info, TowerGroup.TopPrioritized(index).let { if (depth != null) it.Implicit(depth) else it } info, TowerGroup.TopPrioritized(index).let { if (depth != null) it.Implicit(depth) else it }
) )
private suspend fun TowerResolveManager.processLocalScopesWithNoReceiver( private suspend fun processLocalScopesWithNoReceiver(
info: CallInfo, info: CallInfo,
nonEmptyLocalScopes: MutableList<FirLocalScope> nonEmptyLocalScopes: MutableList<FirLocalScope>
) { ) {
for ((index, localScope) in localScopes.withIndex()) { for ((index, localScope) in localScopes.withIndex()) {
val result = processLevel( val result = manager.processLevel(
localScope.toScopeTowerLevel(), info, TowerGroup.Local(index) localScope.toScopeTowerLevel(), info, TowerGroup.Local(index)
) )
if (result != ProcessorAction.NONE) { if (result != ProcessorAction.NONE) {
@@ -213,7 +210,7 @@ class FirTowerResolverSession(
} }
} }
private suspend fun TowerResolveManager.processImplicitReceiversWithNoExplicit( private suspend fun processImplicitReceiversWithNoExplicit(
info: CallInfo, info: CallInfo,
nonEmptyLocalScopes: MutableList<FirLocalScope>, nonEmptyLocalScopes: MutableList<FirLocalScope>,
emptyTopLevelScopes: MutableSet<FirScope> emptyTopLevelScopes: MutableSet<FirScope>
@@ -226,7 +223,6 @@ class FirTowerResolverSession(
if (usableAsValue) { if (usableAsValue) {
processCandidatesWithGivenImplicitReceiverAsValue( processCandidatesWithGivenImplicitReceiverAsValue(
implicitReceiverValue, implicitReceiverValue,
this,
info, info,
parentGroup, parentGroup,
implicitReceiverValuesWithEmptyScopes, implicitReceiverValuesWithEmptyScopes,
@@ -238,7 +234,7 @@ class FirTowerResolverSession(
if (implicitReceiverValue is ImplicitDispatchReceiverValue) { if (implicitReceiverValue is ImplicitDispatchReceiverValue) {
val scope = implicitReceiverValue.scope(session, components.scopeSession) val scope = implicitReceiverValue.scope(session, components.scopeSession)
if (scope != null) { if (scope != null) {
processLevel( manager.processLevel(
FirStaticScope(scope).toScopeTowerLevel(), FirStaticScope(scope).toScopeTowerLevel(),
info, parentGroup.Static(depth) info, parentGroup.Static(depth)
) )
@@ -249,7 +245,6 @@ class FirTowerResolverSession(
private suspend fun processCandidatesWithGivenImplicitReceiverAsValue( private suspend fun processCandidatesWithGivenImplicitReceiverAsValue(
receiver: ImplicitReceiverValue<*>, receiver: ImplicitReceiverValue<*>,
manager: TowerResolveManager,
info: CallInfo, info: CallInfo,
parentGroup: TowerGroup, parentGroup: TowerGroup,
implicitReceiverValuesWithEmptyScopes: MutableSet<ImplicitReceiverValue<*>>, implicitReceiverValuesWithEmptyScopes: MutableSet<ImplicitReceiverValue<*>>,
@@ -291,7 +286,7 @@ class FirTowerResolverSession(
} }
} }
private suspend fun TowerResolveManager.processTopLevelScopesNoReceiver( private suspend fun processTopLevelScopesNoReceiver(
info: CallInfo, info: CallInfo,
emptyTopLevelScopes: Collection<FirScope> emptyTopLevelScopes: Collection<FirScope>
) { ) {
@@ -299,7 +294,7 @@ class FirTowerResolverSession(
// NB: this check does not work for variables // NB: this check does not work for variables
// because we do not search for objects if we have extension receiver // because we do not search for objects if we have extension receiver
if (info.callKind != CallKind.VariableAccess && topLevelScope in emptyTopLevelScopes) continue if (info.callKind != CallKind.VariableAccess && topLevelScope in emptyTopLevelScopes) continue
processLevel( manager.processLevel(
topLevelScope.toScopeTowerLevel(), info, TowerGroup.Top(index) topLevelScope.toScopeTowerLevel(), info, TowerGroup.Top(index)
) )
} }
@@ -307,13 +302,12 @@ class FirTowerResolverSession(
private suspend fun runResolverForExpressionReceiver( private suspend fun runResolverForExpressionReceiver(
info: CallInfo, info: CallInfo,
receiver: FirExpression, receiver: FirExpression
manager: TowerResolveManager
) { ) {
val explicitReceiverValue = ExpressionReceiverValue(receiver) val explicitReceiverValue = ExpressionReceiverValue(receiver)
manager.processExtensionsThatHideMembers(info, explicitReceiverValue) processExtensionsThatHideMembers(info, explicitReceiverValue)
manager.processMembersForExplicitReceiver(explicitReceiverValue, info) processMembersForExplicitReceiver(explicitReceiverValue, info)
val shouldProcessExplicitReceiverScopeOnly = val shouldProcessExplicitReceiverScopeOnly =
info.callKind == CallKind.Function && info.explicitReceiver?.typeRef?.coneTypeSafe<ConeIntegerLiteralType>() != null info.callKind == CallKind.Function && info.explicitReceiver?.typeRef?.coneTypeSafe<ConeIntegerLiteralType>() != null
@@ -324,7 +318,7 @@ class FirTowerResolverSession(
val nonEmptyLocalScopes = mutableListOf<FirLocalScope>() val nonEmptyLocalScopes = mutableListOf<FirLocalScope>()
for ((index, localScope) in localScopes.withIndex()) { for ((index, localScope) in localScopes.withIndex()) {
if (manager.processScopeForExplicitReceiver( if (processScopeForExplicitReceiver(
localScope, localScope,
explicitReceiverValue, explicitReceiverValue,
info, info,
@@ -336,11 +330,11 @@ class FirTowerResolverSession(
} }
for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) { for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) {
processCombinationOfReceivers(manager, implicitReceiverValue, explicitReceiverValue, info, depth, nonEmptyLocalScopes) processCombinationOfReceivers(implicitReceiverValue, explicitReceiverValue, info, depth, nonEmptyLocalScopes)
} }
for ((index, topLevelScope) in topLevelScopes.withIndex()) { for ((index, topLevelScope) in topLevelScopes.withIndex()) {
manager.processScopeForExplicitReceiver( processScopeForExplicitReceiver(
topLevelScope, topLevelScope,
explicitReceiverValue, explicitReceiverValue,
info, info,
@@ -349,35 +343,34 @@ class FirTowerResolverSession(
} }
} }
private suspend fun TowerResolveManager.processScopeForExplicitReceiver( private suspend fun processScopeForExplicitReceiver(
scope: FirScope, scope: FirScope,
explicitReceiverValue: ExpressionReceiverValue, explicitReceiverValue: ExpressionReceiverValue,
info: CallInfo, info: CallInfo,
towerGroup: TowerGroup, towerGroup: TowerGroup,
): ProcessorAction { ): ProcessorAction {
val result = processLevel( val result = manager.processLevel(
scope.toScopeTowerLevel(extensionReceiver = explicitReceiverValue), scope.toScopeTowerLevel(extensionReceiver = explicitReceiverValue),
info, towerGroup, ExplicitReceiverKind.EXTENSION_RECEIVER info, towerGroup, ExplicitReceiverKind.EXTENSION_RECEIVER
) )
processLevelForPropertyWithInvoke( manager.processLevelForPropertyWithInvoke(
scope.toScopeTowerLevel(), info, towerGroup scope.toScopeTowerLevel(), info, towerGroup
) )
return result return result
} }
private suspend fun TowerResolveManager.processMembersForExplicitReceiver( private suspend fun processMembersForExplicitReceiver(
explicitReceiverValue: ExpressionReceiverValue, explicitReceiverValue: ExpressionReceiverValue,
info: CallInfo info: CallInfo
) { ) {
processLevel( manager.processLevel(
explicitReceiverValue.toMemberScopeTowerLevel(), info, TowerGroup.Member, ExplicitReceiverKind.DISPATCH_RECEIVER explicitReceiverValue.toMemberScopeTowerLevel(), info, TowerGroup.Member, ExplicitReceiverKind.DISPATCH_RECEIVER
) )
} }
private suspend fun processCombinationOfReceivers( private suspend fun processCombinationOfReceivers(
manager: TowerResolveManager,
implicitReceiverValue: ImplicitReceiverValue<*>, implicitReceiverValue: ImplicitReceiverValue<*>,
explicitReceiverValue: ExpressionReceiverValue, explicitReceiverValue: ExpressionReceiverValue,
info: CallInfo, info: CallInfo,
@@ -421,8 +414,7 @@ class FirTowerResolverSession(
private suspend fun runResolverForSuperReceiver( private suspend fun runResolverForSuperReceiver(
info: CallInfo, info: CallInfo,
superTypeRef: FirTypeRef, superTypeRef: FirTypeRef
manager: TowerResolveManager
) { ) {
val scope = when (superTypeRef) { val scope = when (superTypeRef) {
is FirResolvedTypeRef -> superTypeRef.type.scope(session, components.scopeSession) is FirResolvedTypeRef -> superTypeRef.type.scope(session, components.scopeSession)
@@ -439,8 +431,7 @@ class FirTowerResolverSession(
internal suspend fun runResolverForInvoke( internal suspend fun runResolverForInvoke(
info: CallInfo, info: CallInfo,
invokeReceiverValue: ExpressionReceiverValue, invokeReceiverValue: ExpressionReceiverValue
manager: TowerResolveManager
) { ) {
manager.processLevel( manager.processLevel(
invokeReceiverValue.toMemberScopeTowerLevel(), invokeReceiverValue.toMemberScopeTowerLevel(),
@@ -482,8 +473,7 @@ class FirTowerResolverSession(
// Here we already know extension receiver for invoke, and it's stated in info as first argument // Here we already know extension receiver for invoke, and it's stated in info as first argument
internal suspend fun runResolverForBuiltinInvokeExtensionWithExplicitArgument( internal suspend fun runResolverForBuiltinInvokeExtensionWithExplicitArgument(
info: CallInfo, info: CallInfo,
invokeReceiverValue: ExpressionReceiverValue, invokeReceiverValue: ExpressionReceiverValue
manager: TowerResolveManager
) { ) {
manager.processLevel( manager.processLevel(
invokeReceiverValue.toMemberScopeTowerLevel(), invokeReceiverValue.toMemberScopeTowerLevel(),
@@ -496,8 +486,7 @@ class FirTowerResolverSession(
// Here we don't know extension receiver for invoke, assuming it's one of implicit receivers // Here we don't know extension receiver for invoke, assuming it's one of implicit receivers
internal suspend fun runResolverForBuiltinInvokeExtensionWithImplicitArgument( internal suspend fun runResolverForBuiltinInvokeExtensionWithImplicitArgument(
info: CallInfo, info: CallInfo,
invokeReceiverValue: ExpressionReceiverValue, invokeReceiverValue: ExpressionReceiverValue
manager: TowerResolveManager
) { ) {
for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) { for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) {
val parentGroup = TowerGroup.Implicit(depth) val parentGroup = TowerGroup.Implicit(depth)
@@ -206,26 +206,26 @@ internal class LevelHandler(
invokeBuiltinExtensionMode -> { invokeBuiltinExtensionMode -> {
enqueueResolverTask { enqueueResolverTask {
towerResolverSession.runResolverForBuiltinInvokeExtensionWithExplicitArgument( towerResolverSession.runResolverForBuiltinInvokeExtensionWithExplicitArgument(
invokeFunctionInfo, explicitReceiver, manager invokeFunctionInfo, explicitReceiver
) )
} }
} }
useImplicitReceiverAsBuiltinInvokeArgument -> { useImplicitReceiverAsBuiltinInvokeArgument -> {
enqueueResolverTask { enqueueResolverTask {
towerResolverSession.runResolverForBuiltinInvokeExtensionWithImplicitArgument( towerResolverSession.runResolverForBuiltinInvokeExtensionWithImplicitArgument(
invokeFunctionInfo, explicitReceiver, manager invokeFunctionInfo, explicitReceiver
) )
} }
enqueueResolverTask { enqueueResolverTask {
towerResolverSession.runResolverForInvoke( towerResolverSession.runResolverForInvoke(
invokeFunctionInfo, explicitReceiver, manager invokeFunctionInfo, explicitReceiver
) )
} }
} }
else -> { else -> {
enqueueResolverTask { enqueueResolverTask {
towerResolverSession.runResolverForInvoke( towerResolverSession.runResolverForInvoke(
invokeFunctionInfo, explicitReceiver, manager invokeFunctionInfo, explicitReceiver
) )
} }
} }