diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeAttributes.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeAttributes.kt index 411b2b88eb7..c8a0341d8d1 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeAttributes.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeAttributes.kt @@ -34,7 +34,7 @@ class ConeAttributes private constructor(attributes: List>) : A } val Empty: ConeAttributes = ConeAttributes(emptyList()) - val WithFlexibleNullability: ConeAttributes = ConeAttributes(listOf(CompilerConeAttributes.FlexibleNullability)) + internal val WithFlexibleNullability: ConeAttributes = ConeAttributes(listOf(CompilerConeAttributes.FlexibleNullability)) fun create(attributes: List>): ConeAttributes { return if (attributes.isEmpty()) { @@ -68,13 +68,6 @@ class ConeAttributes private constructor(attributes: List>) : A return perform(other) { this.intersect(it) } } - fun intersectUnless(other: ConeAttributes, predicate: (ConeAttributes) -> Boolean): ConeAttributes { - return if (predicate.invoke(this)) - this - else - perform(other) { this.intersect(it) } - } - override fun iterator(): Iterator> { return arrayMap.iterator() } @@ -101,3 +94,12 @@ class ConeAttributes private constructor(attributes: List>) : A return arrayMap.isEmpty() } } + +private fun ConeAttributes.intersectUnless(other: ConeAttributes, predicate: (ConeAttributes) -> Boolean): ConeAttributes = + if (predicate.invoke(this)) this else intersect(other) + +fun ConeAttributes.withFlexible(): ConeAttributes = + intersect(ConeAttributes.WithFlexibleNullability) + +fun ConeAttributes.withFlexibleUnless(predicate: (ConeAttributes) -> Boolean): ConeAttributes = + intersectUnless(ConeAttributes.WithFlexibleNullability, predicate) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt index 6e570a862a4..fca29119535 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt @@ -200,7 +200,7 @@ private fun ClassId.toConeFlexibleType( toConeKotlinType( typeArguments, isNullable = false, - attributes.intersectUnless(ConeAttributes.WithFlexibleNullability) { it.hasEnhancedNullability } + attributes.withFlexibleUnless { it.hasEnhancedNullability } ), toConeKotlinType(typeArgumentsForUpper, isNullable = true, attributes) ) @@ -242,7 +242,7 @@ private fun JavaClassifierType.toConeKotlinTypeWithoutEnhancement( else ConeFlexibleType( lowerBound.withAttributes( - lowerBound.attributes.intersectUnless(ConeAttributes.WithFlexibleNullability) { it.hasEnhancedNullability } + lowerBound.attributes.withFlexibleUnless { it.hasEnhancedNullability } ), upperBound ) @@ -316,7 +316,7 @@ private fun getErasedVersionOfFirstUpperBound( // Avoid exponential complexity ConeFlexibleType( lowerBound.withAttributes( - lowerBound.attributes.intersectUnless(ConeAttributes.WithFlexibleNullability) { it.hasEnhancedNullability } + lowerBound.attributes.withFlexibleUnless { it.hasEnhancedNullability } ), lowerBound.withNullability(ConeNullability.NULLABLE) ) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt index d95d1533e57..c744a6f7dc7 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt @@ -92,7 +92,7 @@ private fun ConeKotlinType.enhanceConeKotlinType( val lowerResult = lowerBound.enhanceInflexibleType( session, TypeComponentPosition.FLEXIBLE_LOWER, qualifiers, index, attributes = if (needsFlexibleNullabilityAttribute) - lowerBound.attributes.intersect(ConeAttributes.WithFlexibleNullability) + lowerBound.attributes.withFlexible() else lowerBound.attributes ) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassMembersEnhancementScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassMembersEnhancementScope.kt index 87ebbfc6d89..f66b0687f45 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassMembersEnhancementScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassMembersEnhancementScope.kt @@ -106,7 +106,7 @@ class JavaClassMembersEnhancementScope( if (valueParameter.returnTypeRef.coneType is ConeFlexibleType) { ConeFlexibleType( type.withAttributes( - type.attributes.intersectUnless(ConeAttributes.WithFlexibleNullability) { + type.attributes.withFlexibleUnless { it.hasEnhancedNullability } ),