From 1a0e3a1d8353c4e0cf7040048b8fa46f11098c2e Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Thu, 20 Aug 2020 15:51:26 +0300 Subject: [PATCH] [KLIB] Refactor file serializer a bit - Support explicitly exported on files and properties --- .../common/serialization/IrFileSerializer.kt | 69 +++++++++++-------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt index 2afe9021467..8740b866326 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.library.* import org.jetbrains.kotlin.library.impl.IrMemoryArrayWriter import org.jetbrains.kotlin.library.impl.IrMemoryDeclarationWriter -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.backend.common.serialization.proto.Actual as ProtoActual @@ -1209,8 +1208,7 @@ open class IrFileSerializer( .addAllLineStartOffsets(entry.lineStartOffsets.asIterable()) .build() - open fun backendSpecificExplicitRoot(declaration: IrFunction) = false - open fun backendSpecificExplicitRoot(declaration: IrClass) = false + open fun backendSpecificExplicitRoot(node: IrAnnotationContainer): Boolean = false open fun keepOrderOfProperties(property: IrProperty): Boolean = !property.isConst open fun backendSpecificSerializeAllMembers(irClass: IrClass) = false @@ -1223,6 +1221,46 @@ open class IrFileSerializer( return !(member.isFakeOverride && declarationTable.isExportedDeclaration(member)) } + private fun fillPlatformExplicitlyExported(file: IrFile, proto: ProtoFile.Builder) { + + if (backendSpecificExplicitRoot(file)) { + for (declaration in file.declarations) { + if (declaration is IrSymbolOwner) { + proto.addExplicitlyExportedToCompiler(serializeIrSymbol(declaration.symbol)) + } + } + } else { + file.acceptVoid( + object : IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } + + override fun visitFunction(declaration: IrFunction) { + if (backendSpecificExplicitRoot(declaration)) { + proto.addExplicitlyExportedToCompiler(serializeIrSymbol(declaration.symbol)) + } + super.visitDeclaration(declaration) + } + + override fun visitClass(declaration: IrClass) { + if (backendSpecificExplicitRoot(declaration)) { + proto.addExplicitlyExportedToCompiler(serializeIrSymbol(declaration.symbol)) + } + super.visitDeclaration(declaration) + } + + override fun visitProperty(declaration: IrProperty) { + if (backendSpecificExplicitRoot(declaration)) { + proto.addExplicitlyExportedToCompiler(serializeIrSymbol(declaration.symbol)) + } + super.visitDeclaration(declaration) + } + } + ) + } + } + fun serializeIrFile(file: IrFile): SerializedIrFile { val topLevelDeclarations = mutableListOf() @@ -1259,30 +1297,7 @@ open class IrFileSerializer( proto.addExplicitlyExportedToCompiler(serializeIrSymbol(fieldSymbol)) } - // TODO: Konan specific - - file.acceptVoid( - object : IrElementVisitorVoid { - override fun visitElement(element: IrElement) { - element.acceptChildrenVoid(this) - } - - override fun visitFunction(declaration: IrFunction) { - if (backendSpecificExplicitRoot(declaration)) { - proto.addExplicitlyExportedToCompiler(serializeIrSymbol(declaration.symbol)) - } - super.visitDeclaration(declaration) - } - - override fun visitClass(declaration: IrClass) { - if (backendSpecificExplicitRoot(declaration)) { - proto.addExplicitlyExportedToCompiler(serializeIrSymbol(declaration.symbol)) - } - super.visitDeclaration(declaration) - } - } - ) - + fillPlatformExplicitlyExported(file, proto) serializeExpectActualSubstitutionTable(proto) return SerializedIrFile(