Determine empty constraint system for a builder inference call by presense of not fixed type variables

This commit is contained in:
Victor Petukhov
2021-04-30 13:25:08 +03:00
parent c5faf532f5
commit 703a353d2e
10 changed files with 160 additions and 84 deletions
@@ -267,7 +267,7 @@ class BuilderInferenceSession(
storage: ConstraintStorage,
nonFixedToVariablesSubstitutor: NewTypeSubstitutor,
shouldIntegrateAllConstraints: Boolean
): Boolean {
) {
storage.notFixedTypeVariables.values.forEach {
if (it.typeVariable.freshTypeConstructor(commonSystem.typeSystemContext) !in commonSystem.allTypeVariables) {
commonSystem.registerVariable(it.typeVariable)
@@ -287,8 +287,6 @@ class BuilderInferenceSession(
* */
val callSubstitutor = storage.buildResultingSubstitutor(commonSystem, transformTypeVariablesToErrorTypes = false)
var introducedConstraint = false
for (initialConstraint in storage.initialConstraints) {
val lowerCallSubstituted = callSubstitutor.safeSubstitute(initialConstraint.a as UnwrappedType)
val upperCallSubstituted = callSubstitutor.safeSubstitute(initialConstraint.b as UnwrappedType)
@@ -297,8 +295,6 @@ class BuilderInferenceSession(
if (commonSystem.isProperType(lower) && commonSystem.isProperType(upper)) continue
introducedConstraint = true
when (initialConstraint.constraintKind) {
ConstraintKind.LOWER -> error("LOWER constraint shouldn't be used, please use UPPER")
@@ -317,11 +313,8 @@ class BuilderInferenceSession(
val typeVariable = storage.allTypeVariables.getValue(variableConstructor)
commonSystem.registerVariable(typeVariable)
commonSystem.addEqualityConstraint((typeVariable as NewTypeVariable).defaultType, type, CoroutinePosition)
introducedConstraint = true
}
}
return introducedConstraint
}
fun addExpectedTypeConstraint(
@@ -379,20 +372,14 @@ class BuilderInferenceSession(
integrateConstraints(initialStorage, nonFixedToVariablesSubstitutor, false)
var effectivelyEmptyCommonSystem = true
for (call in commonCalls) {
val hasConstraints =
integrateConstraints(call.callResolutionResult.constraintSystem, nonFixedToVariablesSubstitutor, false)
if (hasConstraints) effectivelyEmptyCommonSystem = false
integrateConstraints(call.callResolutionResult.constraintSystem, nonFixedToVariablesSubstitutor, false)
}
for (call in partiallyResolvedCallsInfo) {
val hasConstraints =
integrateConstraints(call.callResolutionResult.constraintSystem, nonFixedToVariablesSubstitutor, true)
if (hasConstraints) effectivelyEmptyCommonSystem = false
integrateConstraints(call.callResolutionResult.constraintSystem, nonFixedToVariablesSubstitutor, true)
}
return effectivelyEmptyCommonSystem
return commonSystem.notFixedTypeVariables.all { it.value.constraints.isEmpty() }
}
private fun reportErrors(completedCall: CallInfo, resolvedCall: ResolvedCall<*>, errors: List<ConstraintSystemError>) {