From 97adb016003689bb0e24a739802efadb7c01deba Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Wed, 7 Jun 2023 12:06:30 +0300 Subject: [PATCH] [FIR Native] Don't add Cloneable supertype when it's not present ^KT-58549 Fixed --- .../deserialization/StubBasedClassDeserialization.kt | 2 +- .../kotlin/fir/deserialization/ClassDeserialization.kt | 8 +++++--- compiler/testData/codegen/box/arrays/arrayInstanceOf.kt | 2 -- compiler/testData/codegen/box/arrays/kt7288.kt | 2 -- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt index 37708995b54..41bb4f5ed73 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt @@ -211,7 +211,7 @@ internal fun deserializeClassToSymbol( ) } - addCloneForArrayIfNeeded(classId, context.dispatchReceiver) + addCloneForArrayIfNeeded(classId, context.dispatchReceiver, session) session.deserializedClassConfigurator?.run { configure(classId) } diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt index f55f03f8cca..797afd2492e 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -13,12 +13,13 @@ import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.* -import org.jetbrains.kotlin.fir.declarations.comparators.FirMemberDeclarationComparator import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.utils.addDeclarations import org.jetbrains.kotlin.fir.declarations.utils.isCompanion import org.jetbrains.kotlin.fir.declarations.utils.moduleName import org.jetbrains.kotlin.fir.declarations.utils.sourceElement +import org.jetbrains.kotlin.fir.resolve.providers.getRegularClassSymbolByClassId +import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol @@ -199,7 +200,7 @@ fun deserializeClassToSymbol( generateEntriesGetter(moduleData, classId.packageFqName, classId.relativeClassName) } - addCloneForArrayIfNeeded(classId, context.dispatchReceiver) + addCloneForArrayIfNeeded(classId, context.dispatchReceiver, session) session.deserializedClassConfigurator?.run { configure(classId) } @@ -270,9 +271,10 @@ private fun FirRegularClassBuilder.addSerializableIfNeeded(classId: ClassId) { } } -fun FirRegularClassBuilder.addCloneForArrayIfNeeded(classId: ClassId, dispatchReceiver: ConeClassLikeType?) { +fun FirRegularClassBuilder.addCloneForArrayIfNeeded(classId: ClassId, dispatchReceiver: ConeClassLikeType?, session: FirSession) { if (classId.packageFqName != StandardClassIds.BASE_KOTLIN_PACKAGE) return if (classId.shortClassName !in ARRAY_CLASSES) return + if (session.symbolProvider.getRegularClassSymbolByClassId(StandardClassIds.Cloneable) == null) return superTypeRefs += buildResolvedTypeRef { type = ConeClassLikeTypeImpl( StandardClassIds.Cloneable.toLookupTag(), diff --git a/compiler/testData/codegen/box/arrays/arrayInstanceOf.kt b/compiler/testData/codegen/box/arrays/arrayInstanceOf.kt index 4c167fdbb48..b46bcc42e03 100644 --- a/compiler/testData/codegen/box/arrays/arrayInstanceOf.kt +++ b/compiler/testData/codegen/box/arrays/arrayInstanceOf.kt @@ -1,6 +1,4 @@ -// IGNORE_BACKEND_K2: JS_IR // KT-58549 -// IGNORE_BACKEND_K2: NATIVE //test [], get and iterator calls fun test(createIntNotLong: Boolean): String { diff --git a/compiler/testData/codegen/box/arrays/kt7288.kt b/compiler/testData/codegen/box/arrays/kt7288.kt index 7a97ad4e700..02010f10443 100644 --- a/compiler/testData/codegen/box/arrays/kt7288.kt +++ b/compiler/testData/codegen/box/arrays/kt7288.kt @@ -1,6 +1,4 @@ -// IGNORE_BACKEND_K2: JS_IR // KT-58549 -// IGNORE_BACKEND_K2: NATIVE fun test(b: Boolean): String { val a = if (b) IntArray(5) else LongArray(5)