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.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()}"
}
@@ -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
@@ -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)