Refactor serialization of package FQ name extension

Instead of requiring to pass it in SerializerExtensionBase's
constructor, pass it always in serializePackage. This is more
straightforward and helps in a situation where one SerializerExtension
instance is used for the whole module, not one per-package
This commit is contained in:
Alexander Udalov
2017-03-03 19:15:04 +03:00
parent c952e26cbb
commit 7c22113c34
10 changed files with 19 additions and 24 deletions
@@ -176,7 +176,7 @@ class MultifileClassPartCodegen(
}
val serializer = DescriptorSerializer.createTopLevel(JvmSerializerExtension(v.serializationBindings, state))
val packageProto = serializer.packagePartProto(members).build()
val packageProto = serializer.packagePartProto(packageFragment.fqName, members).build()
val extraFlags = if (shouldGeneratePartHierarchy) JvmAnnotationNames.METADATA_MULTIFILE_PARTS_INHERIT_FLAG else 0
@@ -129,7 +129,7 @@ public class PackagePartCodegen extends MemberCodegen<KtFile> {
final DescriptorSerializer serializer =
DescriptorSerializer.createTopLevel(new JvmSerializerExtension(v.getSerializationBindings(), state));
final ProtoBuf.Package packageProto = serializer.packagePartProto(members).build();
final ProtoBuf.Package packageProto = serializer.packagePartProto(element.getPackageFqName(), members).build();
WriteAnnotationUtilKt.writeKotlinMetadata(v, state, KotlinClassHeader.Kind.FILE_FACADE, 0, new Function1<AnnotationVisitor, Unit>() {
@Override
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.load.java.lazy.types.RawTypeImpl;
import org.jetbrains.kotlin.load.kotlin.JavaFlexibleTypeDeserializer;
import org.jetbrains.kotlin.load.kotlin.TypeSignatureMappingKt;
import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.serialization.AnnotationSerializer;
import org.jetbrains.kotlin.serialization.ProtoBuf;
import org.jetbrains.kotlin.serialization.SerializerExtension;
@@ -77,7 +78,7 @@ public class JvmSerializerExtension extends SerializerExtension {
}
@Override
public void serializePackage(@NotNull ProtoBuf.Package.Builder proto) {
public void serializePackage(@NotNull FqName packageFqName, @NotNull ProtoBuf.Package.Builder proto) {
if (!moduleName.equals(JvmAbi.DEFAULT_MODULE_NAME)) {
proto.setExtension(JvmProtoBuf.packageModuleName, stringTable.getStringIndex(moduleName));
}
@@ -141,11 +141,11 @@ open class MetadataSerializer(private val dependOnOldBuiltIns: Boolean) {
protected inner class PackageSerializer(
private val classes: Collection<DeclarationDescriptor>,
private val members: Collection<DeclarationDescriptor>,
packageFqName: FqName,
private val packageFqName: FqName,
private val destFile: File
) {
private val proto = ProtoBuf.PackageFragment.newBuilder()
private val extension = BuiltInsSerializerExtension(packageFqName)
private val extension = BuiltInsSerializerExtension()
fun run() {
serializeClasses(classes)
@@ -170,7 +170,7 @@ open class MetadataSerializer(private val dependOnOldBuiltIns: Boolean) {
}
private fun serializeMembers(members: Collection<DeclarationDescriptor>) {
proto.`package` = DescriptorSerializer.createTopLevel(extension).packagePartProto(members).build()
proto.`package` = DescriptorSerializer.createTopLevel(extension).packagePartProto(packageFqName, members).build()
}
private fun serializeStringTable() {
@@ -17,9 +17,8 @@
package org.jetbrains.kotlin.serialization.builtins
import org.jetbrains.kotlin.builtins.BuiltInSerializerProtocol
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase
class BuiltInsSerializerExtension(packageFqName: FqName) : KotlinSerializerExtensionBase(BuiltInSerializerProtocol, packageFqName) {
class BuiltInsSerializerExtension : KotlinSerializerExtensionBase(BuiltInSerializerProtocol) {
override fun shouldUseTypeTable(): Boolean = true
}
@@ -17,20 +17,18 @@
package org.jetbrains.kotlin.serialization
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.builtins.getFunctionalClassKind
import org.jetbrains.kotlin.builtins.isSuspendFunctionType
import org.jetbrains.kotlin.builtins.transformSuspendFunctionToRuntimeFunctionType
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotated
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.protobuf.MessageLite
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry
import org.jetbrains.kotlin.resolve.MemberComparator
import org.jetbrains.kotlin.resolve.constants.NullValue
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
import org.jetbrains.kotlin.serialization.deserialization.descriptors.SinceKotlinInfo
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.typeUtil.contains
@@ -543,7 +541,7 @@ class DescriptorSerializer private constructor(
return builder
}
fun packagePartProto(members: Collection<DeclarationDescriptor>): ProtoBuf.Package.Builder {
fun packagePartProto(packageFqName: FqName, members: Collection<DeclarationDescriptor>): ProtoBuf.Package.Builder {
val builder = ProtoBuf.Package.newBuilder()
for (declaration in sort(members)) {
@@ -564,7 +562,7 @@ class DescriptorSerializer private constructor(
builder.sinceKotlinInfoTable = sinceKotlinInfoProto
}
extension.serializePackage(builder)
extension.serializePackage(packageFqName, builder)
return builder
}
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.serialization
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.types.FlexibleType
import org.jetbrains.kotlin.types.KotlinType
@@ -30,7 +31,7 @@ abstract class SerializerExtension {
open fun serializeClass(descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder) {
}
open fun serializePackage(proto: ProtoBuf.Package.Builder) {
open fun serializePackage(packageFqName: FqName, proto: ProtoBuf.Package.Builder) {
}
open fun serializeConstructor(descriptor: ConstructorDescriptor, proto: ProtoBuf.Constructor.Builder) {
@@ -21,10 +21,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.constants.NullValue
import org.jetbrains.kotlin.types.KotlinType
open class KotlinSerializerExtensionBase(
private val protocol: SerializerExtensionProtocol,
private val packageFqName: FqName
) : SerializerExtension() {
open class KotlinSerializerExtensionBase(private val protocol: SerializerExtensionProtocol) : SerializerExtension() {
override val stringTable = StringTableImpl()
override fun serializeClass(descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder) {
@@ -33,7 +30,7 @@ open class KotlinSerializerExtensionBase(
}
}
override fun serializePackage(proto: ProtoBuf.Package.Builder) {
override fun serializePackage(packageFqName: FqName, proto: ProtoBuf.Package.Builder) {
proto.setExtension(protocol.packageFqName, stringTable.getPackageFqNameIndex(packageFqName))
}
@@ -93,7 +93,7 @@ object KotlinJavascriptSerializationUtil {
val skip: (DeclarationDescriptor) -> Boolean = { DescriptorUtils.getContainingModule(it) != module || (it is MemberDescriptor && it.isHeader) }
val fileRegistry = KotlinFileRegistry()
val serializerExtension = KotlinJavascriptSerializerExtension(fileRegistry, fqName)
val serializerExtension = KotlinJavascriptSerializerExtension(fileRegistry)
val serializer = DescriptorSerializer.createTopLevel(serializerExtension)
val classDescriptors = DescriptorSerializer.sort(
@@ -123,7 +123,7 @@ object KotlinJavascriptSerializationUtil {
val members = fragments
.flatMap { fragment -> DescriptorUtils.getAllDescriptors(fragment.getMemberScope()) }
.filterNot(skip)
builder.`package` = serializer.packagePartProto(members).build()
builder.`package` = serializer.packagePartProto(fqName, members).build()
builder.setExtension(
JsProtoBuf.packageFragmentFiles,
@@ -29,9 +29,8 @@ import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol
import org.jetbrains.kotlin.types.FlexibleType
class KotlinJavascriptSerializerExtension(
private val fileRegistry: KotlinFileRegistry,
packageFqName: FqName
) : KotlinSerializerExtensionBase(JsSerializerProtocol, packageFqName) {
private val fileRegistry: KotlinFileRegistry
) : KotlinSerializerExtensionBase(JsSerializerProtocol) {
override val stringTable = JavaScriptStringTable()
override fun serializeFlexibleType(flexibleType: FlexibleType, lowerProto: ProtoBuf.Type.Builder, upperProto: ProtoBuf.Type.Builder) {