Support creating a new serializer for each class
This commit is contained in:
committed by
Alexander Udalov
parent
76e01fa552
commit
47d1633252
+31
-6
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user