FIR: Provide Candidate receiver to argument resolution helpers
The receiver might be useful for working with postponed atoms and other info from the Candidate ^KT-32725 In Progress
This commit is contained in:
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystem
|
|||||||
import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtomMarker
|
import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtomMarker
|
||||||
|
|
||||||
|
|
||||||
fun resolveArgumentExpression(
|
fun Candidate.resolveArgumentExpression(
|
||||||
/*
|
/*
|
||||||
csBuilder: ConstraintSystemBuilder,
|
csBuilder: ConstraintSystemBuilder,
|
||||||
argument: KotlinCallArgument,
|
argument: KotlinCallArgument,
|
||||||
@@ -35,7 +35,6 @@ fun resolveArgumentExpression(
|
|||||||
sink: CheckerSink,
|
sink: CheckerSink,
|
||||||
isReceiver: Boolean,
|
isReceiver: Boolean,
|
||||||
isSafeCall: Boolean,
|
isSafeCall: Boolean,
|
||||||
acceptLambdaAtoms: (PostponedResolvedAtomMarker) -> Unit,
|
|
||||||
typeProvider: (FirExpression) -> FirTypeRef?
|
typeProvider: (FirExpression) -> FirTypeRef?
|
||||||
) {
|
) {
|
||||||
return when (argument) {
|
return when (argument) {
|
||||||
@@ -61,7 +60,7 @@ fun resolveArgumentExpression(
|
|||||||
typeProvider
|
typeProvider
|
||||||
)
|
)
|
||||||
// TODO:!
|
// TODO:!
|
||||||
is FirAnonymousFunction -> preprocessLambdaArgument(csBuilder, argument, expectedType, expectedTypeRef, acceptLambdaAtoms)
|
is FirAnonymousFunction -> preprocessLambdaArgument(csBuilder, argument, expectedType, expectedTypeRef)
|
||||||
// TODO:!
|
// TODO:!
|
||||||
//TODO: Collection literal
|
//TODO: Collection literal
|
||||||
is FirWrappedArgumentExpression -> resolveArgumentExpression(
|
is FirWrappedArgumentExpression -> resolveArgumentExpression(
|
||||||
@@ -72,7 +71,6 @@ fun resolveArgumentExpression(
|
|||||||
sink,
|
sink,
|
||||||
isReceiver,
|
isReceiver,
|
||||||
isSafeCall,
|
isSafeCall,
|
||||||
acceptLambdaAtoms,
|
|
||||||
typeProvider
|
typeProvider
|
||||||
)
|
)
|
||||||
is FirBlock -> resolveBlockArgument(
|
is FirBlock -> resolveBlockArgument(
|
||||||
@@ -83,14 +81,13 @@ fun resolveArgumentExpression(
|
|||||||
sink,
|
sink,
|
||||||
isReceiver,
|
isReceiver,
|
||||||
isSafeCall,
|
isSafeCall,
|
||||||
acceptLambdaAtoms,
|
|
||||||
typeProvider
|
typeProvider
|
||||||
)
|
)
|
||||||
else -> resolvePlainExpressionArgument(csBuilder, argument, expectedType, sink, isReceiver, isSafeCall, typeProvider)
|
else -> resolvePlainExpressionArgument(csBuilder, argument, expectedType, sink, isReceiver, isSafeCall, typeProvider)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun resolveBlockArgument(
|
private fun Candidate.resolveBlockArgument(
|
||||||
csBuilder: ConstraintSystemBuilder,
|
csBuilder: ConstraintSystemBuilder,
|
||||||
block: FirBlock,
|
block: FirBlock,
|
||||||
expectedType: ConeKotlinType,
|
expectedType: ConeKotlinType,
|
||||||
@@ -98,7 +95,6 @@ private fun resolveBlockArgument(
|
|||||||
sink: CheckerSink,
|
sink: CheckerSink,
|
||||||
isReceiver: Boolean,
|
isReceiver: Boolean,
|
||||||
isSafeCall: Boolean,
|
isSafeCall: Boolean,
|
||||||
acceptLambdaAtoms: (PostponedResolvedAtomMarker) -> Unit,
|
|
||||||
typeProvider: (FirExpression) -> FirTypeRef?
|
typeProvider: (FirExpression) -> FirTypeRef?
|
||||||
) {
|
) {
|
||||||
val returnArguments = block.returnExpressions()
|
val returnArguments = block.returnExpressions()
|
||||||
@@ -123,7 +119,6 @@ private fun resolveBlockArgument(
|
|||||||
sink,
|
sink,
|
||||||
isReceiver,
|
isReceiver,
|
||||||
isSafeCall,
|
isSafeCall,
|
||||||
acceptLambdaAtoms,
|
|
||||||
typeProvider
|
typeProvider
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -230,7 +225,6 @@ internal fun Candidate.resolveArgument(
|
|||||||
sink,
|
sink,
|
||||||
isReceiver,
|
isReceiver,
|
||||||
isSafeCall,
|
isSafeCall,
|
||||||
{ this.postponedAtoms += it },
|
|
||||||
typeProvider
|
typeProvider
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -18,12 +18,11 @@ import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder
|
|||||||
import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtomMarker
|
import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtomMarker
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
|
|
||||||
fun preprocessLambdaArgument(
|
fun Candidate.preprocessLambdaArgument(
|
||||||
csBuilder: ConstraintSystemBuilder,
|
csBuilder: ConstraintSystemBuilder,
|
||||||
argument: FirAnonymousFunction,
|
argument: FirAnonymousFunction,
|
||||||
expectedType: ConeKotlinType?,
|
expectedType: ConeKotlinType?,
|
||||||
expectedTypeRef: FirTypeRef,
|
expectedTypeRef: FirTypeRef,
|
||||||
acceptLambdaAtoms: (PostponedResolvedAtomMarker) -> Unit,
|
|
||||||
forceResolution: Boolean = false
|
forceResolution: Boolean = false
|
||||||
) {
|
) {
|
||||||
if (expectedType != null && !forceResolution && csBuilder.isTypeVariable(expectedType)) {
|
if (expectedType != null && !forceResolution && csBuilder.isTypeVariable(expectedType)) {
|
||||||
@@ -42,7 +41,7 @@ fun preprocessLambdaArgument(
|
|||||||
// csBuilder.addSubtypeConstraint(lambdaType, expectedType, ArgumentConstraintPosition(argument))
|
// csBuilder.addSubtypeConstraint(lambdaType, expectedType, ArgumentConstraintPosition(argument))
|
||||||
}
|
}
|
||||||
|
|
||||||
acceptLambdaAtoms(resolvedArgument)
|
postponedAtoms += resolvedArgument
|
||||||
}
|
}
|
||||||
|
|
||||||
fun preprocessCallableReference(
|
fun preprocessCallableReference(
|
||||||
|
|||||||
+5
-5
@@ -33,9 +33,10 @@ interface LambdaAnalyzer {
|
|||||||
|
|
||||||
|
|
||||||
class PostponedArgumentsAnalyzer(
|
class PostponedArgumentsAnalyzer(
|
||||||
val lambdaAnalyzer: LambdaAnalyzer,
|
private val lambdaAnalyzer: LambdaAnalyzer,
|
||||||
val typeProvider: (FirExpression) -> FirTypeRef?,
|
private val typeProvider: (FirExpression) -> FirTypeRef?,
|
||||||
val components: InferenceComponents
|
private val components: InferenceComponents,
|
||||||
|
private val candidate: Candidate
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun analyze(
|
fun analyze(
|
||||||
@@ -103,7 +104,7 @@ class PostponedArgumentsAnalyzer(
|
|||||||
|
|
||||||
val subResolvedKtPrimitives = returnArguments.map {
|
val subResolvedKtPrimitives = returnArguments.map {
|
||||||
var atom: PostponedResolvedAtomMarker? = null
|
var atom: PostponedResolvedAtomMarker? = null
|
||||||
resolveArgumentExpression(
|
candidate.resolveArgumentExpression(
|
||||||
c.getBuilder(),
|
c.getBuilder(),
|
||||||
it,
|
it,
|
||||||
lambda.returnType.let(::substitute),
|
lambda.returnType.let(::substitute),
|
||||||
@@ -111,7 +112,6 @@ class PostponedArgumentsAnalyzer(
|
|||||||
checkerSink,
|
checkerSink,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
{ atom = it },
|
|
||||||
typeProvider
|
typeProvider
|
||||||
)
|
)
|
||||||
// resolveKtPrimitive(
|
// resolveKtPrimitive(
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ internal sealed class CheckReceivers : ResolutionStage() {
|
|||||||
|
|
||||||
if (expectedReceiverType != null) {
|
if (expectedReceiverType != null) {
|
||||||
if (explicitReceiverExpression != null && explicitReceiverKind.shouldBeCheckedAgainstExplicit()) {
|
if (explicitReceiverExpression != null && explicitReceiverKind.shouldBeCheckedAgainstExplicit()) {
|
||||||
resolveArgumentExpression(
|
candidate.resolveArgumentExpression(
|
||||||
candidate.csBuilder,
|
candidate.csBuilder,
|
||||||
argument = explicitReceiverExpression,
|
argument = explicitReceiverExpression,
|
||||||
expectedType = candidate.substitutor.substituteOrSelf(expectedReceiverType),
|
expectedType = candidate.substitutor.substituteOrSelf(expectedReceiverType),
|
||||||
@@ -101,8 +101,7 @@ internal sealed class CheckReceivers : ResolutionStage() {
|
|||||||
sink = sink,
|
sink = sink,
|
||||||
isReceiver = true,
|
isReceiver = true,
|
||||||
isSafeCall = callInfo.isSafeCall,
|
isSafeCall = callInfo.isSafeCall,
|
||||||
typeProvider = callInfo.typeProvider,
|
typeProvider = callInfo.typeProvider
|
||||||
acceptLambdaAtoms = { candidate.postponedAtoms += it }
|
|
||||||
)
|
)
|
||||||
sink.yield()
|
sink.yield()
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+3
-2
@@ -70,7 +70,8 @@ class FirCallCompleter(
|
|||||||
val completionMode = candidate.computeCompletionMode(inferenceComponents, expectedTypeRef, initialType)
|
val completionMode = candidate.computeCompletionMode(inferenceComponents, expectedTypeRef, initialType)
|
||||||
val replacements = mutableMapOf<FirExpression, FirExpression>()
|
val replacements = mutableMapOf<FirExpression, FirExpression>()
|
||||||
|
|
||||||
val analyzer = PostponedArgumentsAnalyzer(LambdaAnalyzerImpl(replacements), { it.resultType }, inferenceComponents)
|
val analyzer =
|
||||||
|
PostponedArgumentsAnalyzer(LambdaAnalyzerImpl(replacements), { it.resultType }, inferenceComponents, candidate)
|
||||||
|
|
||||||
completer.complete(candidate.system.asConstraintSystemCompleterContext(), completionMode, listOf(call), initialType) {
|
completer.complete(candidate.system.asConstraintSystemCompleterContext(), completionMode, listOf(call), initialType) {
|
||||||
analyzer.analyze(candidate.system.asPostponedArgumentsAnalyzerContext(), it)
|
analyzer.analyze(candidate.system.asPostponedArgumentsAnalyzerContext(), it)
|
||||||
@@ -137,4 +138,4 @@ class FirCallCompleter(
|
|||||||
return (newLambdaExpression.body?.returnExpressions() ?: emptyList()) to InferenceSession.default
|
return (newLambdaExpression.body?.returnExpressions() ?: emptyList()) to InferenceSession.default
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user