From 27d4c745cba1d8983bd8d10f003df1e95fc5bce1 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 3 Feb 2022 15:52:35 +0300 Subject: [PATCH] ConeSimpleKotlinType: introduce & use unwrapDefinitelyNotNull --- .../checkers/declaration/FirCyclicTypeBoundsChecker.kt | 4 ++-- .../checkers/declaration/FirTopLevelTypeAliasChecker.kt | 8 +++++--- .../cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt | 7 +++++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirCyclicTypeBoundsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirCyclicTypeBoundsChecker.kt index 3fdbc0f38f5..7b65e89339f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirCyclicTypeBoundsChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirCyclicTypeBoundsChecker.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeCyclicTypeBound import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.utils.addToStdlib.safeAs object FirCyclicTypeBoundsChecker : FirBasicDeclarationChecker() { @@ -77,5 +76,6 @@ object FirCyclicTypeBoundsChecker : FirBasicDeclarationChecker() { private fun extractTypeParamNames(ref: FirTypeRef): Set = ref.unwrapBound().mapNotNull { extractTypeParamName(it.coneType) }.toSet() - private fun extractTypeParamName(type: ConeKotlinType): Name? = type.safeAs()?.lookupTag?.name + private fun extractTypeParamName(type: ConeKotlinType): Name? = + (type.lowerBoundIfFlexible().unwrapDefinitelyNotNull() as? ConeTypeParameterType)?.lookupTag?.name } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelTypeAliasChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelTypeAliasChecker.kt index b5de3824532..b81bc9f8bf0 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelTypeAliasChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelTypeAliasChecker.kt @@ -24,12 +24,14 @@ object FirTopLevelTypeAliasChecker : FirTypeAliasChecker() { } fun containsTypeParameter(type: ConeKotlinType): Boolean { - if (type is ConeTypeParameterType) { + val unwrapped = type.lowerBoundIfFlexible().unwrapDefinitelyNotNull() + + if (unwrapped is ConeTypeParameterType) { return true } - if (type is ConeClassLikeType && type.lookupTag.toSymbol(context.session) is FirTypeAliasSymbol) { - for (typeArgument in type.typeArguments) { + if (unwrapped is ConeClassLikeType && unwrapped.lookupTag.toSymbol(context.session) is FirTypeAliasSymbol) { + for (typeArgument in unwrapped.typeArguments) { val typeArgumentType = (typeArgument as? ConeKotlinType) ?: (typeArgument as? ConeKotlinTypeProjection)?.type if (typeArgumentType != null && containsTypeParameter(typeArgumentType)) { return true 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 3fe2e36bea3..cac6c2dae19 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 @@ -175,6 +175,13 @@ fun ConeKotlinType.lowerBoundIfFlexible(): ConeSimpleKotlinType { } } +fun ConeSimpleKotlinType.unwrapDefinitelyNotNull(): ConeSimpleKotlinType { + return when (this) { + is ConeDefinitelyNotNullType -> original + else -> this + } +} + class ConeCapturedTypeConstructor( val projection: ConeTypeProjection, var supertypes: List? = null,