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
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<T : AbstractFirBasedSymbol<*>>(
val token: TowerScopeLevel.Token<T>,
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<T : AbstractFirBasedSymbol<*>>(
}
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<TowerDataConsumer>()
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<T : AbstractFirBasedSymbol<*>>(
val token: TowerScopeLevel.Token<T>,
val explicitReceiver: ExpressionReceiverValue,
val candidateFactory: CandidateFactory,
val resultCollector: CandidateCollector
override val resultCollector: CandidateCollector
) : TowerDataConsumer() {
companion object {
@@ -168,11 +170,12 @@ class ExplicitReceiverTowerDataConsumer<T : AbstractFirBasedSymbol<*>>(
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<T : AbstractFirBasedSymbol<*>>(
val name: Name,
val token: TowerScopeLevel.Token<T>,
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 -> {