K2: Generify completion mode computation

Now, it's generated from ResolutionMode, that later allows to define
more granular rules
This commit is contained in:
Denis.Zharkov
2022-12-01 14:37:09 +01:00
committed by Space Team
parent 28ff276320
commit df826f04a7
3 changed files with 15 additions and 17 deletions
@@ -11,20 +11,20 @@ import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
sealed class ResolutionMode { sealed class ResolutionMode(val forceFullCompletion: Boolean) {
object ContextDependent : ResolutionMode() { object ContextDependent : ResolutionMode(forceFullCompletion = false) {
override fun toString(): String = "ContextDependent" override fun toString(): String = "ContextDependent"
} }
object ContextDependentDelegate : ResolutionMode() { object ContextDependentDelegate : ResolutionMode(forceFullCompletion = false) {
override fun toString(): String = "ContextDependentDelegate" override fun toString(): String = "ContextDependentDelegate"
} }
object ContextIndependent : ResolutionMode() { object ContextIndependent : ResolutionMode(forceFullCompletion = true) {
override fun toString(): String = "ContextIndependent" override fun toString(): String = "ContextIndependent"
} }
object ReceiverResolution : ResolutionMode() { object ReceiverResolution : ResolutionMode(forceFullCompletion = true) {
override fun toString(): String = "ReceiverResolution" 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, // In these examples we should try using the property type information while resolving the initializer,
// but it's ok if it's not applicable // but it's ok if it's not applicable
val shouldBeStrictlyEnforced: Boolean = true, val shouldBeStrictlyEnforced: Boolean = true,
) : ResolutionMode() { ) : ResolutionMode(forceFullCompletion = true) {
override fun toString(): String { override fun toString(): String {
return "WithExpectedType: ${expectedTypeRef.prettyString()}, " + return "WithExpectedType: ${expectedTypeRef.prettyString()}, " +
"mayBeCoercionToUnitApplied=${mayBeCoercionToUnitApplied}, " + "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 { override fun toString(): String {
return "WithStatus: ${status.render()}" return "WithStatus: ${status.render()}"
} }
} }
class LambdaResolution(val expectedReturnTypeRef: FirResolvedTypeRef?) : ResolutionMode() { class LambdaResolution(val expectedReturnTypeRef: FirResolvedTypeRef?) : ResolutionMode(forceFullCompletion = false) {
override fun toString(): String { override fun toString(): String {
return "LambdaResolution: ${expectedReturnTypeRef.prettyString()}" 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 property with a setter that has a different visibility than the property
* - assigning to a non-deprecated property with a setter that is deprecated * - 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()}" override fun toString(): String = "AssignmentLValue: ${variableAssignment.render()}"
} }
@@ -5,12 +5,11 @@
package org.jetbrains.kotlin.fir.resolve.inference 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.resolve.calls.Candidate
import org.jetbrains.kotlin.fir.types.ConeIntegerLiteralType
import org.jetbrains.kotlin.fir.types.ConeKotlinType 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.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.components.TrivialConstraintTypeInferenceOracle
import org.jetbrains.kotlin.resolve.calls.inference.model.Constraint import org.jetbrains.kotlin.resolve.calls.inference.model.Constraint
import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints
@@ -21,12 +20,12 @@ import java.util.*
fun Candidate.computeCompletionMode( fun Candidate.computeCompletionMode(
components: InferenceComponents, components: InferenceComponents,
expectedType: FirTypeRef?, resolutionMode: ResolutionMode,
currentReturnType: ConeKotlinType? currentReturnType: ConeKotlinType?
): ConstraintSystemCompletionMode { ): ConstraintSystemCompletionMode {
return when { return when {
// Presence of expected type means that we are trying to complete outermost call => completion mode should be full // Expected type is present or call is being resolved in independent context
expectedType != null -> ConstraintSystemCompletionMode.FULL resolutionMode.forceFullCompletion -> ConstraintSystemCompletionMode.FULL
// This is questionable as null return type can be only for error call // This is questionable as null return type can be only for error call
currentReturnType == null -> ConstraintSystemCompletionMode.PARTIAL currentReturnType == null -> ConstraintSystemCompletionMode.PARTIAL
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.calls.* 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.ConeArgumentConstraintPosition
import org.jetbrains.kotlin.fir.resolve.inference.model.ConeExpectedTypeConstraintPosition import org.jetbrains.kotlin.fir.resolve.inference.model.ConeExpectedTypeConstraintPosition
import org.jetbrains.kotlin.fir.resolve.initialTypeOfCandidate import org.jetbrains.kotlin.fir.resolve.initialTypeOfCandidate
@@ -77,7 +76,7 @@ class FirCallCompleter(
) )
val completionMode = candidate.computeCompletionMode( val completionMode = candidate.computeCompletionMode(
session.inferenceComponents, resolutionMode.expectedType(components, allowFromCast = true), initialType session.inferenceComponents, resolutionMode, initialType
) )
val analyzer = createPostponedArgumentsAnalyzer(transformer.resolutionContext) val analyzer = createPostponedArgumentsAnalyzer(transformer.resolutionContext)