From bf08755969d336ca4a8fbacb7f2f6aa2b4be8a99 Mon Sep 17 00:00:00 2001 From: Cuihtlauac ALVARADO Date: Thu, 21 Jun 2018 11:13:39 +0200 Subject: [PATCH] Factor duplicated code. Move SimpleScopeTowerProcessor from TowerResolver into ScopeTowerProcessors. Lift code duplicated in functions: * ExplicitReceiverScopeTowerProcessor.simpleProcess() * QualifierScopeTowerProcessor.simpleProcess() * NoExplicitReceiverScopeTowerProcessor.simpleProcess() into AbstractSimpleScopeTowerProcessor. Turn it into a function and call it in the various context. Incidentally, now useless functions resolveAsMember() and resolveAsExtension() are removed. --- .../calls/tower/ScopeTowerProcessors.kt | 127 +++++++----------- .../resolve/calls/tower/TowerResolver.kt | 6 - 2 files changed, 49 insertions(+), 84 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt index 817bd8e664f..62f80e8352a 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt @@ -54,9 +54,31 @@ class SamePriorityCompositeScopeTowerProcessor( } +interface SimpleScopeTowerProcessor : ScopeTowerProcessor { + fun simpleProcess(data: TowerData): Collection + + override fun process(data: TowerData): List> = listOfNotNull(simpleProcess(data).takeIf { it.isNotEmpty() }) +} + internal abstract class AbstractSimpleScopeTowerProcessor( val candidateFactory: CandidateFactory -) : SimpleScopeTowerProcessor +) : SimpleScopeTowerProcessor { + fun resolve(collector: Collection, f:(Boolean)->Boolean, kind: ExplicitReceiverKind, receiver: ReceiverValueWithSmartCastInfo?) : Collection { + val result = mutableListOf() + for (candidate in collector) { + if (f(candidate.requiresExtensionReceiver)) { + result.add( + candidateFactory.createCandidate( + candidate, + kind, + extensionReceiver = receiver + ) + ) + } + } + return result + } +} private typealias CandidatesCollector = ScopeTowerLevel.(extensionReceiver: ReceiverValueWithSmartCastInfo?) -> Collection @@ -69,44 +91,20 @@ internal class ExplicitReceiverScopeTowerProcessor( ) : AbstractSimpleScopeTowerProcessor(context) { override fun simpleProcess(data: TowerData): Collection { return when (data) { - TowerData.Empty -> resolveAsMember() - is TowerData.TowerLevel -> resolveAsExtension(data.level) + TowerData.Empty -> resolve( + MemberScopeTowerLevel(scopeTower, explicitReceiver).collectCandidates(null), + { !it }, + ExplicitReceiverKind.DISPATCH_RECEIVER, + null) + is TowerData.TowerLevel -> resolve( + data.level.collectCandidates(explicitReceiver), + { it }, + ExplicitReceiverKind.EXTENSION_RECEIVER, + explicitReceiver) else -> emptyList() } } - private fun resolveAsMember(): Collection { - val members = mutableListOf() - for (memberCandidate in MemberScopeTowerLevel(scopeTower, explicitReceiver).collectCandidates(null)) { - if (!memberCandidate.requiresExtensionReceiver) { - members.add( - candidateFactory.createCandidate( - memberCandidate, - ExplicitReceiverKind.DISPATCH_RECEIVER, - extensionReceiver = null - ) - ) - } - } - return members - } - - private fun resolveAsExtension(level: ScopeTowerLevel): Collection { - val extensions = mutableListOf() - for (extensionCandidate in level.collectCandidates(explicitReceiver)) { - if (extensionCandidate.requiresExtensionReceiver) { - extensions.add( - candidateFactory.createCandidate( - extensionCandidate, - ExplicitReceiverKind.EXTENSION_RECEIVER, - extensionReceiver = explicitReceiver - ) - ) - } - } - return extensions - } - override fun recordLookups(skippedData: Collection, name: Name) { for (data in skippedData) { if (data is TowerData.TowerLevel) { @@ -125,19 +123,12 @@ private class QualifierScopeTowerProcessor( override fun simpleProcess(data: TowerData): Collection { if (data != TowerData.Empty) return emptyList() - val staticMembers = mutableListOf() - for (towerCandidate in QualifierScopeTowerLevel(scopeTower, qualifier).collectCandidates(null)) { - if (!towerCandidate.requiresExtensionReceiver) { - staticMembers.add( - candidateFactory.createCandidate( - towerCandidate, - ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, - extensionReceiver = null - ) - ) - } - } - return staticMembers + return resolve( + QualifierScopeTowerLevel(scopeTower, qualifier).collectCandidates(null), + { !it }, + ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, + null + ) } // QualifierScopeTowerProcessor works only with TowerData.Empty that should not be ignored @@ -149,36 +140,16 @@ private class NoExplicitReceiverScopeTowerProcessor( val collectCandidates: CandidatesCollector ) : AbstractSimpleScopeTowerProcessor(context) { override fun simpleProcess(data: TowerData): Collection = when (data) { - is TowerData.TowerLevel -> { - val result = mutableListOf() - for (towerCandidate in data.level.collectCandidates(null)) { - if (!towerCandidate.requiresExtensionReceiver) { - result.add( - candidateFactory.createCandidate( - towerCandidate, - ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, - extensionReceiver = null - ) - ) - } - } - result - } - is TowerData.BothTowerLevelAndImplicitReceiver -> { - val result = mutableListOf() - for (towerCandidate in data.level.collectCandidates(data.implicitReceiver)) { - if (towerCandidate.requiresExtensionReceiver) { - result.add( - candidateFactory.createCandidate( - towerCandidate, - ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, - extensionReceiver = data.implicitReceiver - ) - ) - } - } - result - } + is TowerData.TowerLevel -> resolve( + data.level.collectCandidates(null), + { !it }, + ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, + null) + is TowerData.BothTowerLevelAndImplicitReceiver -> resolve( + data.level.collectCandidates(data.implicitReceiver), + { it }, + ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, + data.implicitReceiver) else -> emptyList() } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index 51dcfdbaff6..e19b85ae573 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -74,12 +74,6 @@ interface ScopeTowerProcessor { fun recordLookups(skippedData: Collection, name: Name) } -interface SimpleScopeTowerProcessor : ScopeTowerProcessor { - fun simpleProcess(data: TowerData): Collection - - override fun process(data: TowerData): List> = listOfNotNull(simpleProcess(data).takeIf { it.isNotEmpty() }) -} - class TowerResolver { fun runResolve( scopeTower: ImplicitScopeTower,