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:
Simon Ogorodnik
2019-06-14 19:49:54 +03:00
committed by Mikhail Glukhikh
parent b3c21d6e14
commit 2995e9fcac
4 changed files with 25 additions and 29 deletions
@@ -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 {
@@ -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
View File
@@ -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| {
} }
} }
@@ -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|
} }
} }