[K2, MPP] Remove redundant expect declarations from klib metadata

^KT-57250 Fixed

Introduce flat Fir2IrActualizedResult

It contains output from Fir2Ir and IrActualizer
This commit is contained in:
Ivan Kochurkin
2023-03-15 18:41:52 +01:00
committed by Space Team
parent d91efb212d
commit ee73e4774b
42 changed files with 324 additions and 111 deletions
@@ -69,15 +69,24 @@ class FirElementSerializer private constructor(
private val contractSerializer = FirContractSerializer()
private val extensionDeclarationProviders = session.extensionService.declarationForMetadataProviders
fun packagePartProto(packageFqName: FqName, files: List<FirFile>): ProtoBuf.Package.Builder {
fun packagePartProto(
packageFqName: FqName,
files: List<FirFile>,
actualizedExpectDeclarations: Set<FirDeclaration>?
): ProtoBuf.Package.Builder {
val builder = ProtoBuf.Package.newBuilder()
fun addDeclaration(declaration: FirDeclaration, onUnsupportedDeclaration: (FirDeclaration) -> Unit) {
when (declaration) {
is FirProperty -> propertyProto(declaration)?.let { builder.addProperty(it) }
is FirSimpleFunction -> functionProto(declaration)?.let { builder.addFunction(it) }
is FirTypeAlias -> typeAliasProto(declaration)?.let { builder.addTypeAlias(it) }
else -> onUnsupportedDeclaration(declaration)
if (declaration is FirMemberDeclaration) {
if (!declaration.shouldBeSerialized(actualizedExpectDeclarations)) return
when (declaration) {
is FirProperty -> propertyProto(declaration)?.let { builder.addProperty(it) }
is FirSimpleFunction -> functionProto(declaration)?.let { builder.addFunction(it) }
is FirTypeAlias -> typeAliasProto(declaration)?.let { builder.addTypeAlias(it) }
else -> onUnsupportedDeclaration(declaration)
}
} else {
onUnsupportedDeclaration(declaration)
}
}
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.serialization.SerializableStringTable
fun serializeSingleFirFile(
file: FirFile, session: FirSession, scopeSession: ScopeSession,
actualizedExpectDeclarations: Set<FirDeclaration>?,
serializerExtension: FirKLibSerializerExtension,
languageVersionSettings: LanguageVersionSettings,
): ProtoBuf.PackageFragment {
@@ -31,21 +32,26 @@ fun serializeSingleFirFile(
// TODO: split package fragment (see klib serializer)
// TODO: handle incremental/monolothic (see klib serializer) - maybe externally
val packageProto = packageSerializer.packagePartProto(file.packageFqName, listOf(file)).build()
val packageProto = packageSerializer.packagePartProto(file.packageFqName, listOf(file), actualizedExpectDeclarations).build()
fun List<FirDeclaration>.makeClassesProtoWithNested(): List<Pair<ProtoBuf.Class, Int>> =
// TODO: filter out expects
filterIsInstance<FirClass>().sortedBy { it.classId.asFqNameString() }.flatMap {
val classSerializer = FirElementSerializer.create(session, scopeSession, it, serializerExtension, null,
approximator, languageVersionSettings)
val index = classSerializer.stringTable.getFqNameIndex(it)
listOf(classSerializer.classProto(it).build() to index) + it.declarations.makeClassesProtoWithNested()
}
fun List<FirDeclaration>.makeClassesProtoWithNested(): List<Pair<ProtoBuf.Class, Int>> {
return filterIsInstance<FirClass>().filter { it.shouldBeSerialized(actualizedExpectDeclarations) }
.sortedBy { it.classId.asFqNameString() }
.flatMap {
val classSerializer = FirElementSerializer.create(
session, scopeSession, it, serializerExtension, null,
approximator, languageVersionSettings
)
val index = classSerializer.stringTable.getFqNameIndex(it)
listOf(classSerializer.classProto(it).build() to index) + it.declarations.makeClassesProtoWithNested()
}
}
val classesProto = file.declarations.makeClassesProtoWithNested()
val hasTopLevelDeclarations = file.declarations.any {
it is FirProperty || it is FirSimpleFunction || it is FirTypeAlias
it is FirMemberDeclaration && it.shouldBeSerialized(actualizedExpectDeclarations) &&
(it is FirProperty || it is FirSimpleFunction || it is FirTypeAlias)
}
return buildKlibPackageFragment(
@@ -7,6 +7,9 @@ package org.jetbrains.kotlin.fir.serialization
import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.utils.isExpect
import org.jetbrains.kotlin.fir.diagnostics.ConeIntermediateDiagnostic
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
@@ -43,3 +46,7 @@ fun ConeKotlinType.suspendFunctionTypeToFunctionTypeWithContinuation(session: Fi
attributes = fullyExpandedType.attributes
)
}
fun FirMemberDeclaration.shouldBeSerialized(actualizedExpectDeclaration: Set<FirDeclaration>?): Boolean {
return !isExpect || actualizedExpectDeclaration == null || this !in actualizedExpectDeclaration
}