diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt index b86625f2fba..09b8d6624f2 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt @@ -135,7 +135,9 @@ internal class KtFirTypeProvider( return when (this) { // We also need to collect those on `upperBound` due to nullability. 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 ConeClassErrorType -> emptySequence() is ConeLookupTagBasedType -> getSubstitutedSuperTypes(shouldApproximate) diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt index 2e3208ccb54..3fe2e36bea3 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt @@ -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 get() = original.typeArguments diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt index 1796015c7b7..1d5220db27f 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt @@ -324,7 +324,7 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext, ConeTypeCo override fun DefinitelyNotNullTypeMarker.original(): SimpleTypeMarker { require(this is ConeDefinitelyNotNullType) - return this.original as SimpleTypeMarker + return this.original } override fun typeSubstitutorByTypeConstructor(map: Map): ConeSubstitutor { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt index 2798497a9c2..48d3a3d1cd6 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator import org.jetbrains.kotlin.types.* 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.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( original: ConeKotlinType, typeContext: ConeTypeContext ): ConeDefinitelyNotNullType? { - return when { - original is ConeDefinitelyNotNullType -> original - typeContext.makesSenseToBeDefinitelyNotNull(original) -> ConeDefinitelyNotNullType(original.coneLowerBoundIfFlexible()) - else -> null + return when (original) { + is ConeDefinitelyNotNullType -> original + is ConeFlexibleType -> create(original.lowerBound, typeContext) + is ConeSimpleKotlinType -> runIf(typeContext.makesSenseToBeDefinitelyNotNull(original)) { + ConeDefinitelyNotNullType(original.coneLowerBoundIfFlexible()) + } } }