[FIR] Allow FirElementSerializer.packagePartProto accept multiple files

This is needed for cases when there are multiple files with same name
 and `@JvmMultifileClass` annotation
This commit is contained in:
Dmitriy Novozhilov
2022-09-14 17:44:06 +03:00
committed by Space Team
parent 22ab43838b
commit bc93556dbb
6 changed files with 18 additions and 17 deletions
@@ -67,15 +67,17 @@ class FirElementSerializer private constructor(
) {
private val contractSerializer = FirContractSerializer()
fun packagePartProto(packageFqName: FqName, file: FirFile): ProtoBuf.Package.Builder {
fun packagePartProto(packageFqName: FqName, files: List<FirFile>): ProtoBuf.Package.Builder {
val builder = ProtoBuf.Package.newBuilder()
for (declaration in file.declarations) {
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 -> {}
for (file in files) {
for (declaration in file.declarations) {
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 -> {}
}
}
}
@@ -26,7 +26,7 @@ fun serializeSingleFirFile(file: FirFile, session: FirSession, scopeSession: Sco
// TODO: split package fragment (see klib serializer)
// TODO: handle incremental/monolothic (see klib serializer) - maybe externally
val packageProto = packageSerializer.packagePartProto(file.packageFqName, file).build()
val packageProto = packageSerializer.packagePartProto(file.packageFqName, listOf(file)).build()
fun List<FirDeclaration>.makeClassesProtoWithNested(): List<Pair<ProtoBuf.Class, Int>> =
// TODO: filter out expects
@@ -118,7 +118,7 @@ class FirMetadataSerializer(
val message = when (metadata) {
is FirMetadataSource.Class -> serializer!!.classProto(metadata.fir).build()
is FirMetadataSource.File ->
serializer!!.packagePartProto(metadata.fir.packageFqName, metadata.fir).apply {
serializer!!.packagePartProto(metadata.files.first().packageFqName, metadata.files).apply {
serializerExtension.serializeJvmPackage(this)
}.build()
is FirMetadataSource.Function -> {
@@ -96,7 +96,7 @@ class Fir2IrVisitor(
it.toIrDeclaration()
}
annotationGenerator.generate(this, file)
metadata = FirMetadataSource.File(file)
metadata = FirMetadataSource.File(listOf(file))
}
}
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isConst
import org.jetbrains.kotlin.ir.declarations.MetadataSource
@@ -13,10 +12,7 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
sealed class FirMetadataSource : MetadataSource {
abstract val fir: FirDeclaration
val declarationSiteSession: FirSession
get() = fir.moduleData.session
abstract val fir: FirDeclaration?
override val name: Name?
get() = when (val fir = fir) {
@@ -27,8 +23,11 @@ sealed class FirMetadataSource : MetadataSource {
else -> null
}
class File(override val fir: FirFile) : FirMetadataSource(), MetadataSource.File {
class File(val files: List<FirFile>) : FirMetadataSource(), MetadataSource.File {
override var serializedIr: ByteArray? = null
override val fir: FirDeclaration?
get() = null
}
class Class(override val fir: FirClass) : FirMetadataSource(), MetadataSource.Class {
@@ -70,7 +70,7 @@ internal fun collectNewDirtySources(
}
override fun visitFile(file: FirFile, data: MutableList<MetadataSerializer>) {
val metadata = FirMetadataSource.File(file)
val metadata = FirMetadataSource.File(listOf(file))
withMetadataSerializer(metadata, data) {
file.acceptChildren(this, data)
// TODO: compare package fragments?