diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/TypeBoundsImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/TypeBoundsImpl.kt index e9c86a6ee85..8b98681f615 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/TypeBoundsImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/TypeBoundsImpl.kt @@ -114,7 +114,7 @@ public class TypeBoundsImpl( //fun foo(t: T, consumer: Consumer): T //foo(1, c: Consumer) - infer Int, not Any here - val superTypeOfNumberLowerBounds = TypeUtils.commonSupertypeForNumberTypes(numberLowerBounds) + val superTypeOfNumberLowerBounds = commonSupertypeForNumberTypes(numberLowerBounds) if (tryPossibleAnswer(bounds, 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 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 return false @@ -182,4 +182,25 @@ public class TypeBoundsImpl( } return true } -} \ No newline at end of file + + private fun commonSupertypeForNumberTypes(numberLowerBounds: Collection): KotlinType? { + if (numberLowerBounds.isEmpty()) return null + val intersectionOfSupertypes = getIntersectionOfSupertypes(numberLowerBounds) + return TypeUtils.getDefaultPrimitiveNumberType(intersectionOfSupertypes) ?: + CommonSupertypes.commonSupertype(numberLowerBounds) + } + + private fun getIntersectionOfSupertypes(types: Collection): Set { + val upperBounds = HashSet() + for (type in types) { + val supertypes = type.constructor.supertypes + if (upperBounds.isEmpty()) { + upperBounds.addAll(supertypes) + } + else { + upperBounds.retainAll(supertypes) + } + } + return upperBounds + } +} diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.java index 7779d51eb34..08f8f974908 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.java @@ -447,32 +447,6 @@ public class TypeUtils { return new StarProjectionImpl(parameterDescriptor); } - @Nullable - public static KotlinType commonSupertypeForNumberTypes(@NotNull Collection numberLowerBounds) { - if (numberLowerBounds.isEmpty()) return null; - Set intersectionOfSupertypes = getIntersectionOfSupertypes(numberLowerBounds); - KotlinType primitiveNumberType = getDefaultPrimitiveNumberType(intersectionOfSupertypes); - if (primitiveNumberType != null) { - return primitiveNumberType; - } - return CommonSupertypes.commonSupertype(numberLowerBounds); - } - - @NotNull - private static Set getIntersectionOfSupertypes(@NotNull Collection types) { - Set upperBounds = new HashSet(); - for (KotlinType type : types) { - Collection supertypes = type.getConstructor().getSupertypes(); - if (upperBounds.isEmpty()) { - upperBounds.addAll(supertypes); - } - else { - upperBounds.retainAll(supertypes); - } - } - return upperBounds; - } - @NotNull public static KotlinType getDefaultPrimitiveNumberType(@NotNull IntegerValueTypeConstructor numberValueTypeConstructor) { KotlinType type = getDefaultPrimitiveNumberType(numberValueTypeConstructor.getSupertypes()); @@ -482,7 +456,7 @@ public class TypeUtils { } @Nullable - private static KotlinType getDefaultPrimitiveNumberType(@NotNull Collection supertypes) { + public static KotlinType getDefaultPrimitiveNumberType(@NotNull Collection supertypes) { if (supertypes.isEmpty()) { return null; }