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.makeNullable() = FuzzyType(type.makeNullable(), freeParameters)
fun FuzzyType.nullability() = type.nullability() fun FuzzyType.nullability() = type.nullability()
data class FuzzyType( class FuzzyType(
val type: JetType, 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) { private fun MutableSet<TypeParameterDescriptor>.addUsedTypeParameters(type: JetType) {
addIfNotNull(type.getConstructor().getDeclarationDescriptor() as? TypeParameterDescriptor) addIfNotNull(type.getConstructor().getDeclarationDescriptor() as? TypeParameterDescriptor)
@@ -90,9 +103,7 @@ data class FuzzyType(
val constraintSystem = ConstraintSystemImpl() val constraintSystem = ConstraintSystemImpl()
val typeVariables = LinkedHashMap<TypeParameterDescriptor, Variance>() val typeVariables = LinkedHashMap<TypeParameterDescriptor, Variance>()
for (typeParameter in freeParameters) { for (typeParameter in freeParameters) {
if (typeParameter in usedTypeParameters) { typeVariables[typeParameter] = Variance.INVARIANT
typeVariables[typeParameter] = Variance.INVARIANT
}
} }
constraintSystem.registerTypeVariables(typeVariables) constraintSystem.registerTypeVariables(typeVariables)