[LL FIR] StubBasedClassDeserialization: provide psi class there is possible

We can provide psi declaration for nested classes to avoid search
through providers and improve stability

^KTIJ-26670 Fixed
This commit is contained in:
Dmitrii Gridin
2023-08-21 15:25:28 +02:00
committed by Space Team
parent faac4ad229
commit 175ce94bb5
2 changed files with 35 additions and 20 deletions
@@ -185,6 +185,7 @@ internal fun deserializeClassToSymbol(
addDeclaration(constructor) addDeclaration(constructor)
constructor constructor
} }
classOrObject.body?.declarations?.forEach { declaration -> classOrObject.body?.declarations?.forEach { declaration ->
when (declaration) { when (declaration) {
is KtConstructor<*> -> addDeclaration(memberDeserializer.loadConstructor(declaration, classOrObject, this)) is KtConstructor<*> -> addDeclaration(memberDeserializer.loadConstructor(declaration, classOrObject, this))
@@ -192,17 +193,16 @@ internal fun deserializeClassToSymbol(
is KtProperty -> addDeclaration(memberDeserializer.loadProperty(declaration, symbol)) is KtProperty -> addDeclaration(memberDeserializer.loadProperty(declaration, symbol))
is KtEnumEntry -> addDeclaration(memberDeserializer.loadEnumEntry(declaration, symbol, classId)) is KtEnumEntry -> addDeclaration(memberDeserializer.loadEnumEntry(declaration, symbol, classId))
is KtClassOrObject -> { is KtClassOrObject -> {
val name = declaration.name val name = declaration.name ?: errorWithAttachment("Class doesn't have name $declaration") {
?: errorWithAttachment("Class doesn't have name $declaration") { withPsiEntry("class", declaration)
withPsiEntry("class", declaration) }
}
val nestedClassId = val nestedClassId = classId.createNestedClassId(Name.identifier(name))
classId.createNestedClassId(Name.identifier(name)) // Add declaration to the context to avoid redundant provider access to the class map
deserializeNestedClass(nestedClassId, context)?.fir?.let { addDeclaration(it) } deserializeNestedClass(nestedClassId, context.withClassLikeDeclaration(declaration))?.fir?.let(this::addDeclaration)
} }
is KtTypeAlias -> addDeclaration(
memberDeserializer.loadTypeAlias(declaration, FirTypeAliasSymbol(classId)) is KtTypeAlias -> addDeclaration(memberDeserializer.loadTypeAlias(declaration, FirTypeAliasSymbol(classId)))
)
} }
} }
@@ -53,7 +53,7 @@ internal class StubBasedFirDeserializationContext(
private val initialOrigin: FirDeclarationOrigin, private val initialOrigin: FirDeclarationOrigin,
val classLikeDeclaration: KtClassLikeDeclaration? = null val classLikeDeclaration: KtClassLikeDeclaration? = null
) { ) {
val session: FirSession = moduleData.session val session: FirSession get() = moduleData.session
val allTypeParameters: List<FirTypeParameterSymbol> = val allTypeParameters: List<FirTypeParameterSymbol> =
typeDeserializer.ownTypeParameters + outerTypeParameters typeDeserializer.ownTypeParameters + outerTypeParameters
@@ -67,10 +67,10 @@ internal class StubBasedFirDeserializationContext(
capturesTypeParameters: Boolean = true, capturesTypeParameters: Boolean = true,
containingDeclarationSymbol: FirBasedSymbol<*>? = this.outerClassSymbol containingDeclarationSymbol: FirBasedSymbol<*>? = this.outerClassSymbol
): StubBasedFirDeserializationContext = StubBasedFirDeserializationContext( ): StubBasedFirDeserializationContext = StubBasedFirDeserializationContext(
moduleData, moduleData = moduleData,
packageFqName, packageFqName = packageFqName,
relativeClassName, relativeClassName = relativeClassName,
StubBasedFirTypeDeserializer( typeDeserializer = StubBasedFirTypeDeserializer(
moduleData, moduleData,
annotationDeserializer, annotationDeserializer,
typeDeserializer, typeDeserializer,
@@ -78,11 +78,26 @@ internal class StubBasedFirDeserializationContext(
owner, owner,
initialOrigin initialOrigin
), ),
annotationDeserializer, annotationDeserializer = annotationDeserializer,
containerSource, containerSource = containerSource,
outerClassSymbol, outerClassSymbol = outerClassSymbol,
if (capturesTypeParameters) allTypeParameters else emptyList(), outerTypeParameters = if (capturesTypeParameters) allTypeParameters else emptyList(),
initialOrigin initialOrigin = initialOrigin
)
fun withClassLikeDeclaration(
classLikeDeclaration: KtClassLikeDeclaration,
): StubBasedFirDeserializationContext = StubBasedFirDeserializationContext(
moduleData = moduleData,
packageFqName = packageFqName,
relativeClassName = relativeClassName,
typeDeserializer = typeDeserializer,
annotationDeserializer = annotationDeserializer,
containerSource = containerSource,
outerClassSymbol = outerClassSymbol,
outerTypeParameters = outerTypeParameters,
initialOrigin = initialOrigin,
classLikeDeclaration = classLikeDeclaration,
) )
val memberDeserializer: StubBasedFirMemberDeserializer = StubBasedFirMemberDeserializer(this, initialOrigin) val memberDeserializer: StubBasedFirMemberDeserializer = StubBasedFirMemberDeserializer(this, initialOrigin)