FIR: Minor. Reuse processExtensionsThatHideMembers

This commit is contained in:
Denis Zharkov
2020-03-25 15:55:47 +03:00
parent aeb3354a5b
commit 7843f7d3f0
@@ -144,7 +144,6 @@ class FirTowerResolver(
} }
} }
if (resolvedQualifier.symbol != null) { if (resolvedQualifier.symbol != null) {
val typeRef = resolvedQualifier.typeRef val typeRef = resolvedQualifier.typeRef
// NB: yet built-in Unit is used for "no-value" type // NB: yet built-in Unit is used for "no-value" type
@@ -165,7 +164,7 @@ class FirTowerResolver(
info: CallInfo, info: CallInfo,
manager: TowerResolveManager manager: TowerResolveManager
) { ) {
processExtensionsThatHideMembers(info, manager) processExtensionsThatHideMembers(info, manager, explicitReceiverValue = null)
val nonEmptyLocalScopes = mutableListOf<FirLocalScope>() val nonEmptyLocalScopes = mutableListOf<FirLocalScope>()
processLocalScopes(manager, info, nonEmptyLocalScopes) processLocalScopes(manager, info, nonEmptyLocalScopes)
@@ -177,7 +176,8 @@ class FirTowerResolver(
private suspend fun processExtensionsThatHideMembers( private suspend fun processExtensionsThatHideMembers(
info: CallInfo, info: CallInfo,
manager: TowerResolveManager manager: TowerResolveManager,
explicitReceiverValue: ReceiverValue?
) { ) {
val shouldProcessExtensionsBeforeMembers = val shouldProcessExtensionsBeforeMembers =
info.callKind == CallKind.Function && info.name in HIDES_MEMBERS_NAME_LIST info.callKind == CallKind.Function && info.name in HIDES_MEMBERS_NAME_LIST
@@ -185,18 +185,30 @@ class FirTowerResolver(
if (!shouldProcessExtensionsBeforeMembers) return if (!shouldProcessExtensionsBeforeMembers) return
for ((index, topLevelScope) in topLevelScopes.withIndex()) { for ((index, topLevelScope) in topLevelScopes.withIndex()) {
for ((implicitReceiverValue, usableAsValue, depth) in implicitReceivers) { if (explicitReceiverValue != null) {
if (!usableAsValue) continue manager.processHideMembersLevel(explicitReceiverValue, topLevelScope, info, index, depth = null)
manager.processLevel( } else {
topLevelScope.toScopeTowerLevel( for ((implicitReceiverValue, usableAsValue, depth) in implicitReceivers) {
extensionReceiver = implicitReceiverValue, extensionsOnly = true if (!usableAsValue) continue
), manager.processHideMembersLevel(implicitReceiverValue, topLevelScope, info, index, depth)
info, TowerGroup.TopPrioritized(index).Implicit(depth) }
)
} }
} }
} }
private suspend fun TowerResolveManager.processHideMembersLevel(
receiverValue: ReceiverValue,
topLevelScope: FirScope,
info: CallInfo,
index: Int,
depth: Int?
) = processLevel(
topLevelScope.toScopeTowerLevel(
extensionReceiver = receiverValue, extensionsOnly = true
),
info, TowerGroup.TopPrioritized(index).let { if (depth != null) it.Implicit(depth) else it }
)
private suspend fun processLocalScopes( private suspend fun processLocalScopes(
manager: TowerResolveManager, manager: TowerResolveManager,
info: CallInfo, info: CallInfo,
@@ -314,19 +326,7 @@ class FirTowerResolver(
) { ) {
val explicitReceiverValue = ExpressionReceiverValue(receiver) val explicitReceiverValue = ExpressionReceiverValue(receiver)
val shouldProcessExtensionsBeforeMembers = processExtensionsThatHideMembers(info, manager, explicitReceiverValue)
info.callKind == CallKind.Function && info.name in HIDES_MEMBERS_NAME_LIST
if (shouldProcessExtensionsBeforeMembers) {
// Special case (extension hides member)
for ((index, topLevelScope) in topLevelScopes.withIndex()) {
manager.processLevel(
topLevelScope.toScopeTowerLevel(
extensionReceiver = explicitReceiverValue, extensionsOnly = true
),
info, TowerGroup.TopPrioritized(index), ExplicitReceiverKind.EXTENSION_RECEIVER
)
}
}
manager.processLevel( manager.processLevel(
explicitReceiverValue.toMemberScopeTowerLevel(), info, TowerGroup.Member, ExplicitReceiverKind.DISPATCH_RECEIVER explicitReceiverValue.toMemberScopeTowerLevel(), info, TowerGroup.Member, ExplicitReceiverKind.DISPATCH_RECEIVER