Better equals in FuzzyType + do not need to treat not used parameters as free
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user