Dependency on ClassResolver moved to TypeDeserializer

This commit is contained in:
Andrey Breslav
2013-05-30 20:16:58 +04:00
committed by Alexander Udalov
parent b38c5b9d08
commit 0c49940356
6 changed files with 84 additions and 52 deletions
@@ -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<TypeParameterDescriptor> 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<TypeParameterDescriptor> typeParameters = local.typeParameters(proto.getTypeParametersList());
function.initialize(
local.typeDeserializer.typeOrNull(proto.hasReceiverType() ? proto.getReceiverType() : null),
@@ -154,7 +169,7 @@ public class DescriptorDeserializer {
Collections.<AnnotationDescriptor>emptyList(),
// TODO: primary
true);
DescriptorDeserializer local = new DescriptorDeserializer(this, descriptor, nameResolver);
DescriptorDeserializer local = createChildDeserializer(descriptor);
descriptor.initialize(
classDescriptor.getTypeConstructor().getParameters(),
local.valueParameters(proto.getValueParametersList()),
@@ -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);
@@ -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();
}
}
@@ -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<TypeParameterDescriptor> typeParameterDescriptors;
private final TIntObjectHashMap<ClassDescriptor> classDescriptors = new TIntObjectHashMap<ClassDescriptor>();
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<TypeParameterDescriptor> parentTypeParameters = parent == null ? null : parent.typeParameterDescriptors;
this.typeParameterDescriptors = new IndexedSymbolTable<TypeParameterDescriptor>(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<TypeProjection> typeArguments(List<ProtoBuf.Type.Argument> protos) {
List<TypeProjection> result = new ArrayList<TypeProjection>(protos.size());
for (ProtoBuf.Type.Argument proto : protos) {
@@ -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();
@@ -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