diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolutionMode.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolutionMode.kt index 3a43a2914d1..d6e97ab01d8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolutionMode.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolutionMode.kt @@ -11,20 +11,20 @@ import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef -sealed class ResolutionMode { - object ContextDependent : ResolutionMode() { +sealed class ResolutionMode(val forceFullCompletion: Boolean) { + object ContextDependent : ResolutionMode(forceFullCompletion = false) { override fun toString(): String = "ContextDependent" } - object ContextDependentDelegate : ResolutionMode() { + object ContextDependentDelegate : ResolutionMode(forceFullCompletion = false) { override fun toString(): String = "ContextDependentDelegate" } - object ContextIndependent : ResolutionMode() { + object ContextIndependent : ResolutionMode(forceFullCompletion = true) { override fun toString(): String = "ContextIndependent" } - object ReceiverResolution : ResolutionMode() { + object ReceiverResolution : ResolutionMode(forceFullCompletion = true) { override fun toString(): String = "ReceiverResolution" } @@ -42,7 +42,7 @@ sealed class ResolutionMode { // In these examples we should try using the property type information while resolving the initializer, // but it's ok if it's not applicable val shouldBeStrictlyEnforced: Boolean = true, - ) : ResolutionMode() { + ) : ResolutionMode(forceFullCompletion = true) { override fun toString(): String { return "WithExpectedType: ${expectedTypeRef.prettyString()}, " + "mayBeCoercionToUnitApplied=${mayBeCoercionToUnitApplied}, " + @@ -52,13 +52,13 @@ sealed class ResolutionMode { } } - class WithStatus(val status: FirDeclarationStatus) : ResolutionMode() { + class WithStatus(val status: FirDeclarationStatus) : ResolutionMode(forceFullCompletion = false) { override fun toString(): String { return "WithStatus: ${status.render()}" } } - class LambdaResolution(val expectedReturnTypeRef: FirResolvedTypeRef?) : ResolutionMode() { + class LambdaResolution(val expectedReturnTypeRef: FirResolvedTypeRef?) : ResolutionMode(forceFullCompletion = false) { override fun toString(): String { return "LambdaResolution: ${expectedReturnTypeRef.prettyString()}" } @@ -75,7 +75,7 @@ sealed class ResolutionMode { * - assigning to a property with a setter that has a different visibility than the property * - assigning to a non-deprecated property with a setter that is deprecated */ - class AssignmentLValue(val variableAssignment: FirVariableAssignment) : ResolutionMode() { + class AssignmentLValue(val variableAssignment: FirVariableAssignment) : ResolutionMode(forceFullCompletion = true) { override fun toString(): String = "AssignmentLValue: ${variableAssignment.render()}" } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/CompletionModeCalculator.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/CompletionModeCalculator.kt index d36067373e4..f0fb598a2de 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/CompletionModeCalculator.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/CompletionModeCalculator.kt @@ -5,12 +5,11 @@ package org.jetbrains.kotlin.fir.resolve.inference +import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.calls.Candidate -import org.jetbrains.kotlin.fir.types.ConeIntegerLiteralType import org.jetbrains.kotlin.fir.types.ConeKotlinType -import org.jetbrains.kotlin.fir.types.FirTypeRef -import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionContext +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.components.TrivialConstraintTypeInferenceOracle import org.jetbrains.kotlin.resolve.calls.inference.model.Constraint import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints @@ -21,12 +20,12 @@ import java.util.* fun Candidate.computeCompletionMode( components: InferenceComponents, - expectedType: FirTypeRef?, + resolutionMode: ResolutionMode, currentReturnType: ConeKotlinType? ): ConstraintSystemCompletionMode { return when { - // Presence of expected type means that we are trying to complete outermost call => completion mode should be full - expectedType != null -> ConstraintSystemCompletionMode.FULL + // Expected type is present or call is being resolved in independent context + resolutionMode.forceFullCompletion -> ConstraintSystemCompletionMode.FULL // This is questionable as null return type can be only for error call currentReturnType == null -> ConstraintSystemCompletionMode.PARTIAL diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt index 0b49451648e..864b14a1dc4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.calls.* -import org.jetbrains.kotlin.fir.resolve.expectedType import org.jetbrains.kotlin.fir.resolve.inference.model.ConeArgumentConstraintPosition import org.jetbrains.kotlin.fir.resolve.inference.model.ConeExpectedTypeConstraintPosition import org.jetbrains.kotlin.fir.resolve.initialTypeOfCandidate @@ -77,7 +76,7 @@ class FirCallCompleter( ) val completionMode = candidate.computeCompletionMode( - session.inferenceComponents, resolutionMode.expectedType(components, allowFromCast = true), initialType + session.inferenceComponents, resolutionMode, initialType ) val analyzer = createPostponedArgumentsAnalyzer(transformer.resolutionContext)