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.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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user