From 95491f223cc05d4954274dee0bb974d446bb5da0 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Mon, 3 Apr 2023 16:34:00 -0700 Subject: [PATCH] FIR: fix subtle isFinal counterpart in ConeTypeContext ^KT-57578 Fixed --- .../kotlin/fir/types/ConeTypeContext.kt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt index e8b238eabc5..831e69e8400 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt @@ -7,10 +7,7 @@ package org.jetbrains.kotlin.fir.types import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.StandardNames -import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.descriptors.ValueClassKind -import org.jetbrains.kotlin.descriptors.valueClassLoweringKind +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType @@ -521,9 +518,14 @@ interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext, Ty override fun TypeConstructorMarker.isFinalClassOrEnumEntryOrAnnotationClassConstructor(): Boolean { val firRegularClass = toFirRegularClass() ?: return false - return firRegularClass.modality == Modality.FINAL || - firRegularClass.classKind == ClassKind.ENUM_ENTRY || - firRegularClass.classKind == ClassKind.ANNOTATION_CLASS + // NB: This API is used to determine if a given type [isMostPreciseCovariantArgument] (at `typeMappingUtil.kt`), + // affecting the upper bound wildcard when mapping the enclosing type to [PsiType]. See KT-57578 for more details. + // The counterpart in K1, [ClassicTypeSystemContext], uses [ClassDescriptor.isFinalClass] in `ModalityUtils.kt`, + // which filters out `enum` class. It seems [ClassDescriptor.isFinalOrEnum] is for truly `final` class. + // That is, the overall API name---isFinalClassOr...---is misleading. + return (firRegularClass.modality == Modality.FINAL && !firRegularClass.classKind.isEnumClass) || + firRegularClass.classKind.isEnumEntry || + firRegularClass.classKind.isAnnotationClass } override fun KotlinTypeMarker.hasAnnotation(fqName: FqName): Boolean {