[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:
committed by
Space Team
parent
d91efb212d
commit
ee73e4774b
+15
-6
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+16
-10
@@ -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
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user