FIR deserializer optimization: avoid calling findKotlinClass twice
This commit influences enum entries deserialization. In particular, now we don't deserialize enum entry members, but deserialize its supertype correctly (see test data changes).
This commit is contained in:
committed by
Mikhail Glukhikh
parent
b3c21d6e14
commit
2995e9fcac
+5
-21
@@ -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<FirEnumEntryImpl>().forEach {
|
||||
classesCache[it.symbol.classId] = it.symbol
|
||||
}
|
||||
classesCache[classId] = symbol
|
||||
val annotations = mutableListOf<FirAnnotationCall>()
|
||||
kotlinJvmBinaryClass.loadClassAnnotations(object : KotlinJvmBinaryClass.AnnotationVisitor {
|
||||
|
||||
+16
-2
@@ -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
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
+3
-3
@@ -365,13 +365,13 @@ public abstract interface Comparable<in T> : R|kotlin/Any| {
|
||||
public final enum class DeprecationLevel : R|kotlin/Enum<kotlin/DeprecationLevel>| {
|
||||
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| {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Vendored
+1
-3
@@ -1,9 +1,7 @@
|
||||
public final enum class E : R|kotlin/Enum<test/E>| {
|
||||
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| {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user