From 08ee76b103a58a8a5281e014a12339c6e94e9077 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 26 Mar 2020 17:41:12 +0300 Subject: [PATCH] FIR: Introduce FirTowerResolver.implicitReceiversUsableAsValues --- .../fir/resolve/calls/FirTowerResolver.kt | 61 +++++++++++-------- 1 file changed, 36 insertions(+), 25 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 599f8d1349a..0367af6772d 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 @@ -44,24 +44,32 @@ class FirTowerResolver( private val collector = CandidateCollector(components, resolutionStageRunner) private val manager = TowerResolveManager(this) private lateinit var implicitReceivers: List + private lateinit var implicitReceiversUsableAsValues: List - private data class ImplicitReceiver(val receiver: ImplicitReceiverValue<*>, val usableAsValue: Boolean, val depth: Int) + private data class ImplicitReceiver( + val receiver: ImplicitReceiverValue<*>, + val depth: Int, + val usableAsValue: Boolean + ) - private fun prepareImplicitReceivers(implicitReceiverValues: List>): List { + private fun prepareImplicitReceivers(implicitReceiverValues: List>) { var depth = 0 var firstDispatchValue = true val explicitCompanions = mutableListOf() - implicitReceivers = implicitReceiverValues.mapNotNull { - val usableAsValue = when (it) { + val implicitReceiversUsableAsValues = mutableListOf() + implicitReceivers = implicitReceiverValues.mapNotNull { receiverValue -> + val usableAsValue = when (receiverValue) { is ImplicitExtensionReceiverValue -> true is ImplicitDispatchReceiverValue -> { - val symbol = it.boundSymbol + val symbol = receiverValue.boundSymbol val klass = symbol.fir as? FirRegularClass - if (!it.implicitCompanion && klass?.isCompanion == true) { + + if (!receiverValue.implicitCompanion && klass?.isCompanion == true) { explicitCompanions += klass.symbol } - if (firstDispatchValue && !it.inDelegated) { - if (!it.implicitCompanion && + + if (firstDispatchValue && !receiverValue.inDelegated) { + if (!receiverValue.implicitCompanion && klass?.isInner == false && !symbol.classId.isLocal ) { @@ -69,14 +77,23 @@ class FirTowerResolver( } true } else { - symbol.fir.classKind == ClassKind.OBJECT && !it.inDelegated + symbol.fir.classKind == ClassKind.OBJECT && !receiverValue.inDelegated + } + } + } + + if (receiverValue is ImplicitDispatchReceiverValue && receiverValue.implicitCompanion && receiverValue.boundSymbol in explicitCompanions) { + null + } else { + ImplicitReceiver(receiverValue, depth++, usableAsValue).also { + if (usableAsValue) { + implicitReceiversUsableAsValues.add(it) } } } - if (it is ImplicitDispatchReceiverValue && it.implicitCompanion && it.boundSymbol in explicitCompanions) null - else ImplicitReceiver(it, usableAsValue, depth++) } - return implicitReceivers + + this.implicitReceiversUsableAsValues = implicitReceiversUsableAsValues } private fun FirScope.toScopeTowerLevel( @@ -187,8 +204,7 @@ class FirTowerResolver( if (explicitReceiverValue != null) { processHideMembersLevel(explicitReceiverValue, topLevelScope, info, index, depth = null) } else { - for ((implicitReceiverValue, usableAsValue, depth) in implicitReceivers) { - if (!usableAsValue) continue + for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) { processHideMembersLevel(implicitReceiverValue, topLevelScope, info, index, depth) } } @@ -228,7 +244,7 @@ class FirTowerResolver( emptyTopLevelScopes: MutableSet ) { val implicitReceiverValuesWithEmptyScopes = mutableSetOf>() - for ((implicitReceiverValue, usableAsValue, depth) in implicitReceivers) { + for ((implicitReceiverValue, depth, usableAsValue) in implicitReceivers) { // NB: companions are processed via implicitReceiverValues! val parentGroup = TowerGroup.Implicit(depth) @@ -280,8 +296,7 @@ class FirTowerResolver( ) } - for ((implicitDispatchReceiverValue, usable, dispatchDepth) in implicitReceivers) { - if (!usable) continue + for ((implicitDispatchReceiverValue, dispatchDepth) in implicitReceiversUsableAsValues) { if (implicitDispatchReceiverValue in implicitReceiverValuesWithEmptyScopes) continue manager.processLevel( implicitDispatchReceiverValue.toMemberScopeTowerLevel(extensionReceiver = receiver), @@ -345,8 +360,7 @@ class FirTowerResolver( } } - for ((implicitReceiverValue, usableAsValue, depth) in implicitReceivers) { - if (!usableAsValue) continue + for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) { processCombinationOfReceivers(manager, implicitReceiverValue, explicitReceiverValue, info, depth, nonEmptyLocalScopes) } @@ -415,8 +429,7 @@ class FirTowerResolver( ) } - for ((implicitDispatchReceiverValue, usable, dispatchDepth) in implicitReceivers) { - if (!usable) continue + for ((implicitDispatchReceiverValue, dispatchDepth) in implicitReceiversUsableAsValues) { manager.processLevelForPropertyWithInvoke( implicitDispatchReceiverValue.toMemberScopeTowerLevel(extensionReceiver = implicitReceiverValue), info, parentGroup.Implicit(dispatchDepth) @@ -470,8 +483,7 @@ class FirTowerResolver( ) } - for ((implicitReceiverValue, usable, depth) in implicitReceivers) { - if (!usable) continue + for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) { // NB: companions are processed via implicitReceiverValues! val parentGroup = TowerGroup.Implicit(depth) manager.processLevel( @@ -512,8 +524,7 @@ class FirTowerResolver( invokeReceiverValue: ExpressionReceiverValue, manager: TowerResolveManager ) { - for ((implicitReceiverValue, usable, depth) in implicitReceivers) { - if (!usable) continue + for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) { val parentGroup = TowerGroup.Implicit(depth) manager.processLevel( invokeReceiverValue.toMemberScopeTowerLevel(