FIR: Move some responsibilities of TowerResolveManager to FirTowerResolverSession
This commit is contained in:
@@ -261,11 +261,12 @@ class FirCallResolver(
|
|||||||
expectedType, constraintSystemBuilder,
|
expectedType, constraintSystemBuilder,
|
||||||
)
|
)
|
||||||
// No reset here!
|
// No reset here!
|
||||||
|
val localCollector = CandidateCollector(this, resolutionStageRunner)
|
||||||
val result = towerResolver.runResolver(
|
val result = towerResolver.runResolver(
|
||||||
implicitReceiverStack.receiversAsReversed(),
|
implicitReceiverStack.receiversAsReversed(),
|
||||||
info,
|
info,
|
||||||
collector = CandidateCollector(this, resolutionStageRunner),
|
collector = localCollector,
|
||||||
manager = TowerResolveManager(),
|
manager = TowerResolveManager(localCollector),
|
||||||
)
|
)
|
||||||
val bestCandidates = result.bestCandidates()
|
val bestCandidates = result.bestCandidates()
|
||||||
val noSuccessfulCandidates = result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED
|
val noSuccessfulCandidates = result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class FirTowerResolver(
|
|||||||
resolutionStageRunner: ResolutionStageRunner,
|
resolutionStageRunner: ResolutionStageRunner,
|
||||||
) {
|
) {
|
||||||
private val collector = CandidateCollector(components, resolutionStageRunner)
|
private val collector = CandidateCollector(components, resolutionStageRunner)
|
||||||
private val manager = TowerResolveManager()
|
private val manager = TowerResolveManager(collector)
|
||||||
|
|
||||||
fun runResolver(
|
fun runResolver(
|
||||||
implicitReceiverValues: List<ImplicitReceiverValue<*>>,
|
implicitReceiverValues: List<ImplicitReceiverValue<*>>,
|
||||||
@@ -22,9 +22,9 @@ class FirTowerResolver(
|
|||||||
collector: CandidateCollector = this.collector,
|
collector: CandidateCollector = this.collector,
|
||||||
manager: TowerResolveManager = this.manager
|
manager: TowerResolveManager = this.manager
|
||||||
): CandidateCollector {
|
): CandidateCollector {
|
||||||
val towerResolverSession = FirTowerResolverSession(components, implicitReceiverValues, manager)
|
val callResolutionContext = buildCallResolutionContext(info, collector)
|
||||||
manager.callResolutionContext = buildCallResolutionContext(info, collector, towerResolverSession)
|
|
||||||
|
|
||||||
|
val towerResolverSession = FirTowerResolverSession(components, implicitReceiverValues, manager, callResolutionContext)
|
||||||
towerResolverSession.runResolution(info)
|
towerResolverSession.runResolution(info)
|
||||||
|
|
||||||
manager.runTasks()
|
manager.runTasks()
|
||||||
@@ -33,8 +33,7 @@ class FirTowerResolver(
|
|||||||
|
|
||||||
private fun buildCallResolutionContext(
|
private fun buildCallResolutionContext(
|
||||||
info: CallInfo,
|
info: CallInfo,
|
||||||
collector: CandidateCollector,
|
collector: CandidateCollector
|
||||||
towerResolverSession: FirTowerResolverSession
|
|
||||||
): CallResolutionContext {
|
): CallResolutionContext {
|
||||||
val candidateFactory = CandidateFactory(components, info)
|
val candidateFactory = CandidateFactory(components, info)
|
||||||
val stubReceiverCandidateFactory =
|
val stubReceiverCandidateFactory =
|
||||||
@@ -63,8 +62,7 @@ class FirTowerResolver(
|
|||||||
invokeBuiltinExtensionReceiverCandidateFactory,
|
invokeBuiltinExtensionReceiverCandidateFactory,
|
||||||
stubReceiverCandidateFactory,
|
stubReceiverCandidateFactory,
|
||||||
invokeReceiverCollector,
|
invokeReceiverCollector,
|
||||||
this,
|
this
|
||||||
towerResolverSession
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+57
-27
@@ -27,10 +27,11 @@ import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef
|
|||||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.HIDES_MEMBERS_NAME_LIST
|
import org.jetbrains.kotlin.resolve.descriptorUtil.HIDES_MEMBERS_NAME_LIST
|
||||||
|
|
||||||
class FirTowerResolverSession(
|
class FirTowerResolverSession internal constructor(
|
||||||
val components: BodyResolveComponents,
|
val components: BodyResolveComponents,
|
||||||
implicitReceiverValues: List<ImplicitReceiverValue<*>>,
|
implicitReceiverValues: List<ImplicitReceiverValue<*>>,
|
||||||
private val manager: TowerResolveManager
|
private val manager: TowerResolveManager,
|
||||||
|
private val callResolutionContext: CallResolutionContext,
|
||||||
) {
|
) {
|
||||||
private data class ImplicitReceiver(
|
private data class ImplicitReceiver(
|
||||||
val receiver: ImplicitReceiverValue<*>,
|
val receiver: ImplicitReceiverValue<*>,
|
||||||
@@ -73,6 +74,35 @@ class FirTowerResolverSession(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private suspend fun processLevel(
|
||||||
|
towerLevel: SessionBasedTowerLevel,
|
||||||
|
callInfo: CallInfo,
|
||||||
|
group: TowerGroup,
|
||||||
|
explicitReceiverKind: ExplicitReceiverKind = ExplicitReceiverKind.NO_EXPLICIT_RECEIVER,
|
||||||
|
invokeResolveMode: InvokeResolveMode? = null
|
||||||
|
): ProcessorAction {
|
||||||
|
manager.requestGroup(group)
|
||||||
|
|
||||||
|
val result = with(LevelHandler(callInfo, explicitReceiverKind, group, callResolutionContext, manager, this)) {
|
||||||
|
towerLevel.handleLevel(invokeResolveMode)
|
||||||
|
}
|
||||||
|
|
||||||
|
manager.stopIfSuccess()
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
private suspend fun processLevelForPropertyWithInvoke(
|
||||||
|
towerLevel: SessionBasedTowerLevel,
|
||||||
|
callInfo: CallInfo,
|
||||||
|
group: TowerGroup,
|
||||||
|
explicitReceiverKind: ExplicitReceiverKind = ExplicitReceiverKind.NO_EXPLICIT_RECEIVER
|
||||||
|
) {
|
||||||
|
if (callInfo.callKind == CallKind.Function) {
|
||||||
|
processLevel(towerLevel, callInfo, group, explicitReceiverKind, InvokeResolveMode.RECEIVER_FOR_INVOKE_BUILTIN_EXTENSION)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun FirScope.toScopeTowerLevel(
|
private fun FirScope.toScopeTowerLevel(
|
||||||
extensionReceiver: ReceiverValue? = null,
|
extensionReceiver: ReceiverValue? = null,
|
||||||
extensionsOnly: Boolean = false,
|
extensionsOnly: Boolean = false,
|
||||||
@@ -96,7 +126,7 @@ class FirTowerResolverSession(
|
|||||||
) {
|
) {
|
||||||
if (qualifierReceiver == null) return
|
if (qualifierReceiver == null) return
|
||||||
for ((depth, qualifierScope) in qualifierReceiver.callableScopes().withIndex()) {
|
for ((depth, qualifierScope) in qualifierReceiver.callableScopes().withIndex()) {
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
qualifierScope.toScopeTowerLevel(noInnerConstructors = true),
|
qualifierScope.toScopeTowerLevel(noInnerConstructors = true),
|
||||||
info.noStubReceiver(), TowerGroup.Qualifier(depth)
|
info.noStubReceiver(), TowerGroup.Qualifier(depth)
|
||||||
)
|
)
|
||||||
@@ -112,7 +142,7 @@ class FirTowerResolverSession(
|
|||||||
qualifierReceiver.classSymbol != qualifierReceiver.originalSymbol
|
qualifierReceiver.classSymbol != qualifierReceiver.originalSymbol
|
||||||
) return
|
) return
|
||||||
val scope = qualifierReceiver.classifierScope() ?: return
|
val scope = qualifierReceiver.classifierScope() ?: return
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
scope.toScopeTowerLevel(noInnerConstructors = true), info.noStubReceiver(),
|
scope.toScopeTowerLevel(noInnerConstructors = true), info.noStubReceiver(),
|
||||||
if (prioritized) TowerGroup.ClassifierPrioritized else TowerGroup.Classifier
|
if (prioritized) TowerGroup.ClassifierPrioritized else TowerGroup.Classifier
|
||||||
)
|
)
|
||||||
@@ -189,7 +219,7 @@ class FirTowerResolverSession(
|
|||||||
info: CallInfo,
|
info: CallInfo,
|
||||||
index: Int,
|
index: Int,
|
||||||
depth: Int?
|
depth: Int?
|
||||||
) = manager.processLevel(
|
) = processLevel(
|
||||||
topLevelScope.toScopeTowerLevel(
|
topLevelScope.toScopeTowerLevel(
|
||||||
extensionReceiver = receiverValue, extensionsOnly = true
|
extensionReceiver = receiverValue, extensionsOnly = true
|
||||||
),
|
),
|
||||||
@@ -201,7 +231,7 @@ class FirTowerResolverSession(
|
|||||||
nonEmptyLocalScopes: MutableList<FirLocalScope>
|
nonEmptyLocalScopes: MutableList<FirLocalScope>
|
||||||
) {
|
) {
|
||||||
for ((index, localScope) in localScopes.withIndex()) {
|
for ((index, localScope) in localScopes.withIndex()) {
|
||||||
val result = manager.processLevel(
|
val result = processLevel(
|
||||||
localScope.toScopeTowerLevel(), info, TowerGroup.Local(index)
|
localScope.toScopeTowerLevel(), info, TowerGroup.Local(index)
|
||||||
)
|
)
|
||||||
if (result != ProcessorAction.NONE) {
|
if (result != ProcessorAction.NONE) {
|
||||||
@@ -234,7 +264,7 @@ class FirTowerResolverSession(
|
|||||||
if (implicitReceiverValue is ImplicitDispatchReceiverValue) {
|
if (implicitReceiverValue is ImplicitDispatchReceiverValue) {
|
||||||
val scope = implicitReceiverValue.scope(session, components.scopeSession)
|
val scope = implicitReceiverValue.scope(session, components.scopeSession)
|
||||||
if (scope != null) {
|
if (scope != null) {
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
FirStaticScope(scope).toScopeTowerLevel(),
|
FirStaticScope(scope).toScopeTowerLevel(),
|
||||||
info, parentGroup.Static(depth)
|
info, parentGroup.Static(depth)
|
||||||
)
|
)
|
||||||
@@ -251,7 +281,7 @@ class FirTowerResolverSession(
|
|||||||
nonEmptyLocalScopes: List<FirLocalScope>,
|
nonEmptyLocalScopes: List<FirLocalScope>,
|
||||||
emptyTopLevelScopes: MutableSet<FirScope>
|
emptyTopLevelScopes: MutableSet<FirScope>
|
||||||
) {
|
) {
|
||||||
val implicitResult = manager.processLevel(
|
val implicitResult = processLevel(
|
||||||
receiver.toMemberScopeTowerLevel(), info, parentGroup.Member
|
receiver.toMemberScopeTowerLevel(), info, parentGroup.Member
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -260,7 +290,7 @@ class FirTowerResolverSession(
|
|||||||
}
|
}
|
||||||
|
|
||||||
for ((localIndex, localScope) in nonEmptyLocalScopes.withIndex()) {
|
for ((localIndex, localScope) in nonEmptyLocalScopes.withIndex()) {
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
localScope.toScopeTowerLevel(extensionReceiver = receiver),
|
localScope.toScopeTowerLevel(extensionReceiver = receiver),
|
||||||
info, parentGroup.Local(localIndex)
|
info, parentGroup.Local(localIndex)
|
||||||
)
|
)
|
||||||
@@ -268,7 +298,7 @@ class FirTowerResolverSession(
|
|||||||
|
|
||||||
for ((implicitDispatchReceiverValue, dispatchDepth) in implicitReceiversUsableAsValues) {
|
for ((implicitDispatchReceiverValue, dispatchDepth) in implicitReceiversUsableAsValues) {
|
||||||
if (implicitDispatchReceiverValue in implicitReceiverValuesWithEmptyScopes) continue
|
if (implicitDispatchReceiverValue in implicitReceiverValuesWithEmptyScopes) continue
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
implicitDispatchReceiverValue.toMemberScopeTowerLevel(extensionReceiver = receiver),
|
implicitDispatchReceiverValue.toMemberScopeTowerLevel(extensionReceiver = receiver),
|
||||||
info, parentGroup.Implicit(dispatchDepth)
|
info, parentGroup.Implicit(dispatchDepth)
|
||||||
)
|
)
|
||||||
@@ -276,7 +306,7 @@ class FirTowerResolverSession(
|
|||||||
|
|
||||||
for ((topIndex, topLevelScope) in topLevelScopes.withIndex()) {
|
for ((topIndex, topLevelScope) in topLevelScopes.withIndex()) {
|
||||||
if (topLevelScope in emptyTopLevelScopes) continue
|
if (topLevelScope in emptyTopLevelScopes) continue
|
||||||
val result = manager.processLevel(
|
val result = processLevel(
|
||||||
topLevelScope.toScopeTowerLevel(extensionReceiver = receiver),
|
topLevelScope.toScopeTowerLevel(extensionReceiver = receiver),
|
||||||
info, parentGroup.Top(topIndex)
|
info, parentGroup.Top(topIndex)
|
||||||
)
|
)
|
||||||
@@ -294,7 +324,7 @@ class FirTowerResolverSession(
|
|||||||
// NB: this check does not work for variables
|
// NB: this check does not work for variables
|
||||||
// because we do not search for objects if we have extension receiver
|
// because we do not search for objects if we have extension receiver
|
||||||
if (info.callKind != CallKind.VariableAccess && topLevelScope in emptyTopLevelScopes) continue
|
if (info.callKind != CallKind.VariableAccess && topLevelScope in emptyTopLevelScopes) continue
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
topLevelScope.toScopeTowerLevel(), info, TowerGroup.Top(index)
|
topLevelScope.toScopeTowerLevel(), info, TowerGroup.Top(index)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -349,12 +379,12 @@ class FirTowerResolverSession(
|
|||||||
info: CallInfo,
|
info: CallInfo,
|
||||||
towerGroup: TowerGroup,
|
towerGroup: TowerGroup,
|
||||||
): ProcessorAction {
|
): ProcessorAction {
|
||||||
val result = manager.processLevel(
|
val result = processLevel(
|
||||||
scope.toScopeTowerLevel(extensionReceiver = explicitReceiverValue),
|
scope.toScopeTowerLevel(extensionReceiver = explicitReceiverValue),
|
||||||
info, towerGroup, ExplicitReceiverKind.EXTENSION_RECEIVER
|
info, towerGroup, ExplicitReceiverKind.EXTENSION_RECEIVER
|
||||||
)
|
)
|
||||||
|
|
||||||
manager.processLevelForPropertyWithInvoke(
|
processLevelForPropertyWithInvoke(
|
||||||
scope.toScopeTowerLevel(), info, towerGroup
|
scope.toScopeTowerLevel(), info, towerGroup
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -365,7 +395,7 @@ class FirTowerResolverSession(
|
|||||||
explicitReceiverValue: ExpressionReceiverValue,
|
explicitReceiverValue: ExpressionReceiverValue,
|
||||||
info: CallInfo
|
info: CallInfo
|
||||||
) {
|
) {
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
explicitReceiverValue.toMemberScopeTowerLevel(), info, TowerGroup.Member, ExplicitReceiverKind.DISPATCH_RECEIVER
|
explicitReceiverValue.toMemberScopeTowerLevel(), info, TowerGroup.Member, ExplicitReceiverKind.DISPATCH_RECEIVER
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -381,31 +411,31 @@ class FirTowerResolverSession(
|
|||||||
val parentGroup = TowerGroup.Implicit(depth)
|
val parentGroup = TowerGroup.Implicit(depth)
|
||||||
|
|
||||||
// Member extensions
|
// Member extensions
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = explicitReceiverValue),
|
implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = explicitReceiverValue),
|
||||||
info, parentGroup.Member, ExplicitReceiverKind.EXTENSION_RECEIVER
|
info, parentGroup.Member, ExplicitReceiverKind.EXTENSION_RECEIVER
|
||||||
)
|
)
|
||||||
// properties for invoke on implicit receiver
|
// properties for invoke on implicit receiver
|
||||||
manager.processLevelForPropertyWithInvoke(
|
processLevelForPropertyWithInvoke(
|
||||||
implicitReceiverValue.toMemberScopeTowerLevel(), info, parentGroup.Member
|
implicitReceiverValue.toMemberScopeTowerLevel(), info, parentGroup.Member
|
||||||
)
|
)
|
||||||
|
|
||||||
for ((localIndex, localScope) in nonEmptyLocalScopes.withIndex()) {
|
for ((localIndex, localScope) in nonEmptyLocalScopes.withIndex()) {
|
||||||
manager.processLevelForPropertyWithInvoke(
|
processLevelForPropertyWithInvoke(
|
||||||
localScope.toScopeTowerLevel(extensionReceiver = implicitReceiverValue),
|
localScope.toScopeTowerLevel(extensionReceiver = implicitReceiverValue),
|
||||||
info, parentGroup.Local(localIndex)
|
info, parentGroup.Local(localIndex)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
for ((implicitDispatchReceiverValue, dispatchDepth) in implicitReceiversUsableAsValues) {
|
for ((implicitDispatchReceiverValue, dispatchDepth) in implicitReceiversUsableAsValues) {
|
||||||
manager.processLevelForPropertyWithInvoke(
|
processLevelForPropertyWithInvoke(
|
||||||
implicitDispatchReceiverValue.toMemberScopeTowerLevel(extensionReceiver = implicitReceiverValue),
|
implicitDispatchReceiverValue.toMemberScopeTowerLevel(extensionReceiver = implicitReceiverValue),
|
||||||
info, parentGroup.Implicit(dispatchDepth)
|
info, parentGroup.Implicit(dispatchDepth)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
for ((topIndex, topLevelScope) in topLevelScopes.withIndex()) {
|
for ((topIndex, topLevelScope) in topLevelScopes.withIndex()) {
|
||||||
manager.processLevelForPropertyWithInvoke(
|
processLevelForPropertyWithInvoke(
|
||||||
topLevelScope.toScopeTowerLevel(extensionReceiver = implicitReceiverValue),
|
topLevelScope.toScopeTowerLevel(extensionReceiver = implicitReceiverValue),
|
||||||
info, parentGroup.Top(topIndex)
|
info, parentGroup.Top(topIndex)
|
||||||
)
|
)
|
||||||
@@ -423,7 +453,7 @@ class FirTowerResolverSession(
|
|||||||
)
|
)
|
||||||
else -> null
|
else -> null
|
||||||
} ?: return
|
} ?: return
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
scope.toScopeTowerLevel(),
|
scope.toScopeTowerLevel(),
|
||||||
info, TowerGroup.Member, explicitReceiverKind = ExplicitReceiverKind.DISPATCH_RECEIVER
|
info, TowerGroup.Member, explicitReceiverKind = ExplicitReceiverKind.DISPATCH_RECEIVER
|
||||||
)
|
)
|
||||||
@@ -433,7 +463,7 @@ class FirTowerResolverSession(
|
|||||||
info: CallInfo,
|
info: CallInfo,
|
||||||
invokeReceiverValue: ExpressionReceiverValue
|
invokeReceiverValue: ExpressionReceiverValue
|
||||||
) {
|
) {
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
invokeReceiverValue.toMemberScopeTowerLevel(),
|
invokeReceiverValue.toMemberScopeTowerLevel(),
|
||||||
info, TowerGroup.Member,
|
info, TowerGroup.Member,
|
||||||
ExplicitReceiverKind.DISPATCH_RECEIVER,
|
ExplicitReceiverKind.DISPATCH_RECEIVER,
|
||||||
@@ -441,7 +471,7 @@ class FirTowerResolverSession(
|
|||||||
)
|
)
|
||||||
|
|
||||||
for ((index, localScope) in localScopes.withIndex()) {
|
for ((index, localScope) in localScopes.withIndex()) {
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
localScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue),
|
localScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue),
|
||||||
info, TowerGroup.Local(index),
|
info, TowerGroup.Local(index),
|
||||||
ExplicitReceiverKind.EXTENSION_RECEIVER,
|
ExplicitReceiverKind.EXTENSION_RECEIVER,
|
||||||
@@ -452,7 +482,7 @@ class FirTowerResolverSession(
|
|||||||
for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) {
|
for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) {
|
||||||
// NB: companions are processed via implicitReceiverValues!
|
// NB: companions are processed via implicitReceiverValues!
|
||||||
val parentGroup = TowerGroup.Implicit(depth)
|
val parentGroup = TowerGroup.Implicit(depth)
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = invokeReceiverValue),
|
implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = invokeReceiverValue),
|
||||||
info, parentGroup.Member,
|
info, parentGroup.Member,
|
||||||
ExplicitReceiverKind.EXTENSION_RECEIVER,
|
ExplicitReceiverKind.EXTENSION_RECEIVER,
|
||||||
@@ -461,7 +491,7 @@ class FirTowerResolverSession(
|
|||||||
}
|
}
|
||||||
|
|
||||||
for ((index, topLevelScope) in topLevelScopes.withIndex()) {
|
for ((index, topLevelScope) in topLevelScopes.withIndex()) {
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
topLevelScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue),
|
topLevelScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue),
|
||||||
info, TowerGroup.Top(index),
|
info, TowerGroup.Top(index),
|
||||||
ExplicitReceiverKind.EXTENSION_RECEIVER,
|
ExplicitReceiverKind.EXTENSION_RECEIVER,
|
||||||
@@ -475,7 +505,7 @@ class FirTowerResolverSession(
|
|||||||
info: CallInfo,
|
info: CallInfo,
|
||||||
invokeReceiverValue: ExpressionReceiverValue
|
invokeReceiverValue: ExpressionReceiverValue
|
||||||
) {
|
) {
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
invokeReceiverValue.toMemberScopeTowerLevel(),
|
invokeReceiverValue.toMemberScopeTowerLevel(),
|
||||||
info, TowerGroup.Member,
|
info, TowerGroup.Member,
|
||||||
ExplicitReceiverKind.DISPATCH_RECEIVER,
|
ExplicitReceiverKind.DISPATCH_RECEIVER,
|
||||||
@@ -490,7 +520,7 @@ class FirTowerResolverSession(
|
|||||||
) {
|
) {
|
||||||
for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) {
|
for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) {
|
||||||
val parentGroup = TowerGroup.Implicit(depth)
|
val parentGroup = TowerGroup.Implicit(depth)
|
||||||
manager.processLevel(
|
processLevel(
|
||||||
invokeReceiverValue.toMemberScopeTowerLevel(
|
invokeReceiverValue.toMemberScopeTowerLevel(
|
||||||
extensionReceiver = implicitReceiverValue,
|
extensionReceiver = implicitReceiverValue,
|
||||||
implicitExtensionInvokeMode = true
|
implicitExtensionInvokeMode = true
|
||||||
|
|||||||
+3
-4
@@ -31,8 +31,7 @@ internal class CallResolutionContext(
|
|||||||
val invokeBuiltinExtensionReceiverCandidateFactory: CandidateFactory?,
|
val invokeBuiltinExtensionReceiverCandidateFactory: CandidateFactory?,
|
||||||
val stubReceiverCandidateFactory: CandidateFactory?,
|
val stubReceiverCandidateFactory: CandidateFactory?,
|
||||||
val invokeReceiverCollector: CandidateCollector?,
|
val invokeReceiverCollector: CandidateCollector?,
|
||||||
val towerResolver: FirTowerResolver,
|
val towerResolver: FirTowerResolver
|
||||||
val towerResolverSession: FirTowerResolverSession
|
|
||||||
) {
|
) {
|
||||||
// TODO: Get rid of the property, storing state here looks like a hack
|
// TODO: Get rid of the property, storing state here looks like a hack
|
||||||
internal lateinit var invokeOnGivenReceiverCandidateFactory: CandidateFactory
|
internal lateinit var invokeOnGivenReceiverCandidateFactory: CandidateFactory
|
||||||
@@ -43,12 +42,12 @@ internal class LevelHandler(
|
|||||||
private val explicitReceiverKind: ExplicitReceiverKind,
|
private val explicitReceiverKind: ExplicitReceiverKind,
|
||||||
private val group: TowerGroup,
|
private val group: TowerGroup,
|
||||||
private val callResolutionContext: CallResolutionContext,
|
private val callResolutionContext: CallResolutionContext,
|
||||||
private val manager: TowerResolveManager
|
private val manager: TowerResolveManager,
|
||||||
|
private val towerResolverSession: FirTowerResolverSession
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private val resultCollector: CandidateCollector get() = callResolutionContext.resultCollector
|
private val resultCollector: CandidateCollector get() = callResolutionContext.resultCollector
|
||||||
private val towerResolver: FirTowerResolver get() = callResolutionContext.towerResolver
|
private val towerResolver: FirTowerResolver get() = callResolutionContext.towerResolver
|
||||||
private val towerResolverSession: FirTowerResolverSession get() = callResolutionContext.towerResolverSession
|
|
||||||
|
|
||||||
private fun enqueueResolverTask(group: TowerGroup = TowerGroup.Start, task: suspend () -> Unit) =
|
private fun enqueueResolverTask(group: TowerGroup = TowerGroup.Start, task: suspend () -> Unit) =
|
||||||
manager.enqueueResolverTask(group, task)
|
manager.enqueueResolverTask(group, task)
|
||||||
|
|||||||
+5
-35
@@ -5,27 +5,22 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.resolve.calls
|
package org.jetbrains.kotlin.fir.resolve.calls
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.coroutines.*
|
import kotlin.coroutines.*
|
||||||
|
|
||||||
class TowerResolveManager internal constructor() {
|
class TowerResolveManager private constructor(private val isSuccess: () -> Boolean) {
|
||||||
|
|
||||||
|
constructor(collector: CandidateCollector) : this({ collector.isSuccess() })
|
||||||
|
|
||||||
private val queue = PriorityQueue<SuspendedResolverTask>()
|
private val queue = PriorityQueue<SuspendedResolverTask>()
|
||||||
|
|
||||||
// TODO: Get rid of the property (it should be passed in a different way)
|
|
||||||
internal lateinit var callResolutionContext: CallResolutionContext
|
|
||||||
|
|
||||||
private fun isSuccess() = callResolutionContext.resultCollector.isSuccess()
|
|
||||||
|
|
||||||
fun reset() {
|
fun reset() {
|
||||||
queue.clear()
|
queue.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun suspendResolverTask(group: TowerGroup) = suspendCoroutine<Unit> { queue += SuspendedResolverTask(it, group) }
|
private suspend fun suspendResolverTask(group: TowerGroup) = suspendCoroutine<Unit> { queue += SuspendedResolverTask(it, group) }
|
||||||
|
|
||||||
private suspend fun requestGroup(requested: TowerGroup) {
|
suspend fun requestGroup(requested: TowerGroup) {
|
||||||
val peeked = queue.peek()
|
val peeked = queue.peek()
|
||||||
|
|
||||||
// Task ordering should be FIFO
|
// Task ordering should be FIFO
|
||||||
@@ -37,33 +32,8 @@ class TowerResolveManager internal constructor() {
|
|||||||
|
|
||||||
private suspend fun stopResolverTask(): Nothing = suspendCoroutine { }
|
private suspend fun stopResolverTask(): Nothing = suspendCoroutine { }
|
||||||
|
|
||||||
suspend fun processLevel(
|
suspend fun stopIfSuccess() {
|
||||||
towerLevel: SessionBasedTowerLevel,
|
|
||||||
callInfo: CallInfo,
|
|
||||||
group: TowerGroup,
|
|
||||||
explicitReceiverKind: ExplicitReceiverKind = ExplicitReceiverKind.NO_EXPLICIT_RECEIVER,
|
|
||||||
invokeResolveMode: InvokeResolveMode? = null
|
|
||||||
): ProcessorAction {
|
|
||||||
requestGroup(group)
|
|
||||||
|
|
||||||
val result = with(LevelHandler(callInfo, explicitReceiverKind, group, callResolutionContext, this)) {
|
|
||||||
towerLevel.handleLevel(invokeResolveMode)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isSuccess()) stopResolverTask()
|
if (isSuccess()) stopResolverTask()
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun processLevelForPropertyWithInvoke(
|
|
||||||
towerLevel: SessionBasedTowerLevel,
|
|
||||||
callInfo: CallInfo,
|
|
||||||
group: TowerGroup,
|
|
||||||
explicitReceiverKind: ExplicitReceiverKind = ExplicitReceiverKind.NO_EXPLICIT_RECEIVER
|
|
||||||
) {
|
|
||||||
if (callInfo.callKind == CallKind.Function) {
|
|
||||||
processLevel(towerLevel, callInfo, group, explicitReceiverKind, InvokeResolveMode.RECEIVER_FOR_INVOKE_BUILTIN_EXTENSION)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private data class SuspendedResolverTask(
|
private data class SuspendedResolverTask(
|
||||||
|
|||||||
Reference in New Issue
Block a user