NI: Prefer nullable lower bound to flexible one when substitution of type variable is performed

^KT-32435 Fixed
This commit is contained in:
Victor Petukhov
2019-12-07 20:24:53 +03:00
committed by victor.petukhov
parent 78dfcef160
commit 09c2b92b1d
14 changed files with 187 additions and 4 deletions
@@ -136,7 +136,7 @@ abstract class AbstractTypeCheckerContextForConstraintSystem : AbstractTypeCheck
*
* => Foo <: T! -- (Foo!! .. Foo) <: T
*
* Foo? <: T! -- (Foo!! .. Foo?) <: T
* Foo? <: T! -- Foo? <: T
*
*
* (Foo..Bar) <: T! --
@@ -163,7 +163,11 @@ abstract class AbstractTypeCheckerContextForConstraintSystem : AbstractTypeCheck
when (subType) {
is SimpleTypeMarker ->
// Foo <: T! -- (Foo!! .. Foo) <: T
createFlexibleType(subType.makeSimpleTypeDefinitelyNotNullOrNotNull(), subType)
if (subType.isNullableType()) {
subType // prefer nullable type to flexible one: `Foo? <: (T..T?)` => lowerConstraint = `Foo?`
} else {
createFlexibleType(subType.makeSimpleTypeDefinitelyNotNullOrNotNull(), subType)
}
is FlexibleTypeMarker ->
// (Foo..Bar) <: T! -- (Foo!! .. Bar) <: T