FIR: Extract ReceiverValue.toMemberScopeTowerLevel

This commit is contained in:
Denis Zharkov
2020-03-25 12:46:34 +03:00
parent e2ca1f2af4
commit aeb3354a5b
@@ -88,6 +88,15 @@ class FirTowerResolver(
extensionReceiver, extensionsOnly, noInnerConstructors extensionReceiver, extensionsOnly, noInnerConstructors
) )
private fun ReceiverValue.toMemberScopeTowerLevel(
extensionReceiver: ReceiverValue? = null,
implicitExtensionInvokeMode: Boolean = false
) = MemberScopeTowerLevel(
session, components, this,
extensionReceiver, implicitExtensionInvokeMode,
scopeSession = components.scopeSession
)
private suspend fun processQualifierScopes( private suspend fun processQualifierScopes(
manager: TowerResolveManager, manager: TowerResolveManager,
info: CallInfo, qualifierReceiver: QualifierReceiver? info: CallInfo, qualifierReceiver: QualifierReceiver?
@@ -248,10 +257,7 @@ class FirTowerResolver(
emptyTopLevelScopes: MutableSet<FirScope> emptyTopLevelScopes: MutableSet<FirScope>
) { ) {
val implicitResult = manager.processLevel( val implicitResult = manager.processLevel(
MemberScopeTowerLevel( receiver.toMemberScopeTowerLevel(), info, parentGroup.Member
session,
components, dispatchReceiver = receiver, scopeSession = components.scopeSession
), info, parentGroup.Member
) )
if (implicitResult == ProcessorAction.NONE) { if (implicitResult == ProcessorAction.NONE) {
@@ -269,13 +275,8 @@ class FirTowerResolver(
if (!usable) continue if (!usable) continue
if (implicitDispatchReceiverValue in implicitReceiverValuesWithEmptyScopes) continue if (implicitDispatchReceiverValue in implicitReceiverValuesWithEmptyScopes) continue
manager.processLevel( manager.processLevel(
MemberScopeTowerLevel( implicitDispatchReceiverValue.toMemberScopeTowerLevel(extensionReceiver = receiver),
session, info, parentGroup.Implicit(dispatchDepth)
components,
dispatchReceiver = implicitDispatchReceiverValue,
extensionReceiver = receiver,
scopeSession = components.scopeSession
), info, parentGroup.Implicit(dispatchDepth)
) )
} }
@@ -328,9 +329,7 @@ class FirTowerResolver(
} }
manager.processLevel( manager.processLevel(
MemberScopeTowerLevel( explicitReceiverValue.toMemberScopeTowerLevel(), info, TowerGroup.Member, ExplicitReceiverKind.DISPATCH_RECEIVER
session, components, dispatchReceiver = explicitReceiverValue, scopeSession = components.scopeSession
), info, TowerGroup.Member, ExplicitReceiverKind.DISPATCH_RECEIVER
) )
val shouldProcessExplicitReceiverScopeOnly = val shouldProcessExplicitReceiverScopeOnly =
@@ -359,16 +358,11 @@ class FirTowerResolver(
val parentGroup = TowerGroup.Implicit(depth) val parentGroup = TowerGroup.Implicit(depth)
manager.processLevel( manager.processLevel(
MemberScopeTowerLevel( implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = explicitReceiverValue),
session, components, info, parentGroup.Member, ExplicitReceiverKind.EXTENSION_RECEIVER
dispatchReceiver = implicitReceiverValue, extensionReceiver = explicitReceiverValue,
scopeSession = components.scopeSession
), info, parentGroup.Member, ExplicitReceiverKind.EXTENSION_RECEIVER
) )
manager.processLevelForPropertyWithInvoke( manager.processLevelForPropertyWithInvoke(
MemberScopeTowerLevel( implicitReceiverValue.toMemberScopeTowerLevel(), info, parentGroup.Member
session, components, dispatchReceiver = implicitReceiverValue, scopeSession = components.scopeSession
), info, parentGroup.Member
) )
for ((localIndex, localScope) in nonEmptyLocalScopes.withIndex()) { for ((localIndex, localScope) in nonEmptyLocalScopes.withIndex()) {
manager.processLevelForPropertyWithInvoke( manager.processLevelForPropertyWithInvoke(
@@ -379,13 +373,8 @@ class FirTowerResolver(
for ((implicitDispatchReceiverValue, usable, dispatchDepth) in implicitReceivers) { for ((implicitDispatchReceiverValue, usable, dispatchDepth) in implicitReceivers) {
if (!usable) continue if (!usable) continue
manager.processLevelForPropertyWithInvoke( manager.processLevelForPropertyWithInvoke(
MemberScopeTowerLevel( implicitDispatchReceiverValue.toMemberScopeTowerLevel(extensionReceiver = implicitReceiverValue),
session, info, parentGroup.Implicit(dispatchDepth)
components,
dispatchReceiver = implicitDispatchReceiverValue,
extensionReceiver = implicitReceiverValue,
scopeSession = components.scopeSession
), info, parentGroup.Implicit(dispatchDepth)
) )
} }
for ((topIndex, topLevelScope) in topLevelScopes.withIndex()) { for ((topIndex, topLevelScope) in topLevelScopes.withIndex()) {
@@ -432,9 +421,7 @@ class FirTowerResolver(
manager: TowerResolveManager manager: TowerResolveManager
) { ) {
manager.processLevel( manager.processLevel(
MemberScopeTowerLevel( invokeReceiverValue.toMemberScopeTowerLevel(),
session, components, dispatchReceiver = invokeReceiverValue, scopeSession = components.scopeSession
),
info, TowerGroup.Member, info, TowerGroup.Member,
ExplicitReceiverKind.DISPATCH_RECEIVER, ExplicitReceiverKind.DISPATCH_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER
@@ -452,11 +439,8 @@ class FirTowerResolver(
// NB: companions are processed via implicitReceiverValues! // NB: companions are processed via implicitReceiverValues!
val parentGroup = TowerGroup.Implicit(depth) val parentGroup = TowerGroup.Implicit(depth)
manager.processLevel( manager.processLevel(
MemberScopeTowerLevel( implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = invokeReceiverValue),
session, components, info, parentGroup.Member,
dispatchReceiver = implicitReceiverValue, extensionReceiver = invokeReceiverValue,
scopeSession = components.scopeSession
), info, parentGroup.Member,
ExplicitReceiverKind.EXTENSION_RECEIVER, ExplicitReceiverKind.EXTENSION_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER
) )
@@ -478,10 +462,8 @@ class FirTowerResolver(
manager: TowerResolveManager manager: TowerResolveManager
) { ) {
manager.processLevel( manager.processLevel(
MemberScopeTowerLevel( invokeReceiverValue.toMemberScopeTowerLevel(),
session, components, dispatchReceiver = invokeReceiverValue, info, TowerGroup.Member,
scopeSession = components.scopeSession
), info, TowerGroup.Member,
ExplicitReceiverKind.DISPATCH_RECEIVER, ExplicitReceiverKind.DISPATCH_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER
) )
@@ -497,12 +479,11 @@ class FirTowerResolver(
if (!usable) continue if (!usable) continue
val parentGroup = TowerGroup.Implicit(depth) val parentGroup = TowerGroup.Implicit(depth)
manager.processLevel( manager.processLevel(
MemberScopeTowerLevel( invokeReceiverValue.toMemberScopeTowerLevel(
session, components, dispatchReceiver = invokeReceiverValue,
extensionReceiver = implicitReceiverValue, extensionReceiver = implicitReceiverValue,
implicitExtensionInvokeMode = true, implicitExtensionInvokeMode = true
scopeSession = components.scopeSession ),
), info, parentGroup.InvokeExtension, info, parentGroup.InvokeExtension,
ExplicitReceiverKind.DISPATCH_RECEIVER, ExplicitReceiverKind.DISPATCH_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER
) )
@@ -533,8 +514,6 @@ class FirTowerResolver(
} }
} }
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, manager) }
null -> manager.enqueueResolverTask { runResolverForNoReceiver(info, manager) } null -> manager.enqueueResolverTask { runResolverForNoReceiver(info, manager) }