FIR: Refactor FirTowerResolverSession.enumerateTowerLevels

- Leave only onScope callback as onLocalScope/onNonLocalScope are the same in most cases
- Pass towerGroup to callbacks as they are the same all the time
This commit is contained in:
Denis Zharkov
2020-05-15 12:09:06 +03:00
parent 475671563b
commit 5bbb459993
@@ -232,31 +232,26 @@ class FirTowerResolverSession internal constructor(
) { ) {
processExtensionsThatHideMembers(info, explicitReceiverValue = null) processExtensionsThatHideMembers(info, explicitReceiverValue = null)
val emptyTopLevelScopes = mutableSetOf<FirScope>() val emptyScopes = mutableSetOf<FirScope>()
val implicitReceiverValuesWithEmptyScopes = mutableSetOf<ImplicitReceiverValue<*>>() val implicitReceiverValuesWithEmptyScopes = mutableSetOf<ImplicitReceiverValue<*>>()
enumerateTowerLevels( enumerateTowerLevels(
onLocalScope = { index, scope -> onScope = l@{ scope, group ->
processLevel(
scope.toScopeTowerLevel(), info, TowerGroup.Local(index)
)
},
onNonLocalScope = l@{ index, scope ->
// 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 && scope in emptyTopLevelScopes) return@l if (info.callKind != CallKind.VariableAccess && scope in emptyScopes) return@l
processLevel( processLevel(
scope.toScopeTowerLevel(), info, TowerGroup.NonLocal(index) scope.toScopeTowerLevel(), info, group
) )
}, },
onImplicitReceiver = { index, receiver -> onImplicitReceiver = { receiver, group ->
processCandidatesWithGivenImplicitReceiverAsValue( processCandidatesWithGivenImplicitReceiverAsValue(
receiver, receiver,
info, info,
TowerGroup.Implicit(index), group,
implicitReceiverValuesWithEmptyScopes, implicitReceiverValuesWithEmptyScopes,
emptyTopLevelScopes emptyScopes
) )
} }
) )
@@ -310,7 +305,7 @@ class FirTowerResolverSession internal constructor(
info: CallInfo, info: CallInfo,
parentGroup: TowerGroup, parentGroup: TowerGroup,
implicitReceiverValuesWithEmptyScopes: MutableSet<ImplicitReceiverValue<*>>, implicitReceiverValuesWithEmptyScopes: MutableSet<ImplicitReceiverValue<*>>,
emptyTopLevelScopes: MutableSet<FirScope> emptyScopes: MutableSet<FirScope>
) { ) {
val implicitResult = processLevel( val implicitResult = processLevel(
receiver.toMemberScopeTowerLevel(), info, parentGroup.Member receiver.toMemberScopeTowerLevel(), info, parentGroup.Member
@@ -321,29 +316,24 @@ class FirTowerResolverSession internal constructor(
} }
enumerateTowerLevels( enumerateTowerLevels(
onLocalScope = { index, scope -> parentGroup,
processLevel( onScope = l@{ scope, group ->
scope.toScopeTowerLevel(extensionReceiver = receiver), if (scope in emptyScopes) return@l
info, parentGroup.Local(index)
)
},
onNonLocalScope = l@{ index, scope ->
if (scope in emptyTopLevelScopes) return@l
val result = processLevel( val result = processLevel(
scope.toScopeTowerLevel(extensionReceiver = receiver), scope.toScopeTowerLevel(extensionReceiver = receiver),
info, parentGroup.NonLocal(index) info, group
) )
if (result == ProcessorAction.NONE) { if (result == ProcessorAction.NONE) {
emptyTopLevelScopes += scope emptyScopes += scope
} }
}, },
onImplicitReceiver = l@{ index, implicitReceiverValue -> onImplicitReceiver = l@{ implicitReceiverValue, group ->
if (implicitReceiverValue in implicitReceiverValuesWithEmptyScopes) return@l if (implicitReceiverValue in implicitReceiverValuesWithEmptyScopes) return@l
processLevel( processLevel(
implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = receiver), implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = receiver),
info, parentGroup.Implicit(index) info, group
) )
} }
) )
@@ -371,44 +361,36 @@ class FirTowerResolverSession internal constructor(
} }
enumerateTowerLevels( enumerateTowerLevels(
onLocalScope = { index, scope -> onScope = { scope, group ->
processScopeForExplicitReceiver( processScopeForExplicitReceiver(
scope, scope,
explicitReceiverValue, explicitReceiverValue,
info, info,
TowerGroup.Local(index) group
) )
}, },
onNonLocalScope = { index, scope -> onImplicitReceiver = { implicitReceiverValue, group ->
processScopeForExplicitReceiver( processCombinationOfReceivers(implicitReceiverValue, explicitReceiverValue, info, group)
scope,
explicitReceiverValue,
info,
TowerGroup.NonLocal(index)
)
},
onImplicitReceiver = { index, implicitReceiverValue ->
processCombinationOfReceivers(implicitReceiverValue, explicitReceiverValue, info, index)
} }
) )
} }
private inline fun enumerateTowerLevels( private inline fun enumerateTowerLevels(
onLocalScope: (Int, FirScope) -> Unit, parentGroup: TowerGroup = TowerGroup.EmptyRoot,
onNonLocalScope: (Int, FirScope) -> Unit, onScope: (FirScope, TowerGroup) -> Unit,
onImplicitReceiver: (Int, ImplicitReceiverValue<*>) -> Unit onImplicitReceiver: (ImplicitReceiverValue<*>, TowerGroup) -> Unit,
) { ) {
for ((index, localScope) in localScopes.withIndex()) { for ((index, localScope) in localScopes.withIndex()) {
onLocalScope(index, localScope) onScope(localScope, parentGroup.Local(index))
} }
for ((depth, lexical) in nonLocalTowerDataElements.withIndex()) { for ((depth, lexical) in nonLocalTowerDataElements.withIndex()) {
if (!lexical.isLocal && lexical.scope != null) { if (!lexical.isLocal && lexical.scope != null) {
onNonLocalScope(depth, lexical.scope) onScope(lexical.scope, parentGroup.NonLocal(depth))
} }
lexical.implicitReceiver?.let { implicitReceiverValue -> lexical.implicitReceiver?.let { implicitReceiverValue ->
onImplicitReceiver(depth, implicitReceiverValue) onImplicitReceiver(implicitReceiverValue, parentGroup.Implicit(depth))
} }
} }
} }
@@ -435,11 +417,8 @@ class FirTowerResolverSession internal constructor(
implicitReceiverValue: ImplicitReceiverValue<*>, implicitReceiverValue: ImplicitReceiverValue<*>,
explicitReceiverValue: ExpressionReceiverValue, explicitReceiverValue: ExpressionReceiverValue,
info: CallInfo, info: CallInfo,
depth: Int parentGroup: TowerGroup
) { ) {
// NB: companions are processed via implicitReceiverValues!
val parentGroup = TowerGroup.Implicit(depth)
// Member extensions // Member extensions
processLevel( processLevel(
implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = explicitReceiverValue), implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = explicitReceiverValue),
@@ -451,22 +430,16 @@ class FirTowerResolverSession internal constructor(
) )
enumerateTowerLevels( enumerateTowerLevels(
onLocalScope = { index, scope -> onScope = { scope, group ->
processLevelForPropertyWithInvoke( processLevelForPropertyWithInvoke(
scope.toScopeTowerLevel(extensionReceiver = implicitReceiverValue), scope.toScopeTowerLevel(extensionReceiver = implicitReceiverValue),
info, parentGroup.Local(index) info, group
) )
}, },
onNonLocalScope = { index, scope -> onImplicitReceiver = { receiver, group ->
processLevelForPropertyWithInvoke(
scope.toScopeTowerLevel(extensionReceiver = implicitReceiverValue),
info, parentGroup.NonLocal(index)
)
},
onImplicitReceiver = { index, receiver ->
processLevelForPropertyWithInvoke( processLevelForPropertyWithInvoke(
receiver.toMemberScopeTowerLevel(extensionReceiver = implicitReceiverValue), receiver.toMemberScopeTowerLevel(extensionReceiver = implicitReceiverValue),
info, parentGroup.Implicit(index) info, group
) )
} }
) )
@@ -503,28 +476,19 @@ class FirTowerResolverSession internal constructor(
) )
enumerateTowerLevels( enumerateTowerLevels(
onLocalScope = { index, scope -> onScope = { scope, group ->
processLevelForRegularInvoke( processLevelForRegularInvoke(
scope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue), scope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue),
info, parentGroupForInvokeCandidates.Local(index), info, group,
ExplicitReceiverKind.EXTENSION_RECEIVER, ExplicitReceiverKind.EXTENSION_RECEIVER,
invokeOnGivenReceiverCandidateFactory invokeOnGivenReceiverCandidateFactory
) )
}, },
onNonLocalScope = { index, scope -> onImplicitReceiver = { receiver, group ->
processLevelForRegularInvoke(
scope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue),
info, parentGroupForInvokeCandidates.NonLocal(index),
ExplicitReceiverKind.EXTENSION_RECEIVER,
invokeOnGivenReceiverCandidateFactory
)
},
onImplicitReceiver = { index, receiver ->
// NB: companions are processed via implicitReceiverValues! // NB: companions are processed via implicitReceiverValues!
val group = parentGroupForInvokeCandidates.Implicit(index).Member
processLevelForRegularInvoke( processLevelForRegularInvoke(
receiver.toMemberScopeTowerLevel(extensionReceiver = invokeReceiverValue), receiver.toMemberScopeTowerLevel(extensionReceiver = invokeReceiverValue),
info, group, info, group.Member,
ExplicitReceiverKind.EXTENSION_RECEIVER, ExplicitReceiverKind.EXTENSION_RECEIVER,
invokeOnGivenReceiverCandidateFactory invokeOnGivenReceiverCandidateFactory
) )