Better equals in FuzzyType + do not need to treat not used parameters as free

This commit is contained in:
Valentin Kipyatkov
2015-01-29 16:36:32 +03:00
parent 3c573d555a
commit b2275ae424
@@ -43,16 +43,29 @@ fun FuzzyType.makeNotNullable() = FuzzyType(type.makeNotNullable(), freeParamete
fun FuzzyType.makeNullable() = FuzzyType(type.makeNullable(), freeParameters)
fun FuzzyType.nullability() = type.nullability()
data class FuzzyType(
class FuzzyType(
val type: JetType,
val freeParameters: Collection<TypeParameterDescriptor>
freeParameters: Collection<TypeParameterDescriptor>
) {
private val usedTypeParameters: HashSet<TypeParameterDescriptor>? = if (freeParameters.isNotEmpty()) HashSet() else null
private val usedTypeParameters: HashSet<TypeParameterDescriptor>?
public val freeParameters: Set<TypeParameterDescriptor>
;{
usedTypeParameters?.addUsedTypeParameters(type)
if (freeParameters.isNotEmpty()) {
usedTypeParameters = HashSet()
usedTypeParameters!!.addUsedTypeParameters(type)
this.freeParameters = freeParameters.filter { it in usedTypeParameters }.toSet()
}
else {
usedTypeParameters = null
this.freeParameters = setOf()
}
}
override fun equals(other: Any?) = other is FuzzyType && other.type == type && other.freeParameters == freeParameters
override fun hashCode() = type.hashCode()
private fun MutableSet<TypeParameterDescriptor>.addUsedTypeParameters(type: JetType) {
addIfNotNull(type.getConstructor().getDeclarationDescriptor() as? TypeParameterDescriptor)
@@ -90,9 +103,7 @@ data class FuzzyType(
val constraintSystem = ConstraintSystemImpl()
val typeVariables = LinkedHashMap<TypeParameterDescriptor, Variance>()
for (typeParameter in freeParameters) {
if (typeParameter in usedTypeParameters) {
typeVariables[typeParameter] = Variance.INVARIANT
}
typeVariables[typeParameter] = Variance.INVARIANT
}
constraintSystem.registerTypeVariables(typeVariables)