Minor, move some utilities closer to their usages
This commit is contained in:
+24
-3
@@ -114,7 +114,7 @@ public class TypeBoundsImpl(
|
|||||||
//fun <T> foo(t: T, consumer: Consumer<T>): T
|
//fun <T> foo(t: T, consumer: Consumer<T>): T
|
||||||
//foo(1, c: Consumer<Any>) - infer Int, not Any here
|
//foo(1, c: Consumer<Any>) - infer Int, not Any here
|
||||||
|
|
||||||
val superTypeOfNumberLowerBounds = TypeUtils.commonSupertypeForNumberTypes(numberLowerBounds)
|
val superTypeOfNumberLowerBounds = commonSupertypeForNumberTypes(numberLowerBounds)
|
||||||
if (tryPossibleAnswer(bounds, superTypeOfNumberLowerBounds)) {
|
if (tryPossibleAnswer(bounds, superTypeOfNumberLowerBounds)) {
|
||||||
return setOf(superTypeOfNumberLowerBounds!!)
|
return setOf(superTypeOfNumberLowerBounds!!)
|
||||||
}
|
}
|
||||||
@@ -152,7 +152,7 @@ public class TypeBoundsImpl(
|
|||||||
|
|
||||||
// For non-denotable number types only, no valid types are mentioned, so common supertype is valid
|
// For non-denotable number types only, no valid types are mentioned, so common supertype is valid
|
||||||
val numberLowerBounds = filterBounds(bounds, LOWER_BOUND).filter { it.constructor is IntegerValueTypeConstructor }
|
val numberLowerBounds = filterBounds(bounds, LOWER_BOUND).filter { it.constructor is IntegerValueTypeConstructor }
|
||||||
val superTypeOfNumberLowerBounds = TypeUtils.commonSupertypeForNumberTypes(numberLowerBounds)
|
val superTypeOfNumberLowerBounds = commonSupertypeForNumberTypes(numberLowerBounds)
|
||||||
if (possibleAnswer == superTypeOfNumberLowerBounds) return true
|
if (possibleAnswer == superTypeOfNumberLowerBounds) return true
|
||||||
|
|
||||||
return false
|
return false
|
||||||
@@ -182,4 +182,25 @@ public class TypeBoundsImpl(
|
|||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private fun commonSupertypeForNumberTypes(numberLowerBounds: Collection<KotlinType>): KotlinType? {
|
||||||
|
if (numberLowerBounds.isEmpty()) return null
|
||||||
|
val intersectionOfSupertypes = getIntersectionOfSupertypes(numberLowerBounds)
|
||||||
|
return TypeUtils.getDefaultPrimitiveNumberType(intersectionOfSupertypes) ?:
|
||||||
|
CommonSupertypes.commonSupertype(numberLowerBounds)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getIntersectionOfSupertypes(types: Collection<KotlinType>): Set<KotlinType> {
|
||||||
|
val upperBounds = HashSet<KotlinType>()
|
||||||
|
for (type in types) {
|
||||||
|
val supertypes = type.constructor.supertypes
|
||||||
|
if (upperBounds.isEmpty()) {
|
||||||
|
upperBounds.addAll(supertypes)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
upperBounds.retainAll(supertypes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return upperBounds
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -447,32 +447,6 @@ public class TypeUtils {
|
|||||||
return new StarProjectionImpl(parameterDescriptor);
|
return new StarProjectionImpl(parameterDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public static KotlinType commonSupertypeForNumberTypes(@NotNull Collection<KotlinType> numberLowerBounds) {
|
|
||||||
if (numberLowerBounds.isEmpty()) return null;
|
|
||||||
Set<KotlinType> intersectionOfSupertypes = getIntersectionOfSupertypes(numberLowerBounds);
|
|
||||||
KotlinType primitiveNumberType = getDefaultPrimitiveNumberType(intersectionOfSupertypes);
|
|
||||||
if (primitiveNumberType != null) {
|
|
||||||
return primitiveNumberType;
|
|
||||||
}
|
|
||||||
return CommonSupertypes.commonSupertype(numberLowerBounds);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private static Set<KotlinType> getIntersectionOfSupertypes(@NotNull Collection<KotlinType> types) {
|
|
||||||
Set<KotlinType> upperBounds = new HashSet<KotlinType>();
|
|
||||||
for (KotlinType type : types) {
|
|
||||||
Collection<KotlinType> supertypes = type.getConstructor().getSupertypes();
|
|
||||||
if (upperBounds.isEmpty()) {
|
|
||||||
upperBounds.addAll(supertypes);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
upperBounds.retainAll(supertypes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return upperBounds;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static KotlinType getDefaultPrimitiveNumberType(@NotNull IntegerValueTypeConstructor numberValueTypeConstructor) {
|
public static KotlinType getDefaultPrimitiveNumberType(@NotNull IntegerValueTypeConstructor numberValueTypeConstructor) {
|
||||||
KotlinType type = getDefaultPrimitiveNumberType(numberValueTypeConstructor.getSupertypes());
|
KotlinType type = getDefaultPrimitiveNumberType(numberValueTypeConstructor.getSupertypes());
|
||||||
@@ -482,7 +456,7 @@ public class TypeUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static KotlinType getDefaultPrimitiveNumberType(@NotNull Collection<KotlinType> supertypes) {
|
public static KotlinType getDefaultPrimitiveNumberType(@NotNull Collection<KotlinType> supertypes) {
|
||||||
if (supertypes.isEmpty()) {
|
if (supertypes.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user