Approximate captured types in contravariant positions properly

^KT-43802 Fixed
This commit is contained in:
Victor Petukhov
2021-02-18 16:29:59 +03:00
parent 387d84f826
commit 4e5647090e
10 changed files with 205 additions and 6 deletions
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.resolve.calls
import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType
import org.jetbrains.kotlin.builtins.getValueParameterTypesFromFunctionType
import org.jetbrains.kotlin.builtins.isFunctionOrSuspendFunctionType
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.contracts.EffectSystem
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
@@ -248,7 +249,12 @@ class CallCompleter(
val system = builder.build()
setConstraintSystem(system)
setResultingSubstitutor(system.resultingSubstitutor)
val isNewInferenceEnabled = effectSystem.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
val resultingSubstitutor = if (isNewInferenceEnabled) {
system.resultingSubstitutor.replaceWithContravariantApproximatingSubstitution()
} else system.resultingSubstitutor
setResultingSubstitutor(resultingSubstitutor)
}
private fun <D : CallableDescriptor> MutableResolvedCall<D>.updateResolutionStatusFromConstraintSystem(
@@ -347,7 +347,13 @@ class GenericCandidateResolver(
}
val resultingSystem = constraintSystem.build()
resolvedCall.setConstraintSystem(resultingSystem)
resolvedCall.setResultingSubstitutor(resultingSystem.resultingSubstitutor)
val isNewInferenceEnabled = languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
val resultingSubstitutor = if (isNewInferenceEnabled) {
resultingSystem.resultingSubstitutor.replaceWithContravariantApproximatingSubstitution()
} else resultingSystem.resultingSubstitutor
resolvedCall.setResultingSubstitutor(resultingSubstitutor)
}
// See KT-5385
@@ -151,10 +151,6 @@ internal class ConstraintSystemImpl(
)
}
private class SubstitutionWithCapturedTypeApproximation(substitution: TypeSubstitution) : DelegatedTypeSubstitution(substitution) {
override fun approximateCapturedTypes() = true
}
private fun satisfyInitialConstraints(): Boolean {
val substitutor = getSubstitutor(substituteOriginal = false) { ErrorUtils.createUninferredParameterType(it.originalTypeParameter) }
fun KotlinType.substitute(): KotlinType? = substitutor.substitute(this, Variance.INVARIANT)