Minor: extract val FirTowerConsumer.resultCollection
This commit is contained in:
+20
-17
@@ -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 -> {
|
||||||
|
|||||||
Reference in New Issue
Block a user