Support creating a new serializer for each class

This commit is contained in:
Andrey Breslav
2013-05-31 21:19:24 +04:00
committed by Alexander Udalov
parent 76e01fa552
commit 47d1633252
2 changed files with 34 additions and 7 deletions
@@ -31,29 +31,54 @@ public class ClassSerializationUtil {
void writeClass(@NotNull ClassDescriptor classDescriptor, @NotNull ProtoBuf.Class classProto); 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(); ProtoBuf.Class classProto = serializer.classProto(classDescriptor).build();
sink.writeClass(classDescriptor, classProto); 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(); ClassDescriptor classObjectDescriptor = classDescriptor.getClassObjectDescriptor();
if (classObjectDescriptor != null) { if (classObjectDescriptor != null) {
serializeClass(classObjectDescriptor, serializer, sink); serializeClass(classObjectDescriptor, serializerProvider, sink);
} }
} }
public static void serializeClasses( public static void serializeClasses(
@NotNull Collection<? extends DeclarationDescriptor> descriptors, @NotNull Collection<? extends DeclarationDescriptor> descriptors,
@NotNull DescriptorSerializer serializer, @NotNull SerializerProvider serializerProvider,
@NotNull Sink sink @NotNull Sink sink
) { ) {
for (DeclarationDescriptor descriptor : descriptors) { for (DeclarationDescriptor descriptor : descriptors) {
if (descriptor instanceof ClassDescriptor) { if (descriptor instanceof ClassDescriptor) {
ClassDescriptor nestedClass = (ClassDescriptor) descriptor; ClassDescriptor nestedClass = (ClassDescriptor) descriptor;
serializeClass(nestedClass, serializer, sink); serializeClass(nestedClass, serializerProvider, sink);
} }
} }
} }
@@ -46,6 +46,8 @@ import org.jetbrains.jet.test.util.NamespaceComparator;
import java.util.*; import java.util.*;
import static org.jetbrains.jet.descriptors.serialization.ClassSerializationUtil.constantSerializer;
public class BuiltinsDeserializationTest extends KotlinTestWithEnvironment { public class BuiltinsDeserializationTest extends KotlinTestWithEnvironment {
private static final Name CLASS_OBJECT_NAME = Name.special("<class object>"); private static final Name CLASS_OBJECT_NAME = Name.special("<class object>");
@@ -147,7 +149,7 @@ public class BuiltinsDeserializationTest extends KotlinTestWithEnvironment {
Collection<DeclarationDescriptor> allDescriptors Collection<DeclarationDescriptor> allDescriptors
) { ) {
final Map<ClassId, ProtoBuf.Class> classProtos = Maps.newHashMap(); final Map<ClassId, ProtoBuf.Class> classProtos = Maps.newHashMap();
ClassSerializationUtil.serializeClasses(allDescriptors, serializer, new ClassSerializationUtil.Sink() { ClassSerializationUtil.serializeClasses(allDescriptors, constantSerializer(serializer), new ClassSerializationUtil.Sink() {
@Override @Override
public void writeClass( public void writeClass(
@NotNull ClassDescriptor classDescriptor, @NotNull ProtoBuf.Class classProto @NotNull ClassDescriptor classDescriptor, @NotNull ProtoBuf.Class classProto