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);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user