From 5c61211e65216852295e16b066dbd8457857b0de Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 26 Mar 2020 09:52:11 +0300 Subject: [PATCH] FIR: Extract LevelHandler.processInvokeReceiversCandidates --- .../fir/resolve/calls/TowerResolveManager.kt | 129 +++++++++--------- 1 file changed, 67 insertions(+), 62 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerResolveManager.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerResolveManager.kt index f64e6d2ec56..0dac1a60cb3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerResolveManager.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerResolveManager.kt @@ -180,68 +180,7 @@ class TowerResolveManager internal constructor(private val towerResolver: FirTow } if (invokeReceiverCollector.isSuccess()) { - 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 - ) - } - } - } - } + processInvokeReceiversCandidates(invokeBuiltinExtensionMode) } } CallKind.CallableReference -> { @@ -279,6 +218,72 @@ class TowerResolveManager internal constructor(private val towerResolver: FirTow } 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() {