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);
}
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<? extends DeclarationDescriptor> 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);
}
}
}
@@ -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("<class object>");
@@ -147,7 +149,7 @@ public class BuiltinsDeserializationTest extends KotlinTestWithEnvironment {
Collection<DeclarationDescriptor> allDescriptors
) {
final Map<ClassId, ProtoBuf.Class> 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