FIR: Extract LevelHandler.processInvokeReceiversCandidates
This commit is contained in:
+67
-62
@@ -180,68 +180,7 @@ class TowerResolveManager internal constructor(private val towerResolver: FirTow
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (invokeReceiverCollector.isSuccess()) {
|
if (invokeReceiverCollector.isSuccess()) {
|
||||||
for (invokeReceiverCandidate in invokeReceiverCollector.bestCandidates()) {
|
processInvokeReceiversCandidates(invokeBuiltinExtensionMode)
|
||||||
|
|
||||||
val symbol = invokeReceiverCandidate.symbol
|
|
||||||
if (symbol !is FirCallableSymbol<*> && symbol !is FirRegularClassSymbol) continue
|
|
||||||
val isExtensionFunctionType = (symbol as? FirCallableSymbol<*>)?.fir?.returnTypeRef?.isExtensionFunctionType(towerResolver.components.session) == true
|
|
||||||
if (invokeBuiltinExtensionMode && !isExtensionFunctionType) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
val extensionReceiverExpression = invokeReceiverCandidate.extensionReceiverExpression()
|
|
||||||
val useImplicitReceiverAsBuiltinInvokeArgument =
|
|
||||||
!invokeBuiltinExtensionMode && isExtensionFunctionType &&
|
|
||||||
invokeReceiverCandidate.explicitReceiverKind == ExplicitReceiverKind.NO_EXPLICIT_RECEIVER
|
|
||||||
|
|
||||||
val invokeReceiverExpression = createExplicitReceiverForInvoke(invokeReceiverCandidate).let {
|
|
||||||
if (!invokeBuiltinExtensionMode) {
|
|
||||||
it.extensionReceiver = extensionReceiverExpression
|
|
||||||
// NB: this should fix problem in DFA (KT-36014)
|
|
||||||
it.explicitReceiver = info.explicitReceiver
|
|
||||||
it.safe = info.isSafeCall
|
|
||||||
}
|
|
||||||
towerResolver.components.transformQualifiedAccessUsingSmartcastInfo(it.build())
|
|
||||||
}
|
|
||||||
|
|
||||||
val invokeFunctionInfo =
|
|
||||||
info.copy(explicitReceiver = invokeReceiverExpression, name = OperatorNameConventions.INVOKE).let {
|
|
||||||
when {
|
|
||||||
invokeBuiltinExtensionMode -> it.withReceiverAsArgument(info.explicitReceiver!!)
|
|
||||||
else -> it
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val explicitReceiver = ExpressionReceiverValue(invokeReceiverExpression)
|
|
||||||
invokeOnGivenReceiverCandidateFactory = CandidateFactory(towerResolver.components, invokeFunctionInfo)
|
|
||||||
when {
|
|
||||||
invokeBuiltinExtensionMode -> {
|
|
||||||
enqueueResolverTask {
|
|
||||||
towerResolver.runResolverForBuiltinInvokeExtensionWithExplicitArgument(
|
|
||||||
invokeFunctionInfo, explicitReceiver, this@TowerResolveManager
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
useImplicitReceiverAsBuiltinInvokeArgument -> {
|
|
||||||
enqueueResolverTask {
|
|
||||||
towerResolver.runResolverForBuiltinInvokeExtensionWithImplicitArgument(
|
|
||||||
invokeFunctionInfo, explicitReceiver, this@TowerResolveManager
|
|
||||||
)
|
|
||||||
}
|
|
||||||
enqueueResolverTask {
|
|
||||||
towerResolver.runResolverForInvoke(
|
|
||||||
invokeFunctionInfo, explicitReceiver, this@TowerResolveManager
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
enqueueResolverTask {
|
|
||||||
towerResolver.runResolverForInvoke(
|
|
||||||
invokeFunctionInfo, explicitReceiver, this@TowerResolveManager
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CallKind.CallableReference -> {
|
CallKind.CallableReference -> {
|
||||||
@@ -279,6 +218,72 @@ class TowerResolveManager internal constructor(private val towerResolver: FirTow
|
|||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun processInvokeReceiversCandidates(invokeBuiltinExtensionMode: Boolean) {
|
||||||
|
for (invokeReceiverCandidate in invokeReceiverCollector.bestCandidates()) {
|
||||||
|
|
||||||
|
val symbol = invokeReceiverCandidate.symbol
|
||||||
|
if (symbol !is FirCallableSymbol<*> && symbol !is FirRegularClassSymbol) continue
|
||||||
|
val isExtensionFunctionType =
|
||||||
|
(symbol as? FirCallableSymbol<*>)?.fir?.returnTypeRef?.isExtensionFunctionType(towerResolver.components.session) == true
|
||||||
|
if (invokeBuiltinExtensionMode && !isExtensionFunctionType) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
val extensionReceiverExpression = invokeReceiverCandidate.extensionReceiverExpression()
|
||||||
|
val useImplicitReceiverAsBuiltinInvokeArgument =
|
||||||
|
!invokeBuiltinExtensionMode && isExtensionFunctionType &&
|
||||||
|
invokeReceiverCandidate.explicitReceiverKind == ExplicitReceiverKind.NO_EXPLICIT_RECEIVER
|
||||||
|
|
||||||
|
val invokeReceiverExpression = createExplicitReceiverForInvoke(invokeReceiverCandidate).let {
|
||||||
|
if (!invokeBuiltinExtensionMode) {
|
||||||
|
it.extensionReceiver = extensionReceiverExpression
|
||||||
|
// NB: this should fix problem in DFA (KT-36014)
|
||||||
|
it.explicitReceiver = info.explicitReceiver
|
||||||
|
it.safe = info.isSafeCall
|
||||||
|
}
|
||||||
|
towerResolver.components.transformQualifiedAccessUsingSmartcastInfo(it.build())
|
||||||
|
}
|
||||||
|
|
||||||
|
val invokeFunctionInfo =
|
||||||
|
info.copy(explicitReceiver = invokeReceiverExpression, name = OperatorNameConventions.INVOKE).let {
|
||||||
|
when {
|
||||||
|
invokeBuiltinExtensionMode -> it.withReceiverAsArgument(info.explicitReceiver!!)
|
||||||
|
else -> it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val explicitReceiver = ExpressionReceiverValue(invokeReceiverExpression)
|
||||||
|
invokeOnGivenReceiverCandidateFactory = CandidateFactory(towerResolver.components, invokeFunctionInfo)
|
||||||
|
when {
|
||||||
|
invokeBuiltinExtensionMode -> {
|
||||||
|
enqueueResolverTask {
|
||||||
|
towerResolver.runResolverForBuiltinInvokeExtensionWithExplicitArgument(
|
||||||
|
invokeFunctionInfo, explicitReceiver, this@TowerResolveManager
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
useImplicitReceiverAsBuiltinInvokeArgument -> {
|
||||||
|
enqueueResolverTask {
|
||||||
|
towerResolver.runResolverForBuiltinInvokeExtensionWithImplicitArgument(
|
||||||
|
invokeFunctionInfo, explicitReceiver, this@TowerResolveManager
|
||||||
|
)
|
||||||
|
}
|
||||||
|
enqueueResolverTask {
|
||||||
|
towerResolver.runResolverForInvoke(
|
||||||
|
invokeFunctionInfo, explicitReceiver, this@TowerResolveManager
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
enqueueResolverTask {
|
||||||
|
towerResolver.runResolverForInvoke(
|
||||||
|
invokeFunctionInfo, explicitReceiver, this@TowerResolveManager
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun reset() {
|
fun reset() {
|
||||||
|
|||||||
Reference in New Issue
Block a user