From e2ca1f2af496a2a1b22f743b30d5c893a4bd7a55 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 25 Mar 2020 11:50:54 +0300 Subject: [PATCH] FIR: Extract FirScope.toScopeTowerLevel --- .../fir/resolve/calls/FirTowerResolver.kt | 87 +++++++++---------- 1 file changed, 42 insertions(+), 45 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolver.kt index 35d1f89ecdf..8dda3938b26 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolver.kt @@ -79,6 +79,15 @@ class FirTowerResolver( return implicitReceivers } + private fun FirScope.toScopeTowerLevel( + extensionReceiver: ReceiverValue? = null, + extensionsOnly: Boolean = false, + noInnerConstructors: Boolean = false + ): ScopeTowerLevel = ScopeTowerLevel( + session, components, this, + extensionReceiver, extensionsOnly, noInnerConstructors + ) + private suspend fun processQualifierScopes( manager: TowerResolveManager, info: CallInfo, qualifierReceiver: QualifierReceiver? @@ -86,7 +95,7 @@ class FirTowerResolver( if (qualifierReceiver == null) return for ((depth, qualifierScope) in qualifierReceiver.callableScopes().withIndex()) { manager.processLevel( - ScopeTowerLevel(session, components, qualifierScope, noInnerConstructors = true), + qualifierScope.toScopeTowerLevel(noInnerConstructors = true), info.noStubReceiver(), TowerGroup.Qualifier(depth) ) } @@ -103,7 +112,7 @@ class FirTowerResolver( ) return val scope = qualifierReceiver.classifierScope() ?: return manager.processLevel( - ScopeTowerLevel(session, components, scope, noInnerConstructors = true), info.noStubReceiver(), + scope.toScopeTowerLevel(noInnerConstructors = true), info.noStubReceiver(), if (prioritized) TowerGroup.ClassifierPrioritized else TowerGroup.Classifier ) } @@ -170,9 +179,10 @@ class FirTowerResolver( for ((implicitReceiverValue, usableAsValue, depth) in implicitReceivers) { if (!usableAsValue) continue manager.processLevel( - ScopeTowerLevel( - session, components, topLevelScope, extensionReceiver = implicitReceiverValue, extensionsOnly = true - ), info, TowerGroup.TopPrioritized(index).Implicit(depth) + topLevelScope.toScopeTowerLevel( + extensionReceiver = implicitReceiverValue, extensionsOnly = true + ), + info, TowerGroup.TopPrioritized(index).Implicit(depth) ) } } @@ -185,7 +195,7 @@ class FirTowerResolver( ) { for ((index, localScope) in localScopes.withIndex()) { val result = manager.processLevel( - ScopeTowerLevel(session, components, localScope), info, TowerGroup.Local(index) + localScope.toScopeTowerLevel(), info, TowerGroup.Local(index) ) if (result != ProcessorAction.NONE) { nonEmptyLocalScopes += localScope @@ -220,11 +230,8 @@ class FirTowerResolver( val scope = implicitReceiverValue.scope(session, components.scopeSession) if (scope != null) { manager.processLevel( - ScopeTowerLevel( - session, - components, - FirStaticScope(scope) - ), info, parentGroup.Static(depth) + FirStaticScope(scope).toScopeTowerLevel(), + info, parentGroup.Static(depth) ) } } @@ -253,9 +260,8 @@ class FirTowerResolver( for ((localIndex, localScope) in nonEmptyLocalScopes.withIndex()) { manager.processLevel( - ScopeTowerLevel( - session, components, localScope, extensionReceiver = receiver - ), info, parentGroup.Local(localIndex) + localScope.toScopeTowerLevel(extensionReceiver = receiver), + info, parentGroup.Local(localIndex) ) } @@ -276,10 +282,8 @@ class FirTowerResolver( for ((topIndex, topLevelScope) in topLevelScopes.withIndex()) { if (topLevelScope in emptyTopLevelScopes) continue val result = manager.processLevel( - ScopeTowerLevel( - session, - components, topLevelScope, extensionReceiver = receiver - ), info, parentGroup.Top(topIndex) + topLevelScope.toScopeTowerLevel(extensionReceiver = receiver), + info, parentGroup.Top(topIndex) ) if (result == ProcessorAction.NONE) { emptyTopLevelScopes += topLevelScope @@ -297,7 +301,7 @@ class FirTowerResolver( // because we do not search for objects if we have extension receiver if (info.callKind != CallKind.VariableAccess && topLevelScope in emptyTopLevelScopes) continue manager.processLevel( - ScopeTowerLevel(session, components, topLevelScope), info, TowerGroup.Top(index) + topLevelScope.toScopeTowerLevel(), info, TowerGroup.Top(index) ) } } @@ -315,9 +319,10 @@ class FirTowerResolver( // Special case (extension hides member) for ((index, topLevelScope) in topLevelScopes.withIndex()) { manager.processLevel( - ScopeTowerLevel( - session, components, topLevelScope, extensionReceiver = explicitReceiverValue, extensionsOnly = true - ), info, TowerGroup.TopPrioritized(index), ExplicitReceiverKind.EXTENSION_RECEIVER + topLevelScope.toScopeTowerLevel( + extensionReceiver = explicitReceiverValue, extensionsOnly = true + ), + info, TowerGroup.TopPrioritized(index), ExplicitReceiverKind.EXTENSION_RECEIVER ) } } @@ -338,15 +343,14 @@ class FirTowerResolver( val nonEmptyLocalScopes = mutableListOf() for ((index, localScope) in localScopes.withIndex()) { val result = manager.processLevel( - ScopeTowerLevel( - session, components, localScope, extensionReceiver = explicitReceiverValue - ), info, TowerGroup.Local(index), ExplicitReceiverKind.EXTENSION_RECEIVER + localScope.toScopeTowerLevel(extensionReceiver = explicitReceiverValue), + info, TowerGroup.Local(index), ExplicitReceiverKind.EXTENSION_RECEIVER ) if (result != ProcessorAction.NONE) { nonEmptyLocalScopes += localScope } manager.processLevelForPropertyWithInvoke( - ScopeTowerLevel(session, components, localScope), info, TowerGroup.Local(index) + localScope.toScopeTowerLevel(), info, TowerGroup.Local(index) ) } for ((implicitReceiverValue, usableAsValue, depth) in implicitReceivers) { @@ -368,9 +372,8 @@ class FirTowerResolver( ) for ((localIndex, localScope) in nonEmptyLocalScopes.withIndex()) { manager.processLevelForPropertyWithInvoke( - ScopeTowerLevel( - session, components, localScope, extensionReceiver = implicitReceiverValue - ), info, parentGroup.Local(localIndex) + localScope.toScopeTowerLevel(extensionReceiver = implicitReceiverValue), + info, parentGroup.Local(localIndex) ) } for ((implicitDispatchReceiverValue, usable, dispatchDepth) in implicitReceivers) { @@ -387,21 +390,19 @@ class FirTowerResolver( } for ((topIndex, topLevelScope) in topLevelScopes.withIndex()) { manager.processLevelForPropertyWithInvoke( - ScopeTowerLevel( - session, components, topLevelScope, extensionReceiver = implicitReceiverValue - ), info, parentGroup.Top(topIndex) + topLevelScope.toScopeTowerLevel(extensionReceiver = implicitReceiverValue), + info, parentGroup.Top(topIndex) ) } } for ((index, topLevelScope) in topLevelScopes.withIndex()) { manager.processLevel( - ScopeTowerLevel( - session, components, topLevelScope, extensionReceiver = explicitReceiverValue - ), info, TowerGroup.Top(index), ExplicitReceiverKind.EXTENSION_RECEIVER + topLevelScope.toScopeTowerLevel(extensionReceiver = explicitReceiverValue), + info, TowerGroup.Top(index), ExplicitReceiverKind.EXTENSION_RECEIVER ) manager.processLevelForPropertyWithInvoke( - ScopeTowerLevel(session, components, topLevelScope), info, TowerGroup.Top(index) + topLevelScope.toScopeTowerLevel(), info, TowerGroup.Top(index) ) } @@ -420,9 +421,8 @@ class FirTowerResolver( else -> null } ?: return manager.processLevel( - ScopeTowerLevel( - session, components, scope - ), info, TowerGroup.Member, explicitReceiverKind = ExplicitReceiverKind.DISPATCH_RECEIVER + scope.toScopeTowerLevel(), + info, TowerGroup.Member, explicitReceiverKind = ExplicitReceiverKind.DISPATCH_RECEIVER ) } @@ -441,9 +441,7 @@ class FirTowerResolver( ) for ((index, localScope) in localScopes.withIndex()) { manager.processLevel( - ScopeTowerLevel( - session, components, localScope, extensionReceiver = invokeReceiverValue - ), + localScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue), info, TowerGroup.Local(index), ExplicitReceiverKind.EXTENSION_RECEIVER, InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER @@ -465,9 +463,8 @@ class FirTowerResolver( } for ((index, topLevelScope) in topLevelScopes.withIndex()) { manager.processLevel( - ScopeTowerLevel( - session, components, topLevelScope, extensionReceiver = invokeReceiverValue - ), info, TowerGroup.Top(index), + topLevelScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue), + info, TowerGroup.Top(index), ExplicitReceiverKind.EXTENSION_RECEIVER, InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER )