FIR: Minor. Reuse processExtensionsThatHideMembers
This commit is contained in:
+24
-24
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user