From 3e32f21e7e07683d811d4a1790e89ccd3eaa2efd Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 27 Mar 2020 16:57:47 +0300 Subject: [PATCH] FIR: Replace extension receiver with explicit parameter It will help to make code more explicit in the following commits --- .../resolve/calls/FirTowerResolverSession.kt | 11 +++----- .../fir/resolve/calls/TowerLevelHandler.kt | 28 +++++++++---------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolverSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolverSession.kt index 54c53f6a9f3..e8d1575ca7a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolverSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolverSession.kt @@ -86,15 +86,12 @@ class FirTowerResolverSession internal constructor( val levelHandler = LevelHandler( 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( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerLevelHandler.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerLevelHandler.kt index 7ded92b79a7..fe50065b5c2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerLevelHandler.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerLevelHandler.kt @@ -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 val processor = TowerScopeLevelProcessor( @@ -90,19 +90,19 @@ internal class LevelHandler( ) when (info.callKind) { 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 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 -> { val invokeBuiltinExtensionMode = invokeResolveMode == InvokeResolveMode.RECEIVER_FOR_INVOKE_BUILTIN_EXTENSION 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 || resultCollector.isSuccess() @@ -119,9 +119,9 @@ internal class LevelHandler( group ) callResolutionContext.invokeReceiverCollector.newDataSet() - result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, invokeReceiverProcessor) - if (this !is ScopeTowerLevel || this.extensionReceiver == null) { - result += processElementsByName(TowerScopeLevel.Token.Objects, info.name, invokeReceiverProcessor) + result += towerLevel.processElementsByName(TowerScopeLevel.Token.Properties, info.name, invokeReceiverProcessor) + if (towerLevel !is ScopeTowerLevel || towerLevel.extensionReceiver == null) { + result += towerLevel.processElementsByName(TowerScopeLevel.Token.Objects, info.name, invokeReceiverProcessor) } if (callResolutionContext.invokeReceiverCollector.isSuccess()) { @@ -134,7 +134,7 @@ internal class LevelHandler( val stubReceiverValue = ExpressionReceiverValue(stubReceiver) val stubProcessor = TowerScopeLevelProcessor( info.explicitReceiver, - if (this is MemberScopeTowerLevel && dispatchReceiver is AbstractExplicitReceiver<*>) { + if (towerLevel is MemberScopeTowerLevel && towerLevel.dispatchReceiver is AbstractExplicitReceiver<*>) { ExplicitReceiverKind.DISPATCH_RECEIVER } else { ExplicitReceiverKind.EXTENSION_RECEIVER @@ -142,19 +142,19 @@ internal class LevelHandler( resultCollector, callResolutionContext.stubReceiverCandidateFactory!!, group ) - val towerLevelWithStubReceiver = replaceReceiverValue(stubReceiverValue) + val towerLevelWithStubReceiver = towerLevel.replaceReceiverValue(stubReceiverValue) with(towerLevelWithStubReceiver) { result += processElementsByName(TowerScopeLevel.Token.Functions, info.name, stubProcessor) result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, stubProcessor) } // NB: we don't perform this for implicit Unit if (!resultCollector.isSuccess() && info.explicitReceiver?.typeRef !is FirImplicitBuiltinTypeRef) { - result += processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor) - result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor) + result += towerLevel.processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor) + result += towerLevel.processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor) } } else { - result += processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor) - result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor) + result += towerLevel.processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor) + result += towerLevel.processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor) } } else -> {