FIR: Replace extension receiver with explicit parameter

It will help to make code more explicit in the following commits
This commit is contained in:
Denis Zharkov
2020-03-27 16:57:47 +03:00
parent b97ce3d6ef
commit 3e32f21e7e
2 changed files with 18 additions and 21 deletions
@@ -86,15 +86,12 @@ class FirTowerResolverSession internal constructor(
val levelHandler = val levelHandler =
LevelHandler( LevelHandler(
callInfo, explicitReceiverKind, group, callInfo, explicitReceiverKind, group,
callResolutionContext, manager, this, components callResolutionContext, manager, this, components,
) )
val result = with(levelHandler) {
towerLevel.handleLevel(invokeResolveMode) return levelHandler.handleLevel(towerLevel, invokeResolveMode).also {
manager.stopIfSuccess()
} }
manager.stopIfSuccess()
return result
} }
private suspend fun processLevelForPropertyWithInvoke( private suspend fun processLevelForPropertyWithInvoke(
@@ -75,7 +75,7 @@ internal class LevelHandler(
} }
} }
fun SessionBasedTowerLevel.handleLevel(invokeResolveMode: InvokeResolveMode? = null): ProcessorAction { fun handleLevel(towerLevel: SessionBasedTowerLevel, invokeResolveMode: InvokeResolveMode? = null): ProcessorAction {
var result = ProcessorAction.NONE var result = ProcessorAction.NONE
val processor = val processor =
TowerScopeLevelProcessor( TowerScopeLevelProcessor(
@@ -90,19 +90,19 @@ internal class LevelHandler(
) )
when (info.callKind) { when (info.callKind) {
CallKind.VariableAccess -> { CallKind.VariableAccess -> {
result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor) result += towerLevel.processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor)
// TODO: more accurate condition, or process properties/object in some other way // TODO: more accurate condition, or process properties/object in some other way
if (!resultCollector.isSuccess() && if (!resultCollector.isSuccess() &&
(this !is ScopeTowerLevel || this.extensionReceiver == null) (towerLevel !is ScopeTowerLevel || towerLevel.extensionReceiver == null)
) { ) {
result += processElementsByName(TowerScopeLevel.Token.Objects, info.name, processor) result += towerLevel.processElementsByName(TowerScopeLevel.Token.Objects, info.name, processor)
} }
} }
CallKind.Function -> { CallKind.Function -> {
val invokeBuiltinExtensionMode = val invokeBuiltinExtensionMode =
invokeResolveMode == InvokeResolveMode.RECEIVER_FOR_INVOKE_BUILTIN_EXTENSION invokeResolveMode == InvokeResolveMode.RECEIVER_FOR_INVOKE_BUILTIN_EXTENSION
if (!invokeBuiltinExtensionMode) { if (!invokeBuiltinExtensionMode) {
result += processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor) result += towerLevel.processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor)
} }
if (invokeResolveMode == InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER || if (invokeResolveMode == InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER ||
resultCollector.isSuccess() resultCollector.isSuccess()
@@ -119,9 +119,9 @@ internal class LevelHandler(
group group
) )
callResolutionContext.invokeReceiverCollector.newDataSet() callResolutionContext.invokeReceiverCollector.newDataSet()
result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, invokeReceiverProcessor) result += towerLevel.processElementsByName(TowerScopeLevel.Token.Properties, info.name, invokeReceiverProcessor)
if (this !is ScopeTowerLevel || this.extensionReceiver == null) { if (towerLevel !is ScopeTowerLevel || towerLevel.extensionReceiver == null) {
result += processElementsByName(TowerScopeLevel.Token.Objects, info.name, invokeReceiverProcessor) result += towerLevel.processElementsByName(TowerScopeLevel.Token.Objects, info.name, invokeReceiverProcessor)
} }
if (callResolutionContext.invokeReceiverCollector.isSuccess()) { if (callResolutionContext.invokeReceiverCollector.isSuccess()) {
@@ -134,7 +134,7 @@ internal class LevelHandler(
val stubReceiverValue = ExpressionReceiverValue(stubReceiver) val stubReceiverValue = ExpressionReceiverValue(stubReceiver)
val stubProcessor = TowerScopeLevelProcessor( val stubProcessor = TowerScopeLevelProcessor(
info.explicitReceiver, info.explicitReceiver,
if (this is MemberScopeTowerLevel && dispatchReceiver is AbstractExplicitReceiver<*>) { if (towerLevel is MemberScopeTowerLevel && towerLevel.dispatchReceiver is AbstractExplicitReceiver<*>) {
ExplicitReceiverKind.DISPATCH_RECEIVER ExplicitReceiverKind.DISPATCH_RECEIVER
} else { } else {
ExplicitReceiverKind.EXTENSION_RECEIVER ExplicitReceiverKind.EXTENSION_RECEIVER
@@ -142,19 +142,19 @@ internal class LevelHandler(
resultCollector, resultCollector,
callResolutionContext.stubReceiverCandidateFactory!!, group callResolutionContext.stubReceiverCandidateFactory!!, group
) )
val towerLevelWithStubReceiver = replaceReceiverValue(stubReceiverValue) val towerLevelWithStubReceiver = towerLevel.replaceReceiverValue(stubReceiverValue)
with(towerLevelWithStubReceiver) { with(towerLevelWithStubReceiver) {
result += processElementsByName(TowerScopeLevel.Token.Functions, info.name, stubProcessor) result += processElementsByName(TowerScopeLevel.Token.Functions, info.name, stubProcessor)
result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, stubProcessor) result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, stubProcessor)
} }
// NB: we don't perform this for implicit Unit // NB: we don't perform this for implicit Unit
if (!resultCollector.isSuccess() && info.explicitReceiver?.typeRef !is FirImplicitBuiltinTypeRef) { if (!resultCollector.isSuccess() && info.explicitReceiver?.typeRef !is FirImplicitBuiltinTypeRef) {
result += processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor) result += towerLevel.processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor)
result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor) result += towerLevel.processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor)
} }
} else { } else {
result += processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor) result += towerLevel.processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor)
result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor) result += towerLevel.processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor)
} }
} }
else -> { else -> {