Move levels to TowerResolver
This commit is contained in:
@@ -42,9 +42,6 @@ interface ScopeTower {
|
|||||||
val location: LookupLocation
|
val location: LookupLocation
|
||||||
|
|
||||||
val dataFlowInfo: DataFlowDecorator
|
val dataFlowInfo: DataFlowDecorator
|
||||||
|
|
||||||
// The closest (the most local) levels goes first
|
|
||||||
val levels: List<ScopeTowerLevel>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface DataFlowDecorator {
|
interface DataFlowDecorator {
|
||||||
|
|||||||
@@ -51,37 +51,6 @@ internal class ScopeTowerImpl(
|
|||||||
|
|
||||||
override val implicitReceivers = resolutionContext.scope.getImplicitReceiversHierarchy().
|
override val implicitReceivers = resolutionContext.scope.getImplicitReceiversHierarchy().
|
||||||
mapNotNull { it.value.check { !it.type.containsError() } }
|
mapNotNull { it.value.check { !it.type.containsError() } }
|
||||||
|
|
||||||
override val levels: List<ScopeTowerLevel> = createLevels()
|
|
||||||
|
|
||||||
private fun createLevels(): List<ScopeTowerLevel> {
|
|
||||||
val result = ArrayList<ScopeTowerLevel>()
|
|
||||||
|
|
||||||
// locals win
|
|
||||||
lexicalScope.parentsWithSelf.
|
|
||||||
filterIsInstance<LexicalScope>().
|
|
||||||
filter { it.kind.withLocalDescriptors }.
|
|
||||||
mapTo(result) { ScopeBasedTowerLevel(this, it) }
|
|
||||||
|
|
||||||
var isFirstImportingScope = true
|
|
||||||
lexicalScope.parentsWithSelf.forEach { scope ->
|
|
||||||
if (scope is LexicalScope) {
|
|
||||||
if (!scope.kind.withLocalDescriptors) result.add(ScopeBasedTowerLevel(this, scope))
|
|
||||||
|
|
||||||
scope.implicitReceiver?.let { result.add(ReceiverScopeTowerLevel(this, it.value)) }
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (isFirstImportingScope) {
|
|
||||||
isFirstImportingScope = false
|
|
||||||
result.add(SyntheticScopeBasedTowerLevel(this, syntheticScopes))
|
|
||||||
}
|
|
||||||
result.add(ImportingScopeBasedTowerLevel(this, scope as ImportingScope))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private class DataFlowDecoratorImpl(private val resolutionContext: ResolutionContext<*>): DataFlowDecorator {
|
private class DataFlowDecoratorImpl(private val resolutionContext: ResolutionContext<*>): DataFlowDecorator {
|
||||||
|
|||||||
@@ -18,7 +18,10 @@ package org.jetbrains.kotlin.resolve.calls.tower
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.ImportingScope
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.utils.parentsWithSelf
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.check
|
import org.jetbrains.kotlin.utils.addToStdlib.check
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@@ -69,6 +72,34 @@ class TowerResolver {
|
|||||||
return run(context, processor, false, AllCandidatesCollector(context))
|
return run(context, processor, false, AllCandidatesCollector(context))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun ScopeTower.createLevels(): List<ScopeTowerLevel> {
|
||||||
|
val result = ArrayList<ScopeTowerLevel>()
|
||||||
|
|
||||||
|
// locals win
|
||||||
|
lexicalScope.parentsWithSelf.
|
||||||
|
filterIsInstance<LexicalScope>().
|
||||||
|
filter { it.kind.withLocalDescriptors }.
|
||||||
|
mapTo(result) { ScopeBasedTowerLevel(this, it) }
|
||||||
|
|
||||||
|
var isFirstImportingScope = true
|
||||||
|
lexicalScope.parentsWithSelf.forEach { scope ->
|
||||||
|
if (scope is LexicalScope) {
|
||||||
|
if (!scope.kind.withLocalDescriptors) result.add(ScopeBasedTowerLevel(this, scope))
|
||||||
|
|
||||||
|
scope.implicitReceiver?.let { result.add(ReceiverScopeTowerLevel(this, it.value)) }
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (isFirstImportingScope) {
|
||||||
|
isFirstImportingScope = false
|
||||||
|
result.add(SyntheticScopeBasedTowerLevel(this, syntheticScopes))
|
||||||
|
}
|
||||||
|
result.add(ImportingScopeBasedTowerLevel(this, scope as ImportingScope))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
private fun <C> run(
|
private fun <C> run(
|
||||||
context: TowerContext<C>,
|
context: TowerContext<C>,
|
||||||
processor: ScopeTowerProcessor<C>,
|
processor: ScopeTowerProcessor<C>,
|
||||||
@@ -96,7 +127,7 @@ class TowerResolver {
|
|||||||
// possible there is explicit member
|
// possible there is explicit member
|
||||||
collectCandidates(TowerData.Empty)?.let { return it }
|
collectCandidates(TowerData.Empty)?.let { return it }
|
||||||
|
|
||||||
for (level in context.scopeTower.levels) {
|
for (level in context.scopeTower.createLevels()) {
|
||||||
for (implicitReceiver in context.scopeTower.implicitReceivers) {
|
for (implicitReceiver in context.scopeTower.implicitReceivers) {
|
||||||
collectCandidates(TowerData.BothTowerLevelAndImplicitReceiver(level, implicitReceiver))?.let { return it }
|
collectCandidates(TowerData.BothTowerLevelAndImplicitReceiver(level, implicitReceiver))?.let { return it }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user