[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:
committed by
Space Team
parent
faac4ad229
commit
175ce94bb5
+10
-10
@@ -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)))
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+25
-10
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user