[FIR] Serialization to KLIB: Clean-up in firKlibSerialization.kt
This commit is contained in:
committed by
Space Team
parent
5a8330ebad
commit
4b4c5c4e6b
+30
-27
@@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user