From 0c499403567271323812053f34d0474c561609c7 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 30 May 2013 20:16:58 +0400 Subject: [PATCH] Dependency on ClassResolver moved to TypeDeserializer --- .../serialization/DescriptorDeserializer.java | 51 ++++++++++++------- .../serialization/NameResolver.java | 25 ++------- .../serialization/NameSerializationUtil.java | 20 ++++++-- .../serialization/TypeDeserializer.java | 29 +++++++++-- .../DeserializedClassDescriptor.java | 5 +- .../AbstractDescriptorSerializationTest.java | 6 +-- 6 files changed, 84 insertions(+), 52 deletions(-) diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java index acdcfd247f2..c7c1bc8842c 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java @@ -17,7 +17,6 @@ package org.jetbrains.jet.descriptors.serialization; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.Modality; import org.jetbrains.jet.lang.descriptors.Visibility; @@ -32,11 +31,39 @@ import java.util.List; import static org.jetbrains.jet.descriptors.serialization.ProtoBuf.*; public class DescriptorDeserializer { + + @NotNull + public static DescriptorDeserializer create( + @NotNull DeclarationDescriptor containingDeclaration, + @NotNull NameResolver nameResolver, + @NotNull ClassResolver classResolver + ) { + return new DescriptorDeserializer(new TypeDeserializer(null, nameResolver, classResolver), containingDeclaration, nameResolver); + } + + @NotNull + public static DescriptorDeserializer create( + @NotNull TypeDeserializer typeDeserializer, + @NotNull DeclarationDescriptor containingDeclaration, + @NotNull NameResolver nameResolver + ) { + return new DescriptorDeserializer(typeDeserializer, containingDeclaration, nameResolver); + } + + @NotNull + public static DescriptorDeserializer createChild( + @NotNull DescriptorDeserializer parent, + @NotNull DeclarationDescriptor containingDeclaration, + @NotNull NameResolver nameResolver + ) { + return create(parent.typeDeserializer, containingDeclaration, nameResolver); + } + private final DeclarationDescriptor containingDeclaration; private final NameResolver nameResolver; private final TypeDeserializer typeDeserializer; - public DescriptorDeserializer( + private DescriptorDeserializer( @NotNull TypeDeserializer typeDeserializer, @NotNull DeclarationDescriptor containingDeclaration, @NotNull NameResolver nameResolver @@ -46,18 +73,6 @@ public class DescriptorDeserializer { this.nameResolver = nameResolver; } - public DescriptorDeserializer( - @Nullable DescriptorDeserializer parent, - @NotNull DeclarationDescriptor containingDeclaration, - @NotNull NameResolver nameResolver - ) { - this( - new TypeDeserializer(parent == null ? null : parent.typeDeserializer, nameResolver), - containingDeclaration, - nameResolver - ); - } - @NotNull public DeclarationDescriptor getContainingDeclaration() { return containingDeclaration; @@ -75,7 +90,7 @@ public class DescriptorDeserializer { @NotNull private DescriptorDeserializer createChildDeserializer(@NotNull DeclarationDescriptor descriptor) { - return new DescriptorDeserializer(this, descriptor, nameResolver); + return createChild(this, descriptor, nameResolver); } @NotNull @@ -106,7 +121,7 @@ public class DescriptorDeserializer { nameResolver.getName(proto.getName()), memberKind(Flags.getMemberKind(flags)) ); - DescriptorDeserializer local = new DescriptorDeserializer(this, property, nameResolver); + DescriptorDeserializer local = createChildDeserializer(property); List typeParameters = local.typeParameters(proto.getTypeParametersList()); property.setType( local.typeDeserializer.type(proto.getReturnType()), @@ -128,7 +143,7 @@ public class DescriptorDeserializer { nameResolver.getName(proto.getName()), memberKind(Flags.getMemberKind(flags)) ); - DescriptorDeserializer local = new DescriptorDeserializer(this, function, nameResolver); + DescriptorDeserializer local = createChildDeserializer(function); List typeParameters = local.typeParameters(proto.getTypeParametersList()); function.initialize( local.typeDeserializer.typeOrNull(proto.hasReceiverType() ? proto.getReceiverType() : null), @@ -154,7 +169,7 @@ public class DescriptorDeserializer { Collections.emptyList(), // TODO: primary true); - DescriptorDeserializer local = new DescriptorDeserializer(this, descriptor, nameResolver); + DescriptorDeserializer local = createChildDeserializer(descriptor); descriptor.initialize( classDescriptor.getTypeConstructor().getParameters(), local.valueParameters(proto.getValueParametersList()), diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameResolver.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameResolver.java index 4be7e80a743..e27cc42978e 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameResolver.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameResolver.java @@ -18,28 +18,22 @@ package org.jetbrains.jet.descriptors.serialization; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.Name; -import static org.jetbrains.jet.descriptors.serialization.ProtoBuf.QualifiedNameTable.*; +import static org.jetbrains.jet.descriptors.serialization.ProtoBuf.QualifiedNameTable.QualifiedName; public class NameResolver { private final ProtoBuf.SimpleNameTable simpleNames; private final ProtoBuf.QualifiedNameTable qualifiedNames; - private final ClassDescriptor[] classDescriptors; - private final ClassResolver classResolver; public NameResolver( @NotNull ProtoBuf.SimpleNameTable simpleNames, - @NotNull ProtoBuf.QualifiedNameTable qualifiedNames, - @NotNull ClassResolver classResolver + @NotNull ProtoBuf.QualifiedNameTable qualifiedNames ) { this.simpleNames = simpleNames; this.qualifiedNames = qualifiedNames; - this.classDescriptors = new ClassDescriptor[qualifiedNames.getQualifiedNamesCount()]; - this.classResolver = classResolver; } @NotNull @@ -48,23 +42,10 @@ public class NameResolver { return Name.guess(name); } - @Nullable - public ClassDescriptor getClassDescriptor(int fqNameIndex) { - if (classDescriptors[fqNameIndex] != null) { - return classDescriptors[fqNameIndex]; - } - - QualifiedName fqNameProto = qualifiedNames.getQualifiedNames(fqNameIndex); - assert fqNameProto.getKind() == QualifiedName.Kind.CLASS : "Not a class fqName: " + getClassId(fqNameIndex); - - - ClassId classId = getClassId(fqNameIndex); - return classResolver.findClass(classId); - } - @NotNull public ClassId getClassId(int index) { QualifiedName fqNameProto = qualifiedNames.getQualifiedNames(index); + assert fqNameProto.getKind() == ProtoBuf.QualifiedNameTable.QualifiedName.Kind.CLASS : "Not a class fqName: " + getClassId(index); StringBuilder relativeClassName = new StringBuilder(); QualifiedName packageFqNameProto = renderFqName(relativeClassName, fqNameProto, QualifiedName.Kind.CLASS); diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameSerializationUtil.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameSerializationUtil.java index ccfd5ea5fa4..82486cda169 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameSerializationUtil.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameSerializationUtil.java @@ -24,24 +24,36 @@ import java.io.OutputStream; public class NameSerializationUtil { @NotNull - public static NameResolver deserializeNameResolver(@NotNull InputStream in, @NotNull ClassResolver classResolver) + public static NameResolver deserializeNameResolver(@NotNull InputStream in) throws IOException { ProtoBuf.SimpleNameTable simpleNames = ProtoBuf.SimpleNameTable.parseDelimitedFrom(in); ProtoBuf.QualifiedNameTable qualifiedNames = ProtoBuf.QualifiedNameTable.parseDelimitedFrom(in); - return new NameResolver(simpleNames, qualifiedNames, classResolver); + return new NameResolver(simpleNames, qualifiedNames); } public static void serializeNameTable(@NotNull OutputStream out, @NotNull NameTable nameTable) throws IOException { + ProtoBuf.SimpleNameTable simpleNamesProto = toSimpleNameTable(nameTable); + simpleNamesProto.writeDelimitedTo(out); + + ProtoBuf.QualifiedNameTable qualifiedNameTable = toQualifiedNameTable(nameTable); + qualifiedNameTable.writeDelimitedTo(out); + } + + @NotNull + public static ProtoBuf.SimpleNameTable toSimpleNameTable(@NotNull NameTable nameTable) { ProtoBuf.SimpleNameTable.Builder simpleNames = ProtoBuf.SimpleNameTable.newBuilder(); for (String simpleName : nameTable.getSimpleNames()) { simpleNames.addNames(simpleName); } - simpleNames.build().writeDelimitedTo(out); + return simpleNames.build(); + } + @NotNull + public static ProtoBuf.QualifiedNameTable toQualifiedNameTable(@NotNull NameTable nameTable) { ProtoBuf.QualifiedNameTable.Builder qualifiedNames = ProtoBuf.QualifiedNameTable.newBuilder(); for (ProtoBuf.QualifiedNameTable.QualifiedName.Builder qName : nameTable.getFqNames()) { qualifiedNames.addQualifiedNames(qName); } - qualifiedNames.build().writeDelimitedTo(out); + return qualifiedNames.build(); } } diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/TypeDeserializer.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/TypeDeserializer.java index df9adf2e272..d46ddfd9fcc 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/TypeDeserializer.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/TypeDeserializer.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.descriptors.serialization; +import gnu.trove.TIntObjectHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; @@ -31,19 +32,28 @@ import java.util.List; public class TypeDeserializer { private final NameResolver nameResolver; + private final ClassResolver classResolver; private final IndexedSymbolTable typeParameterDescriptors; + private final TIntObjectHashMap classDescriptors = new TIntObjectHashMap(); public TypeDeserializer(@NotNull TypeDeserializer parent) { - this(parent, parent.nameResolver); + this(parent, parent.nameResolver, parent.classResolver); } public TypeDeserializer( @Nullable TypeDeserializer parent, - @NotNull NameResolver nameResolver + @NotNull NameResolver nameResolver, + @NotNull ClassResolver classResolver ) { IndexedSymbolTable parentTypeParameters = parent == null ? null : parent.typeParameterDescriptors; this.typeParameterDescriptors = new IndexedSymbolTable(parentTypeParameters); this.nameResolver = nameResolver; + this.classResolver = classResolver; + } + + @NotNull + public ClassResolver getClassResolver() { + return classResolver; } public void registerTypeParameter(int id, TypeParameterDescriptor typeParameter) { @@ -130,7 +140,7 @@ public class TypeDeserializer { private TypeConstructor typeConstructor(@NotNull ProtoBuf.Type.Constructor proto) { switch (proto.getKind()) { case CLASS: - ClassDescriptor classDescriptor = nameResolver.getClassDescriptor(proto.getId()); + ClassDescriptor classDescriptor = getClassDescriptor(proto.getId()); if (classDescriptor == null) return null; return classDescriptor.getTypeConstructor(); @@ -143,6 +153,19 @@ public class TypeDeserializer { throw new IllegalStateException("Unknown kind " + proto.getKind()); } + @Nullable + private ClassDescriptor getClassDescriptor(int fqNameIndex) { + ClassDescriptor classDescriptor = classDescriptors.get(fqNameIndex); + if (classDescriptor != null) { + return classDescriptor; + } + + ClassId classId = nameResolver.getClassId(fqNameIndex); + ClassDescriptor descriptor = classResolver.findClass(classId); + classDescriptors.put(fqNameIndex, descriptor); + return descriptor; + } + private List typeArguments(List protos) { List result = new ArrayList(protos.size()); for (ProtoBuf.Type.Argument proto : protos) { diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java index ffa59787b86..b52abd92a70 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java @@ -63,13 +63,14 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements public DeserializedClassDescriptor( @NotNull DeclarationDescriptor containingDeclaration, @NotNull NameResolver nameResolver, + @NotNull ClassResolver classResolver, @NotNull NestedClassResolver _nestedClassResolver, @NotNull ProtoBuf.Class classProto, @Nullable TypeDeserializer outerTypeDeserializer ) { this.classProto = classProto; - this.typeDeserializer = new TypeDeserializer(outerTypeDeserializer, nameResolver); - this.deserializer = new DescriptorDeserializer(typeDeserializer, this, nameResolver); + this.typeDeserializer = new TypeDeserializer(outerTypeDeserializer, nameResolver, classResolver); + this.deserializer = DescriptorDeserializer.create(typeDeserializer, this, nameResolver); this.containingDeclaration = containingDeclaration; this.typeConstructor = new DeserializedClassTypeConstructor(); diff --git a/compiler/tests/org/jetbrains/jet/descriptors/serialization/AbstractDescriptorSerializationTest.java b/compiler/tests/org/jetbrains/jet/descriptors/serialization/AbstractDescriptorSerializationTest.java index feb93d19af5..1a21917a677 100644 --- a/compiler/tests/org/jetbrains/jet/descriptors/serialization/AbstractDescriptorSerializationTest.java +++ b/compiler/tests/org/jetbrains/jet/descriptors/serialization/AbstractDescriptorSerializationTest.java @@ -184,7 +184,7 @@ public abstract class AbstractDescriptorSerializationTest extends KotlinTestWith } DescriptorDeserializer deserializer = - new DescriptorDeserializer((DescriptorDeserializer) null, namespace, new NameResolver(simpleNames, qualifiedNames, classResolver)); + DescriptorDeserializer.create(namespace, new NameResolver(simpleNames, qualifiedNames), classResolver); for (ProtoBuf.Callable proto : callableProtos) { CallableMemberDescriptor descriptor = deserializer.loadCallable(proto); if (descriptor instanceof FunctionDescriptor) { @@ -358,8 +358,8 @@ public abstract class AbstractDescriptorSerializationTest extends KotlinTestWith } }; - NameResolver nameResolver = new NameResolver(classMetadata.simpleNames, classMetadata.qualifiedNames, this); - return new DeserializedClassDescriptor(containingDeclaration, nameResolver, nestedClassResolver, classMetadata.classProto, null); + NameResolver nameResolver = new NameResolver(classMetadata.simpleNames, classMetadata.qualifiedNames); + return new DeserializedClassDescriptor(containingDeclaration, nameResolver, this, nestedClassResolver, classMetadata.classProto, null); } @Nullable