FIR: Fix inference case with flexible captured types

Previsously, errors have been ignored because we ignored errors raised
from the completion phase

See the comment above the createConstraintPartForLowerBoundAndFlexibleTypeVariable
This commit is contained in:
Denis.Zharkov
2021-04-23 18:18:05 +03:00
committed by teamcityserver
parent c758069d7c
commit faa5e46396
4 changed files with 22 additions and 6 deletions
@@ -492,4 +492,7 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext, ConeTypeCo
} }
return intersectionType.withAlternative(secondCandidate) return intersectionType.withAlternative(secondCandidate)
} }
override fun SimpleTypeMarker.createConstraintPartForLowerBoundAndFlexibleTypeVariable(): KotlinTypeMarker =
createFlexibleType(this.makeSimpleTypeDefinitelyNotNullOrNotNull(), this.withNullability(true))
} }
@@ -237,11 +237,7 @@ abstract class AbstractTypeCheckerContextForConstraintSystem(override val typeSy
when (subType) { when (subType) {
is SimpleTypeMarker -> is SimpleTypeMarker ->
// Foo <: T! -- (Foo!! .. Foo) <: T // Foo <: T! -- (Foo!! .. Foo) <: T
if (subType.isMarkedNullable()) { subType.createConstraintPartForLowerBoundAndFlexibleTypeVariable()
subType // prefer nullable type to flexible one: `Foo? <: (T..T?)` => lowerConstraint = `Foo?`
} else {
createFlexibleType(subType, subType.withNullability(true))
}
is FlexibleTypeMarker -> is FlexibleTypeMarker ->
// (Foo..Bar) <: T! -- (Foo!! .. Bar) <: T // (Foo..Bar) <: T! -- (Foo!! .. Bar) <: T
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.types.model
import org.jetbrains.kotlin.types.AbstractTypeCheckerContext import org.jetbrains.kotlin.types.AbstractTypeCheckerContext
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
import kotlin.collections.ArrayList
import kotlin.contracts.ExperimentalContracts import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract import kotlin.contracts.contract
@@ -238,6 +237,17 @@ interface TypeSystemInferenceExtensionContext : TypeSystemContext, TypeSystemBui
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
fun KotlinTypeMarker.extractTypeVariables() = buildSet { extractTypeVariables(this) } fun KotlinTypeMarker.extractTypeVariables() = buildSet { extractTypeVariables(this) }
/**
* For case Foo <: (T..T?) return LowerBound for new constraint LowerBound <: T
* In FE 1.0, in case nullable it was just Foo?, so constraint was Foo? <: T
* But it's not 100% correct because prevent having not-nullable upper constraint on T while initial (Foo? <: (T..T?)) is not violated
*
* In FIR, we try to have a correct one: (Foo!!..Foo?) <: T
*
* In future once we have only FIR (or FE 1.0 behavior is fixed) this method should be inlined to the use-site
*/
fun SimpleTypeMarker.createConstraintPartForLowerBoundAndFlexibleTypeVariable(): KotlinTypeMarker
} }
@@ -741,6 +741,13 @@ interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext, TypeSy
override fun getKFunctionTypeConstructor(parametersNumber: Int, isSuspend: Boolean): TypeConstructorMarker { override fun getKFunctionTypeConstructor(parametersNumber: Int, isSuspend: Boolean): TypeConstructorMarker {
return getKFunctionDescriptor(builtIns, parametersNumber, isSuspend).typeConstructor return getKFunctionDescriptor(builtIns, parametersNumber, isSuspend).typeConstructor
} }
override fun SimpleTypeMarker.createConstraintPartForLowerBoundAndFlexibleTypeVariable(): KotlinTypeMarker =
if (this.isMarkedNullable()) {
this
} else {
createFlexibleType(this, this.withNullability(true))
}
} }
fun TypeVariance.convertVariance(): Variance { fun TypeVariance.convertVariance(): Variance {