diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt index e870a67db16..69b3ebefc3d 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt @@ -8,10 +8,7 @@ package org.jetbrains.kotlin.fir.java.deserialization import com.intellij.openapi.project.Project import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirDeclaration -import org.jetbrains.kotlin.fir.declarations.FirEnumEntry -import org.jetbrains.kotlin.fir.declarations.FirNamedDeclaration -import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl import org.jetbrains.kotlin.fir.declarations.impl.FirMemberFunctionImpl import org.jetbrains.kotlin.fir.declarations.impl.FirMemberPropertyImpl @@ -330,23 +327,7 @@ class KotlinDeserializedJvmSymbolsProvider( } if (kotlinJvmBinaryClass == null) { val outerClassId = classId.outerClassId ?: return null - val outerJvmBinaryClass = kotlinClassFinder.findKotlinClass(outerClassId) ?: return null - if (outerJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null - val (nameResolver, outerClassProto) = outerJvmBinaryClass.readClassDataFrom() ?: return null - if (outerClassProto.enumEntryList.none { nameResolver.getName(it.name) == classId.shortClassName }) { - return null - } - - val symbol = FirClassSymbol(classId) - FirEnumEntryImpl(session, null, symbol, classId.shortClassName).apply { - superTypeRefs += FirResolvedTypeRefImpl( - session, - null, - ConeClassTypeImpl(ConeClassLikeLookupTagImpl(outerClassId), emptyArray(), false), - emptyList() - ) - } - classesCache[classId] = symbol + findAndDeserializeClass(outerClassId) ?: return null } else { if (kotlinJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null val (nameResolver, classProto) = kotlinJvmBinaryClass.readClassDataFrom() ?: return null @@ -357,6 +338,9 @@ class KotlinDeserializedJvmSymbolsProvider( JvmBinaryAnnotationDeserializer(session), parentContext, this::findAndDeserializeClass ) + symbol.fir.declarations.filterIsInstance().forEach { + classesCache[it.symbol.classId] = it.symbol + } classesCache[classId] = symbol val annotations = mutableListOf() kotlinJvmBinaryClass.loadClassAnnotations(object : KotlinJvmBinaryClass.AnnotationVisitor { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt index 374754c344c..4208fdbc961 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -7,8 +7,11 @@ package org.jetbrains.kotlin.fir.deserialization import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl +import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe +import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol +import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.Flags @@ -89,8 +92,19 @@ fun deserializeClassToSymbol( classProto.enumEntryList.mapNotNull { enumEntryProto -> val enumEntryName = nameResolver.getName(enumEntryProto.name) val enumEntryId = classId.createNestedClassId(enumEntryName) - val deserializedClassSymbol = deserializeNestedClass(enumEntryId, context) - deserializedClassSymbol?.fir + + val symbol = FirClassSymbol(enumEntryId) + FirEnumEntryImpl(session, null, symbol, enumEntryId.shortClassName).apply { + superTypeRefs += FirResolvedTypeRefImpl( + session, + null, + ConeClassTypeImpl(ConeClassLikeLookupTagImpl(classId), emptyArray(), false), + emptyList() + ) + } + + + symbol.fir } ) } diff --git a/compiler/fir/resolve/testData/builtIns/kotlin.txt b/compiler/fir/resolve/testData/builtIns/kotlin.txt index f9b3d359751..e62b253c5cb 100644 --- a/compiler/fir/resolve/testData/builtIns/kotlin.txt +++ b/compiler/fir/resolve/testData/builtIns/kotlin.txt @@ -365,13 +365,13 @@ public abstract interface Comparable : R|kotlin/Any| { public final enum class DeprecationLevel : R|kotlin/Enum| { private constructor(): R|kotlin/DeprecationLevel| - public? final enum entry WARNING { + public? final enum entry WARNING : R|kotlin/DeprecationLevel| { } - public? final enum entry ERROR { + public? final enum entry ERROR : R|kotlin/DeprecationLevel| { } - public? final enum entry HIDDEN { + public? final enum entry HIDDEN : R|kotlin/DeprecationLevel| { } } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/EnumArgumentWithCustomToString.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/EnumArgumentWithCustomToString.txt index 137fa380e69..ecec0b40234 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/EnumArgumentWithCustomToString.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/EnumArgumentWithCustomToString.txt @@ -1,9 +1,7 @@ public final enum class E : R|kotlin/Enum| { private constructor(): R|test/E| - public final enum entry CAKE : R|test/E| { - public open fun toString(): R|kotlin/String| - + public? final enum entry CAKE : R|test/E| { } }