From 7d4ad9d9f9b895cdf0310c1c7614402ab87d449a Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 5 Mar 2024 00:33:39 +0100 Subject: [PATCH] JVM IR: slightly optimize IrType.asJvmFlexibleType #KT-66281 --- .../backend/jvm/ir/IrJvmFlexibleType.kt | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrJvmFlexibleType.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrJvmFlexibleType.kt index 1891c60702f..c0b03578e8a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrJvmFlexibleType.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrJvmFlexibleType.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.backend.jvm.ir import org.jetbrains.kotlin.backend.jvm.JvmSymbols -import org.jetbrains.kotlin.backend.jvm.JvmSymbols.Companion.FLEXIBLE_VARIANCE_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.declarations.IrClass @@ -14,10 +13,8 @@ import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.impl.IrStarProjectionImpl import org.jetbrains.kotlin.ir.types.impl.buildSimpleType import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection -import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable -import org.jetbrains.kotlin.ir.util.hasAnnotation -import org.jetbrains.kotlin.ir.util.render -import org.jetbrains.kotlin.name.StandardClassIds +import org.jetbrains.kotlin.ir.types.impl.toBuilder +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.types.FlexibleTypeBoundsChecker import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.model.FlexibleTypeMarker @@ -112,25 +109,28 @@ fun IrType.isWithFlexibleNullability(): Boolean = internal fun IrType.isWithFlexibleMutability(): Boolean = hasAnnotation(JvmSymbols.FLEXIBLE_MUTABILITY_ANNOTATION_FQ_NAME) -private fun IrType.isWithFlexibleVariance(): Boolean = - hasAnnotation(StandardClassIds.Annotations.FlexibleArrayElementVariance) - internal fun IrType.asJvmFlexibleType(builtIns: IrBuiltIns): FlexibleTypeMarker? { if (this !is IrSimpleType || annotations.isEmpty()) return null - val nullability = isWithFlexibleNullability() - val mutability = isWithFlexibleMutability() - val flexibleVariance = isWithFlexibleVariance() - val raw = isRawType() + var nullability = false + var mutability = false + var flexibleVariance = false + var raw = false + + val filteredAnnotations = annotations.filter { + val annotationClass = it.symbol.owner.parentAsClass + when { + annotationClass.hasEqualFqName(JvmSymbols.FLEXIBLE_NULLABILITY_ANNOTATION_FQ_NAME) -> nullability = true + annotationClass.hasEqualFqName(JvmSymbols.FLEXIBLE_MUTABILITY_ANNOTATION_FQ_NAME) -> mutability = true + annotationClass.hasEqualFqName(JvmSymbols.FLEXIBLE_VARIANCE_ANNOTATION_FQ_NAME) -> flexibleVariance = true + annotationClass.hasEqualFqName(JvmSymbols.RAW_TYPE_ANNOTATION_FQ_NAME) -> raw = true + else -> return@filter true + } + false + } + if (!nullability && !mutability && !flexibleVariance && !raw) return null - val baseType = this.removeAnnotations { irCtorCall -> - val fqName = irCtorCall.type.classFqName - fqName == JvmSymbols.FLEXIBLE_NULLABILITY_ANNOTATION_FQ_NAME || - fqName == JvmSymbols.FLEXIBLE_MUTABILITY_ANNOTATION_FQ_NAME || - fqName == FLEXIBLE_VARIANCE_ANNOTATION_FQ_NAME || - fqName == JvmSymbols.RAW_TYPE_ANNOTATION_FQ_NAME - } as IrSimpleType - + val baseType = toBuilder().apply { annotations = filteredAnnotations }.buildSimpleType() return IrJvmFlexibleTypeImpl(baseType, builtIns, nullability, mutability, flexibleVariance, raw) }