diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerDataConsumers.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerDataConsumers.kt index c91376e2851..6b685c4fb51 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerDataConsumers.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerDataConsumers.kt @@ -19,16 +19,18 @@ import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind import org.jetbrains.kotlin.types.AbstractTypeChecker abstract class TowerDataConsumer { + abstract val resultCollector: CandidateCollector + abstract fun consume( kind: TowerDataKind, towerScopeLevel: TowerScopeLevel, -// resultCollector: CandidateCollector, group: Int ): ProcessorAction private var stopGroup = Int.MAX_VALUE - fun skipGroup(group: Int, resultCollector: CandidateCollector): Boolean { - if (resultCollector.isSuccess() && stopGroup == Int.MAX_VALUE) { + + fun skipGroup(group: Int): Boolean { + if (stopGroup == Int.MAX_VALUE && resultCollector.isSuccess()) { stopGroup = group } if (group >= stopGroup) return true @@ -42,14 +44,14 @@ class QualifiedReceiverTowerDataConsumer>( val token: TowerScopeLevel.Token, val explicitReceiver: ExpressionReceiverValue, val candidateFactory: CandidateFactory, - val resultCollector: CandidateCollector + override val resultCollector: CandidateCollector ) : TowerDataConsumer() { override fun consume( kind: TowerDataKind, towerScopeLevel: TowerScopeLevel, group: Int ): ProcessorAction { - if (skipGroup(group, resultCollector)) return ProcessorAction.NEXT + if (skipGroup(group)) return ProcessorAction.NEXT if (kind != TowerDataKind.EMPTY) return ProcessorAction.NEXT return QualifiedReceiverTowerLevel(session, candidateFactory.bodyResolveComponents).processElementsByName( @@ -83,19 +85,18 @@ class QualifiedReceiverTowerDataConsumer>( } class PrioritizedTowerDataConsumer( - val resultCollector: CandidateCollector, - vararg val consumers: TowerDataConsumer + override val resultCollector: CandidateCollector, + private vararg val consumers: TowerDataConsumer ) : TowerDataConsumer() { override fun consume( kind: TowerDataKind, towerScopeLevel: TowerScopeLevel, group: Int ): ProcessorAction { - if (skipGroup(group, resultCollector)) return ProcessorAction.NEXT + if (skipGroup(group)) return ProcessorAction.NEXT var empty = true for ((index, consumer) in consumers.withIndex()) { - val action = consumer.consume(kind, towerScopeLevel, group * consumers.size + index) - when (action) { + when (val action = consumer.consume(kind, towerScopeLevel, group * consumers.size + index)) { ProcessorAction.STOP -> return action ProcessorAction.NEXT -> empty = false } @@ -108,9 +109,10 @@ class PrioritizedTowerDataConsumer( // - initialConsumer consumes property which is invoke receiver // - additionalConsumers consume invoke calls themselves class AccumulatingTowerDataConsumer( - private val resultCollector: CandidateCollector + override val resultCollector: CandidateCollector ) : TowerDataConsumer() { lateinit var initialConsumer: TowerDataConsumer + private val additionalConsumers = mutableListOf() private data class TowerData(val kind: TowerDataKind, val level: TowerScopeLevel, val group: Int) @@ -122,7 +124,7 @@ class AccumulatingTowerDataConsumer( towerScopeLevel: TowerScopeLevel, group: Int ): ProcessorAction { - if (skipGroup(group, resultCollector)) return ProcessorAction.NEXT + if (skipGroup(group)) return ProcessorAction.NEXT accumulatedTowerData += TowerData(kind, towerScopeLevel, group) var empty = true @@ -156,7 +158,7 @@ class ExplicitReceiverTowerDataConsumer>( val token: TowerScopeLevel.Token, val explicitReceiver: ExpressionReceiverValue, val candidateFactory: CandidateFactory, - val resultCollector: CandidateCollector + override val resultCollector: CandidateCollector ) : TowerDataConsumer() { companion object { @@ -168,11 +170,12 @@ class ExplicitReceiverTowerDataConsumer>( towerScopeLevel: TowerScopeLevel, group: Int ): ProcessorAction { - if (skipGroup(group, resultCollector)) return ProcessorAction.NEXT + if (skipGroup(group)) return ProcessorAction.NEXT return when (kind) { TowerDataKind.EMPTY -> MemberScopeTowerLevel( - session, resultCollector.components, explicitReceiver, scopeSession = candidateFactory.bodyResolveComponents.scopeSession + session, resultCollector.components, explicitReceiver, + scopeSession = candidateFactory.bodyResolveComponents.scopeSession ).processElementsByName( token, name, @@ -259,14 +262,14 @@ class NoExplicitReceiverTowerDataConsumer>( val name: Name, val token: TowerScopeLevel.Token, val candidateFactory: CandidateFactory, - val resultCollector: CandidateCollector + override val resultCollector: CandidateCollector ) : TowerDataConsumer() { override fun consume( kind: TowerDataKind, towerScopeLevel: TowerScopeLevel, group: Int ): ProcessorAction { - if (skipGroup(group, resultCollector)) return ProcessorAction.NEXT + if (skipGroup(group)) return ProcessorAction.NEXT return when (kind) { TowerDataKind.TOWER_LEVEL -> {