[FIR] Process implicit receivers in calls with contract
This commit is contained in:
+2
-2
@@ -728,8 +728,8 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
|
|||||||
else -> throw IllegalArgumentException("Unsupported constant reference: $value")
|
else -> throw IllegalArgumentException("Unsupported constant reference: $value")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
graphBuilder.exitContract(functionCall).mergeIncomingFlow()
|
graphBuilder.exitContract(functionCall).mergeIncomingFlow(updateReceivers = true)
|
||||||
contractDescriptionVisitingMode = true
|
contractDescriptionVisitingMode = false
|
||||||
}
|
}
|
||||||
|
|
||||||
fun exitConstExpresion(constExpression: FirConstExpression<*>) {
|
fun exitConstExpresion(constExpression: FirConstExpression<*>) {
|
||||||
|
|||||||
+3
-6
@@ -8,9 +8,8 @@ package org.jetbrains.kotlin.fir.resolve.dfa.contracts
|
|||||||
import org.jetbrains.kotlin.fir.contracts.description.*
|
import org.jetbrains.kotlin.fir.contracts.description.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.builder.*
|
import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||||
import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference
|
import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference
|
||||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
@@ -89,10 +88,8 @@ fun ConeConditionalEffectDeclaration.buildContractFir(argumentMapping: Map<Int,
|
|||||||
fun createArgumentsMapping(functionCall: FirFunctionCall): Map<Int, FirExpression>? {
|
fun createArgumentsMapping(functionCall: FirFunctionCall): Map<Int, FirExpression>? {
|
||||||
val function = functionCall.toResolvedCallableSymbol()?.fir as? FirSimpleFunction ?: return null
|
val function = functionCall.toResolvedCallableSymbol()?.fir as? FirSimpleFunction ?: return null
|
||||||
val argumentsMapping = mutableMapOf<Int, FirExpression>()
|
val argumentsMapping = mutableMapOf<Int, FirExpression>()
|
||||||
// TODO: process implicit receiver
|
functionCall.extensionReceiver.takeIf { it != FirNoReceiverExpression }?.let { argumentsMapping[-1] = it }
|
||||||
// TODO: change to mapping from candidate
|
?: functionCall.dispatchReceiver.takeIf { it != FirNoReceiverExpression }?.let { argumentsMapping[-1] = it }
|
||||||
// problem: we have already resolved reference without candidate
|
|
||||||
functionCall.explicitReceiver?.let { argumentsMapping[-1] = it }
|
|
||||||
|
|
||||||
|
|
||||||
val nameToIndex = function.valueParameters.mapIndexed { index, parameter -> parameter.name to index }.toMap()
|
val nameToIndex = function.valueParameters.mapIndexed { index, parameter -> parameter.name to index }.toMap()
|
||||||
|
|||||||
Reference in New Issue
Block a user