From 45f92c490cdc35821ceff626c0079f2eb270cd17 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Wed, 10 Apr 2019 21:13:50 +0300 Subject: [PATCH] FIR: make call resolver stop on first successful candidate --- .../kotlin/fir/resolve/calls/CallResolver.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallResolver.kt index 3aeaaff976c..4961e433bdb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallResolver.kt @@ -190,6 +190,14 @@ abstract class TowerDataConsumer { resultCollector: CandidateCollector, group: Int ): ProcessorAction + + private var stopGroup = Int.MAX_VALUE + fun checkSkip(group: Int, resultCollector: CandidateCollector): Boolean { + if (resultCollector.isSuccess() && stopGroup == Int.MAX_VALUE) { + stopGroup = group + } + return group > stopGroup + } } @@ -271,6 +279,7 @@ class PrioritizedTowerDataConsumer( resultCollector: CandidateCollector, group: Int ): ProcessorAction { + if (checkSkip(group, resultCollector)) return ProcessorAction.NEXT for ((index, consumer) in consumers.withIndex()) { val action = consumer.consume(kind, implicitReceiverType, towerScopeLevel, resultCollector, group * consumers.size + index) if (action.stop()) { @@ -297,6 +306,7 @@ class ExplicitReceiverTowerDataConsumer( resultCollector: CandidateCollector, group: Int ): ProcessorAction { + if (checkSkip(group, resultCollector)) return ProcessorAction.NEXT return when (kind) { TowerDataKind.EMPTY -> MemberScopeTowerLevel(session, explicitReceiver).processElementsByName( @@ -358,6 +368,7 @@ class NoExplicitReceiverTowerDataConsumer( resultCollector: CandidateCollector, group: Int ): ProcessorAction { + if (checkSkip(group, resultCollector)) return ProcessorAction.NEXT return when (kind) { TowerDataKind.TOWER_LEVEL -> { @@ -478,6 +489,10 @@ class CandidateCollector(val callInfo: CallInfo) { } return result } + + fun isSuccess(): Boolean { + return currentApplicability == CandidateApplicability.RESOLVED + } } fun FirCallableDeclaration.dispatchReceiverType(session: FirSession): ConeKotlinType? {