FIR: make ConeSimpleKotlinType the only original for definitely not-null

This commit is contained in:
Mikhail Glukhikh
2021-12-13 18:24:45 +03:00
committed by TeamCityServer
parent 434213f416
commit 81ff9b820a
4 changed files with 12 additions and 8 deletions
@@ -135,7 +135,9 @@ internal class KtFirTypeProvider(
return when (this) { return when (this) {
// We also need to collect those on `upperBound` due to nullability. // We also need to collect those on `upperBound` due to nullability.
is ConeFlexibleType -> lowerBound.getDirectSuperTypes(shouldApproximate) + upperBound.getDirectSuperTypes(shouldApproximate) is ConeFlexibleType -> lowerBound.getDirectSuperTypes(shouldApproximate) + upperBound.getDirectSuperTypes(shouldApproximate)
is ConeDefinitelyNotNullType -> original.getDirectSuperTypes(shouldApproximate).map { ConeDefinitelyNotNullType(it) } is ConeDefinitelyNotNullType -> original.getDirectSuperTypes(shouldApproximate).map {
ConeDefinitelyNotNullType.create(it, analysisSession.rootModuleSession.typeContext) ?: it
}
is ConeIntersectionType -> intersectedTypes.asSequence().flatMap { it.getDirectSuperTypes(shouldApproximate) } is ConeIntersectionType -> intersectedTypes.asSequence().flatMap { it.getDirectSuperTypes(shouldApproximate) }
is ConeClassErrorType -> emptySequence() is ConeClassErrorType -> emptySequence()
is ConeLookupTagBasedType -> getSubstitutedSuperTypes(shouldApproximate) is ConeLookupTagBasedType -> getSubstitutedSuperTypes(shouldApproximate)
@@ -256,7 +256,7 @@ class ConeTypeVariableType(
} }
data class ConeDefinitelyNotNullType(val original: ConeKotlinType) : ConeSimpleKotlinType(), DefinitelyNotNullTypeMarker { data class ConeDefinitelyNotNullType(val original: ConeSimpleKotlinType) : ConeSimpleKotlinType(), DefinitelyNotNullTypeMarker {
override val typeArguments: Array<out ConeTypeProjection> override val typeArguments: Array<out ConeTypeProjection>
get() = original.typeArguments get() = original.typeArguments
@@ -324,7 +324,7 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext, ConeTypeCo
override fun DefinitelyNotNullTypeMarker.original(): SimpleTypeMarker { override fun DefinitelyNotNullTypeMarker.original(): SimpleTypeMarker {
require(this is ConeDefinitelyNotNullType) require(this is ConeDefinitelyNotNullType)
return this.original as SimpleTypeMarker return this.original
} }
override fun typeSubstitutorByTypeConstructor(map: Map<TypeConstructorMarker, KotlinTypeMarker>): ConeSubstitutor { override fun typeSubstitutorByTypeConstructor(map: Map<TypeConstructorMarker, KotlinTypeMarker>): ConeSubstitutor {
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator
import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.model.* import org.jetbrains.kotlin.types.model.*
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.jetbrains.kotlin.fir.types.lowerBoundIfFlexible as coneLowerBoundIfFlexible import org.jetbrains.kotlin.fir.types.lowerBoundIfFlexible as coneLowerBoundIfFlexible
import org.jetbrains.kotlin.fir.types.upperBoundIfFlexible as coneUpperBoundIfFlexible import org.jetbrains.kotlin.fir.types.upperBoundIfFlexible as coneUpperBoundIfFlexible
@@ -68,15 +69,16 @@ private fun ConeTypeContext.makesSenseToBeDefinitelyNotNull(originalType: ConeKo
} }
} }
// TODO: leave only one of `create` and `makeConeTypeDefinitelyNotNullOrNotNull`
fun ConeDefinitelyNotNullType.Companion.create( fun ConeDefinitelyNotNullType.Companion.create(
original: ConeKotlinType, original: ConeKotlinType,
typeContext: ConeTypeContext typeContext: ConeTypeContext
): ConeDefinitelyNotNullType? { ): ConeDefinitelyNotNullType? {
return when { return when (original) {
original is ConeDefinitelyNotNullType -> original is ConeDefinitelyNotNullType -> original
typeContext.makesSenseToBeDefinitelyNotNull(original) -> ConeDefinitelyNotNullType(original.coneLowerBoundIfFlexible()) is ConeFlexibleType -> create(original.lowerBound, typeContext)
else -> null is ConeSimpleKotlinType -> runIf(typeContext.makesSenseToBeDefinitelyNotNull(original)) {
ConeDefinitelyNotNullType(original.coneLowerBoundIfFlexible())
}
} }
} }