[FIR] Serialization to KLIB: Clean-up in firKlibSerialization.kt

This commit is contained in:
Dmitriy Dolovov
2024-02-22 19:30:01 +01:00
committed by Space Team
parent 5a8330ebad
commit 4b4c5c4e6b
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.serialization.SerializableStringTable import org.jetbrains.kotlin.serialization.SerializableStringTable
// TODO: handle incremental/monolothic (see klib serializer) - maybe externally
fun serializeSingleFirFile( fun serializeSingleFirFile(
file: FirFile, session: FirSession, scopeSession: ScopeSession, file: FirFile, session: FirSession, scopeSession: ScopeSession,
actualizedExpectDeclarations: Set<FirDeclaration>?, actualizedExpectDeclarations: Set<FirDeclaration>?,
@@ -25,53 +26,55 @@ fun serializeSingleFirFile(
produceHeaderKlib: Boolean = false, produceHeaderKlib: Boolean = false,
): ProtoBuf.PackageFragment { ): ProtoBuf.PackageFragment {
val approximator = TypeApproximatorForMetadataSerializer(session) val approximator = TypeApproximatorForMetadataSerializer(session)
val packageSerializer = FirElementSerializer.createTopLevel( val packageSerializer = FirElementSerializer.createTopLevel(
session, scopeSession, serializerExtension, session, scopeSession, serializerExtension,
approximator, approximator,
languageVersionSettings, languageVersionSettings,
produceHeaderKlib produceHeaderKlib
) )
val packageProto = packageSerializer.packagePartProto(
// TODO: handle incremental/monolothic (see klib serializer) - maybe externally file.packageFqName,
listOf(file),
val packageProto = packageSerializer.packagePartProto(file.packageFqName, listOf(file), actualizedExpectDeclarations).build() actualizedExpectDeclarations
).build()
val classesProto = mutableListOf<Pair<ProtoBuf.Class, Int>>() val classesProto = mutableListOf<Pair<ProtoBuf.Class, Int>>()
fun List<FirClassSymbol<*>>.makeClassesProtoWithNested() { fun FirClass.makeClassProtoWithNested() {
val classSymbols = this if (!isNotExpectOrShouldBeSerialized(actualizedExpectDeclarations) ||
.filter { !isNotPrivateOrShouldBeSerialized(produceHeaderKlib)
it.fir.isNotExpectOrShouldBeSerialized(actualizedExpectDeclarations) && ) {
it.fir.isNotPrivateOrShouldBeSerialized(produceHeaderKlib) return
} }
for (symbol in classSymbols) {
val klass = symbol.fir
val classSerializer = FirElementSerializer.create(
session, scopeSession, klass, serializerExtension, null,
approximator, languageVersionSettings, produceHeaderKlib
)
val index = classSerializer.stringTable.getFqNameIndex(klass)
classesProto += classSerializer.classProto(klass).build() to index val classSerializer = FirElementSerializer.create(
classSerializer.computeNestedClassifiersForClass(symbol).filterIsInstance<FirClassSymbol<*>>().makeClassesProtoWithNested() session, scopeSession, klass = this, serializerExtension, parentSerializer = null,
approximator, languageVersionSettings, produceHeaderKlib
)
val index = classSerializer.stringTable.getFqNameIndex(this)
classesProto += classSerializer.classProto(this).build() to index
for (nestedClassifierSymbol in classSerializer.computeNestedClassifiersForClass(symbol)) {
(nestedClassifierSymbol as? FirClassSymbol<*>)?.fir?.makeClassProtoWithNested()
} }
} }
serializerExtension.processFile(file) { serializerExtension.processFile(file) {
file.declarations.mapNotNull { it.symbol as? FirClassSymbol<*> }.makeClassesProtoWithNested() for (declaration in file.declarations) {
} (declaration as? FirClass)?.makeClassProtoWithNested()
}
val hasTopLevelDeclarations = file.declarations.any {
it is FirMemberDeclaration && it.isNotExpectOrShouldBeSerialized(actualizedExpectDeclarations) &&
it.isNotPrivateOrShouldBeSerialized(produceHeaderKlib) &&
(it is FirProperty || it is FirSimpleFunction || it is FirTypeAlias)
} }
return buildKlibPackageFragment( return buildKlibPackageFragment(
packageProto, packageProto,
classesProto, classesProto,
file.packageFqName, file.packageFqName,
hasTopLevelDeclarations && classesProto.isEmpty(), isEmpty = packageProto.functionList.isEmpty() &&
packageProto.propertyList.isEmpty() &&
packageProto.typeAliasList.isEmpty() &&
classesProto.isEmpty(),
serializerExtension.stringTable as SerializableStringTable serializerExtension.stringTable as SerializableStringTable
) )
} }