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 com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
import org.jetbrains.kotlin.descriptors.SourceElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
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.impl.FirEnumEntryImpl
|
import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirMemberFunctionImpl
|
import org.jetbrains.kotlin.fir.declarations.impl.FirMemberFunctionImpl
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirMemberPropertyImpl
|
import org.jetbrains.kotlin.fir.declarations.impl.FirMemberPropertyImpl
|
||||||
@@ -330,23 +327,7 @@ class KotlinDeserializedJvmSymbolsProvider(
|
|||||||
}
|
}
|
||||||
if (kotlinJvmBinaryClass == null) {
|
if (kotlinJvmBinaryClass == null) {
|
||||||
val outerClassId = classId.outerClassId ?: return null
|
val outerClassId = classId.outerClassId ?: return null
|
||||||
val outerJvmBinaryClass = kotlinClassFinder.findKotlinClass(outerClassId) ?: return null
|
findAndDeserializeClass(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
|
|
||||||
} else {
|
} else {
|
||||||
if (kotlinJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null
|
if (kotlinJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null
|
||||||
val (nameResolver, classProto) = kotlinJvmBinaryClass.readClassDataFrom() ?: return null
|
val (nameResolver, classProto) = kotlinJvmBinaryClass.readClassDataFrom() ?: return null
|
||||||
@@ -357,6 +338,9 @@ class KotlinDeserializedJvmSymbolsProvider(
|
|||||||
JvmBinaryAnnotationDeserializer(session),
|
JvmBinaryAnnotationDeserializer(session),
|
||||||
parentContext, this::findAndDeserializeClass
|
parentContext, this::findAndDeserializeClass
|
||||||
)
|
)
|
||||||
|
symbol.fir.declarations.filterIsInstance<FirEnumEntryImpl>().forEach {
|
||||||
|
classesCache[it.symbol.classId] = it.symbol
|
||||||
|
}
|
||||||
classesCache[classId] = symbol
|
classesCache[classId] = symbol
|
||||||
val annotations = mutableListOf<FirAnnotationCall>()
|
val annotations = mutableListOf<FirAnnotationCall>()
|
||||||
kotlinJvmBinaryClass.loadClassAnnotations(object : KotlinJvmBinaryClass.AnnotationVisitor {
|
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.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl
|
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.resolve.transformers.firUnsafe
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
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.fir.types.impl.FirResolvedTypeRefImpl
|
||||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||||
import org.jetbrains.kotlin.metadata.deserialization.Flags
|
import org.jetbrains.kotlin.metadata.deserialization.Flags
|
||||||
@@ -89,8 +92,19 @@ fun deserializeClassToSymbol(
|
|||||||
classProto.enumEntryList.mapNotNull { enumEntryProto ->
|
classProto.enumEntryList.mapNotNull { enumEntryProto ->
|
||||||
val enumEntryName = nameResolver.getName(enumEntryProto.name)
|
val enumEntryName = nameResolver.getName(enumEntryProto.name)
|
||||||
val enumEntryId = classId.createNestedClassId(enumEntryName)
|
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>| {
|
public final enum class DeprecationLevel : R|kotlin/Enum<kotlin/DeprecationLevel>| {
|
||||||
private constructor(): R|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>| {
|
public final enum class E : R|kotlin/Enum<test/E>| {
|
||||||
private constructor(): R|test/E|
|
private constructor(): R|test/E|
|
||||||
|
|
||||||
public final enum entry CAKE : R|test/E| {
|
public? final enum entry CAKE : R|test/E| {
|
||||||
public open fun toString(): R|kotlin/String|
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user