FIR: Move some responsibilities of TowerResolveManager to FirTowerResolverSession

This commit is contained in:
Denis Zharkov
2020-03-27 15:26:29 +03:00
parent a39dbe8eec
commit 123bcdb0ad
5 changed files with 73 additions and 75 deletions
@@ -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
) )
} }
@@ -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
@@ -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,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(