From 9a070ad4f699315c30c81a22d2a26997bd3c3c94 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Fri, 18 Feb 2022 18:40:41 +0300 Subject: [PATCH] FIR: Get rid of SessionBasedTowerLevel --- .../tower/FirInvokeResolveTowerExtension.kt | 2 +- .../calls/tower/FirTowerResolveTask.kt | 11 ++++---- .../resolve/calls/tower/TowerLevelHandler.kt | 2 +- .../fir/resolve/calls/tower/TowerLevels.kt | 28 +++++++------------ 4 files changed, 17 insertions(+), 26 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirInvokeResolveTowerExtension.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirInvokeResolveTowerExtension.kt index b22c63c622f..059a389166a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirInvokeResolveTowerExtension.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirInvokeResolveTowerExtension.kt @@ -436,7 +436,7 @@ private class InvokeFunctionResolveTask( } private suspend fun processLevelForRegularInvoke( - towerLevel: SessionBasedTowerLevel, + towerLevel: TowerScopeLevel, callInfo: CallInfo, group: TowerGroup, explicitReceiverKind: ExplicitReceiverKind diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolveTask.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolveTask.kt index 6776631a81a..1bc1b5975dd 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolveTask.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolveTask.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.resolve.calls.tower -import org.jetbrains.kotlin.fir.util.asReversedFrozen import org.jetbrains.kotlin.fir.declarations.FirTowerDataContext import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression @@ -18,6 +17,7 @@ import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.FirWhenSubjectImportingScope import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef +import org.jetbrains.kotlin.fir.util.asReversedFrozen import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind import org.jetbrains.kotlin.resolve.descriptorUtil.HIDES_MEMBERS_NAME_LIST @@ -66,7 +66,7 @@ internal abstract class FirBaseTowerResolveTask( open fun onSuccessfulLevel(towerGroup: TowerGroup) {} protected suspend inline fun processLevel( - towerLevel: SessionBasedTowerLevel, + towerLevel: TowerScopeLevel, callInfo: CallInfo, group: TowerGroup, explicitReceiverKind: ExplicitReceiverKind = ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, @@ -82,7 +82,7 @@ internal abstract class FirBaseTowerResolveTask( withHideMembersOnly: Boolean = false, includeInnerConstructors: Boolean = extensionReceiver != null, ): ScopeTowerLevel = ScopeTowerLevel( - session, components, this, + components, this, extensionReceiver, withHideMembersOnly, includeInnerConstructors ) @@ -90,9 +90,8 @@ internal abstract class FirBaseTowerResolveTask( extensionReceiver: ReceiverValue? = null, implicitExtensionInvokeMode: Boolean = false ) = MemberScopeTowerLevel( - session, components, this, + components, this, extensionReceiver, implicitExtensionInvokeMode, - scopeSession = components.scopeSession ) protected inline fun enumerateTowerLevels( @@ -126,7 +125,7 @@ internal abstract class FirBaseTowerResolveTask( * @return true if level is empty */ private suspend fun processLevel( - towerLevel: SessionBasedTowerLevel, + towerLevel: TowerScopeLevel, callInfo: CallInfo, group: TowerGroup, explicitReceiverKind: ExplicitReceiverKind diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevelHandler.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevelHandler.kt index ff27ae8b25b..b25c8cdc828 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevelHandler.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevelHandler.kt @@ -29,7 +29,7 @@ internal class TowerLevelHandler { info: CallInfo, explicitReceiverKind: ExplicitReceiverKind, group: TowerGroup, - towerLevel: SessionBasedTowerLevel + towerLevel: TowerScopeLevel ): ProcessResult { processResult = ProcessResult.SCOPE_EMPTY val processor = diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt index 727262d44a5..e3aed94d65a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt @@ -65,13 +65,6 @@ abstract class TowerScopeLevel { } } -abstract class SessionBasedTowerLevel(val session: FirSession) : TowerScopeLevel() { - protected fun FirCallableSymbol<*>.hasConsistentExtensionReceiver(extensionReceiver: Receiver?): Boolean { - return (extensionReceiver != null) == hasExtensionReceiver() - } - - open fun replaceReceiverValue(receiverValue: ReceiverValue) = this -} // This is more like "dispatch receiver-based tower level" // Here we always have an explicit or implicit dispatch receiver, and can access members of its scope @@ -80,13 +73,14 @@ abstract class SessionBasedTowerLevel(val session: FirSession) : TowerScopeLevel // So: extension receiver = either none, if dispatch receiver = explicit receiver, // or given implicit or explicit receiver, otherwise class MemberScopeTowerLevel( - session: FirSession, private val bodyResolveComponents: BodyResolveComponents, val dispatchReceiverValue: ReceiverValue, private val extensionReceiver: ReceiverValue? = null, private val implicitExtensionInvokeMode: Boolean = false, - private val scopeSession: ScopeSession -) : SessionBasedTowerLevel(session) { +) : TowerScopeLevel() { + private val scopeSession: ScopeSession get() = bodyResolveComponents.scopeSession + private val session: FirSession get() = bodyResolveComponents.session + private fun > processMembers( output: TowerScopeLevelProcessor, processScopeMembers: FirScope.(processor: (T) -> Unit) -> Unit @@ -205,12 +199,6 @@ class MemberScopeTowerLevel( return ProcessResult.FOUND } - override fun replaceReceiverValue(receiverValue: ReceiverValue): SessionBasedTowerLevel { - return MemberScopeTowerLevel( - session, bodyResolveComponents, receiverValue, extensionReceiver, implicitExtensionInvokeMode, scopeSession - ) - } - private inline fun withMemberCallLookup( lookupTracker: FirLookupTrackerComponent?, info: CallInfo, @@ -232,6 +220,10 @@ class MemberScopeTowerLevel( } } } + + private fun FirCallableSymbol<*>.hasConsistentExtensionReceiver(extensionReceiver: Receiver?): Boolean { + return (extensionReceiver != null) == hasExtensionReceiver() + } } // This is more like "scope-based tower level" @@ -242,13 +234,13 @@ class MemberScopeTowerLevel( // So: extension receiver = either none or explicit // (if explicit receiver exists, it always *should* be an extension receiver) class ScopeTowerLevel( - session: FirSession, private val bodyResolveComponents: BodyResolveComponents, val scope: FirScope, val extensionReceiver: ReceiverValue?, private val withHideMembersOnly: Boolean, private val includeInnerConstructors: Boolean -) : SessionBasedTowerLevel(session) { +) : TowerScopeLevel() { + private val session: FirSession get() = bodyResolveComponents.session private fun dispatchReceiverValue(candidate: FirCallableSymbol<*>): ReceiverValue? { candidate.fir.importedFromObjectData?.let { data ->