Minor: extract val FirTowerConsumer.resultCollection

This commit is contained in:
Mikhail Glukhikh
2019-12-24 11:48:43 +03:00
parent 20fee028f9
commit 933bdc98e5
@@ -19,16 +19,18 @@ import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.AbstractTypeChecker
abstract class TowerDataConsumer { abstract class TowerDataConsumer {
abstract val resultCollector: CandidateCollector
abstract fun consume( abstract fun consume(
kind: TowerDataKind, kind: TowerDataKind,
towerScopeLevel: TowerScopeLevel, towerScopeLevel: TowerScopeLevel,
// resultCollector: CandidateCollector,
group: Int group: Int
): ProcessorAction ): ProcessorAction
private var stopGroup = Int.MAX_VALUE 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 stopGroup = group
} }
if (group >= stopGroup) return true if (group >= stopGroup) return true
@@ -42,14 +44,14 @@ class QualifiedReceiverTowerDataConsumer<T : AbstractFirBasedSymbol<*>>(
val token: TowerScopeLevel.Token<T>, val token: TowerScopeLevel.Token<T>,
val explicitReceiver: ExpressionReceiverValue, val explicitReceiver: ExpressionReceiverValue,
val candidateFactory: CandidateFactory, val candidateFactory: CandidateFactory,
val resultCollector: CandidateCollector override val resultCollector: CandidateCollector
) : TowerDataConsumer() { ) : TowerDataConsumer() {
override fun consume( override fun consume(
kind: TowerDataKind, kind: TowerDataKind,
towerScopeLevel: TowerScopeLevel, towerScopeLevel: TowerScopeLevel,
group: Int group: Int
): ProcessorAction { ): ProcessorAction {
if (skipGroup(group, resultCollector)) return ProcessorAction.NEXT if (skipGroup(group)) return ProcessorAction.NEXT
if (kind != TowerDataKind.EMPTY) return ProcessorAction.NEXT if (kind != TowerDataKind.EMPTY) return ProcessorAction.NEXT
return QualifiedReceiverTowerLevel(session, candidateFactory.bodyResolveComponents).processElementsByName( return QualifiedReceiverTowerLevel(session, candidateFactory.bodyResolveComponents).processElementsByName(
@@ -83,19 +85,18 @@ class QualifiedReceiverTowerDataConsumer<T : AbstractFirBasedSymbol<*>>(
} }
class PrioritizedTowerDataConsumer( class PrioritizedTowerDataConsumer(
val resultCollector: CandidateCollector, override val resultCollector: CandidateCollector,
vararg val consumers: TowerDataConsumer private vararg val consumers: TowerDataConsumer
) : TowerDataConsumer() { ) : TowerDataConsumer() {
override fun consume( override fun consume(
kind: TowerDataKind, kind: TowerDataKind,
towerScopeLevel: TowerScopeLevel, towerScopeLevel: TowerScopeLevel,
group: Int group: Int
): ProcessorAction { ): ProcessorAction {
if (skipGroup(group, resultCollector)) return ProcessorAction.NEXT if (skipGroup(group)) return ProcessorAction.NEXT
var empty = true var empty = true
for ((index, consumer) in consumers.withIndex()) { for ((index, consumer) in consumers.withIndex()) {
val action = consumer.consume(kind, towerScopeLevel, group * consumers.size + index) when (val action = consumer.consume(kind, towerScopeLevel, group * consumers.size + index)) {
when (action) {
ProcessorAction.STOP -> return action ProcessorAction.STOP -> return action
ProcessorAction.NEXT -> empty = false ProcessorAction.NEXT -> empty = false
} }
@@ -108,9 +109,10 @@ class PrioritizedTowerDataConsumer(
// - initialConsumer consumes property which is invoke receiver // - initialConsumer consumes property which is invoke receiver
// - additionalConsumers consume invoke calls themselves // - additionalConsumers consume invoke calls themselves
class AccumulatingTowerDataConsumer( class AccumulatingTowerDataConsumer(
private val resultCollector: CandidateCollector override val resultCollector: CandidateCollector
) : TowerDataConsumer() { ) : TowerDataConsumer() {
lateinit var initialConsumer: TowerDataConsumer lateinit var initialConsumer: TowerDataConsumer
private val additionalConsumers = mutableListOf<TowerDataConsumer>() private val additionalConsumers = mutableListOf<TowerDataConsumer>()
private data class TowerData(val kind: TowerDataKind, val level: TowerScopeLevel, val group: Int) private data class TowerData(val kind: TowerDataKind, val level: TowerScopeLevel, val group: Int)
@@ -122,7 +124,7 @@ class AccumulatingTowerDataConsumer(
towerScopeLevel: TowerScopeLevel, towerScopeLevel: TowerScopeLevel,
group: Int group: Int
): ProcessorAction { ): ProcessorAction {
if (skipGroup(group, resultCollector)) return ProcessorAction.NEXT if (skipGroup(group)) return ProcessorAction.NEXT
accumulatedTowerData += TowerData(kind, towerScopeLevel, group) accumulatedTowerData += TowerData(kind, towerScopeLevel, group)
var empty = true var empty = true
@@ -156,7 +158,7 @@ class ExplicitReceiverTowerDataConsumer<T : AbstractFirBasedSymbol<*>>(
val token: TowerScopeLevel.Token<T>, val token: TowerScopeLevel.Token<T>,
val explicitReceiver: ExpressionReceiverValue, val explicitReceiver: ExpressionReceiverValue,
val candidateFactory: CandidateFactory, val candidateFactory: CandidateFactory,
val resultCollector: CandidateCollector override val resultCollector: CandidateCollector
) : TowerDataConsumer() { ) : TowerDataConsumer() {
companion object { companion object {
@@ -168,11 +170,12 @@ class ExplicitReceiverTowerDataConsumer<T : AbstractFirBasedSymbol<*>>(
towerScopeLevel: TowerScopeLevel, towerScopeLevel: TowerScopeLevel,
group: Int group: Int
): ProcessorAction { ): ProcessorAction {
if (skipGroup(group, resultCollector)) return ProcessorAction.NEXT if (skipGroup(group)) return ProcessorAction.NEXT
return when (kind) { return when (kind) {
TowerDataKind.EMPTY -> TowerDataKind.EMPTY ->
MemberScopeTowerLevel( MemberScopeTowerLevel(
session, resultCollector.components, explicitReceiver, scopeSession = candidateFactory.bodyResolveComponents.scopeSession session, resultCollector.components, explicitReceiver,
scopeSession = candidateFactory.bodyResolveComponents.scopeSession
).processElementsByName( ).processElementsByName(
token, token,
name, name,
@@ -259,14 +262,14 @@ class NoExplicitReceiverTowerDataConsumer<T : AbstractFirBasedSymbol<*>>(
val name: Name, val name: Name,
val token: TowerScopeLevel.Token<T>, val token: TowerScopeLevel.Token<T>,
val candidateFactory: CandidateFactory, val candidateFactory: CandidateFactory,
val resultCollector: CandidateCollector override val resultCollector: CandidateCollector
) : TowerDataConsumer() { ) : TowerDataConsumer() {
override fun consume( override fun consume(
kind: TowerDataKind, kind: TowerDataKind,
towerScopeLevel: TowerScopeLevel, towerScopeLevel: TowerScopeLevel,
group: Int group: Int
): ProcessorAction { ): ProcessorAction {
if (skipGroup(group, resultCollector)) return ProcessorAction.NEXT if (skipGroup(group)) return ProcessorAction.NEXT
return when (kind) { return when (kind) {
TowerDataKind.TOWER_LEVEL -> { TowerDataKind.TOWER_LEVEL -> {