FIR: Extract processLevelForRegularInvoke

This commit is contained in:
Denis Zharkov
2020-03-31 16:09:33 +03:00
parent 19e0cf570c
commit b52dd8e680
@@ -478,20 +478,18 @@ class FirTowerResolverSession internal constructor(
invokeReceiverValue: ExpressionReceiverValue, invokeReceiverValue: ExpressionReceiverValue,
invokeOnGivenReceiverCandidateFactory: CandidateFactory invokeOnGivenReceiverCandidateFactory: CandidateFactory
) { ) {
processLevel( processLevelForRegularInvoke(
invokeReceiverValue.toMemberScopeTowerLevel(), invokeReceiverValue.toMemberScopeTowerLevel(),
info, TowerGroup.Member, info, TowerGroup.Member,
ExplicitReceiverKind.DISPATCH_RECEIVER, ExplicitReceiverKind.DISPATCH_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER,
invokeOnGivenReceiverCandidateFactory invokeOnGivenReceiverCandidateFactory
) )
for ((index, localScope) in localScopes.withIndex()) { for ((index, localScope) in localScopes.withIndex()) {
processLevel( processLevelForRegularInvoke(
localScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue), localScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue),
info, TowerGroup.Local(index), info, TowerGroup.Local(index),
ExplicitReceiverKind.EXTENSION_RECEIVER, ExplicitReceiverKind.EXTENSION_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER,
invokeOnGivenReceiverCandidateFactory invokeOnGivenReceiverCandidateFactory
) )
} }
@@ -499,26 +497,32 @@ class FirTowerResolverSession internal constructor(
for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) { for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) {
// NB: companions are processed via implicitReceiverValues! // NB: companions are processed via implicitReceiverValues!
val parentGroup = TowerGroup.Implicit(depth) val parentGroup = TowerGroup.Implicit(depth)
processLevel( processLevelForRegularInvoke(
implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = invokeReceiverValue), implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = invokeReceiverValue),
info, parentGroup.Member, info, parentGroup.Member,
ExplicitReceiverKind.EXTENSION_RECEIVER, ExplicitReceiverKind.EXTENSION_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER,
invokeOnGivenReceiverCandidateFactory invokeOnGivenReceiverCandidateFactory
) )
} }
for ((index, topLevelScope) in topLevelScopes.withIndex()) { for ((index, topLevelScope) in topLevelScopes.withIndex()) {
processLevel( processLevelForRegularInvoke(
topLevelScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue), topLevelScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue),
info, TowerGroup.Top(index), info, TowerGroup.Top(index),
ExplicitReceiverKind.EXTENSION_RECEIVER, ExplicitReceiverKind.EXTENSION_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER,
invokeOnGivenReceiverCandidateFactory invokeOnGivenReceiverCandidateFactory
) )
} }
} }
private suspend fun processLevelForRegularInvoke(
towerLevel: SessionBasedTowerLevel,
callInfo: CallInfo,
group: TowerGroup,
explicitReceiverKind: ExplicitReceiverKind,
candidateFactory: CandidateFactory
) = processLevel(towerLevel, callInfo, group, explicitReceiverKind, InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER, candidateFactory)
// 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
private suspend fun runResolverForBuiltinInvokeExtensionWithExplicitArgument( private suspend fun runResolverForBuiltinInvokeExtensionWithExplicitArgument(
info: CallInfo, info: CallInfo,