From 47d16332523558ff15b059398c0e29fa0c7b59f5 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 31 May 2013 21:19:24 +0400 Subject: [PATCH] Support creating a new serializer for each class --- .../serialization/ClassSerializationUtil.java | 37 ++++++++++++++++--- .../BuiltinsDeserializationTest.java | 4 +- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassSerializationUtil.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassSerializationUtil.java index c4abd20b7df..d0c23263ac7 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassSerializationUtil.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassSerializationUtil.java @@ -31,29 +31,54 @@ public class ClassSerializationUtil { void writeClass(@NotNull ClassDescriptor classDescriptor, @NotNull ProtoBuf.Class classProto); } - public static void serializeClass(@NotNull ClassDescriptor classDescriptor, @NotNull DescriptorSerializer serializer, @NotNull Sink sink) { + public interface SerializerProvider { + @NotNull + DescriptorSerializer getSerializerFor(@NotNull ClassDescriptor classDescriptor); + } + + public static final SerializerProvider NEW_EVERY_TIME = new SerializerProvider() { + @NotNull + @Override + public DescriptorSerializer getSerializerFor(@NotNull ClassDescriptor classDescriptor) { + return new DescriptorSerializer(NameTable.Namer.DEFAULT); + } + }; + + @NotNull + public static SerializerProvider constantSerializer(@NotNull final DescriptorSerializer serializer) { + return new SerializerProvider() { + @NotNull + @Override + public DescriptorSerializer getSerializerFor(@NotNull ClassDescriptor classDescriptor) { + return serializer; + } + }; + } + + public static void serializeClass(@NotNull ClassDescriptor classDescriptor, @NotNull SerializerProvider serializerProvider, @NotNull Sink sink) { + DescriptorSerializer serializer = serializerProvider.getSerializerFor(classDescriptor); ProtoBuf.Class classProto = serializer.classProto(classDescriptor).build(); sink.writeClass(classDescriptor, classProto); - serializeClasses(classDescriptor.getUnsubstitutedInnerClassesScope().getAllDescriptors(), serializer, sink); + serializeClasses(classDescriptor.getUnsubstitutedInnerClassesScope().getAllDescriptors(), serializerProvider, sink); - serializeClasses(classDescriptor.getUnsubstitutedInnerClassesScope().getObjectDescriptors(), serializer, sink); + serializeClasses(classDescriptor.getUnsubstitutedInnerClassesScope().getObjectDescriptors(), serializerProvider, sink); ClassDescriptor classObjectDescriptor = classDescriptor.getClassObjectDescriptor(); if (classObjectDescriptor != null) { - serializeClass(classObjectDescriptor, serializer, sink); + serializeClass(classObjectDescriptor, serializerProvider, sink); } } public static void serializeClasses( @NotNull Collection descriptors, - @NotNull DescriptorSerializer serializer, + @NotNull SerializerProvider serializerProvider, @NotNull Sink sink ) { for (DeclarationDescriptor descriptor : descriptors) { if (descriptor instanceof ClassDescriptor) { ClassDescriptor nestedClass = (ClassDescriptor) descriptor; - serializeClass(nestedClass, serializer, sink); + serializeClass(nestedClass, serializerProvider, sink); } } } diff --git a/compiler/tests/org/jetbrains/jet/descriptors/serialization/BuiltinsDeserializationTest.java b/compiler/tests/org/jetbrains/jet/descriptors/serialization/BuiltinsDeserializationTest.java index d5980ee71bc..15948d71d14 100644 --- a/compiler/tests/org/jetbrains/jet/descriptors/serialization/BuiltinsDeserializationTest.java +++ b/compiler/tests/org/jetbrains/jet/descriptors/serialization/BuiltinsDeserializationTest.java @@ -46,6 +46,8 @@ import org.jetbrains.jet.test.util.NamespaceComparator; import java.util.*; +import static org.jetbrains.jet.descriptors.serialization.ClassSerializationUtil.constantSerializer; + public class BuiltinsDeserializationTest extends KotlinTestWithEnvironment { private static final Name CLASS_OBJECT_NAME = Name.special(""); @@ -147,7 +149,7 @@ public class BuiltinsDeserializationTest extends KotlinTestWithEnvironment { Collection allDescriptors ) { final Map classProtos = Maps.newHashMap(); - ClassSerializationUtil.serializeClasses(allDescriptors, serializer, new ClassSerializationUtil.Sink() { + ClassSerializationUtil.serializeClasses(allDescriptors, constantSerializer(serializer), new ClassSerializationUtil.Sink() { @Override public void writeClass( @NotNull ClassDescriptor classDescriptor, @NotNull ProtoBuf.Class classProto