Dependency on ClassResolver moved to TypeDeserializer
This commit is contained in:
committed by
Alexander Udalov
parent
b38c5b9d08
commit
0c49940356
+33
-18
@@ -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()),
|
||||
|
||||
+3
-22
@@ -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);
|
||||
|
||||
+16
-4
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
+26
-3
@@ -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) {
|
||||
|
||||
+3
-2
@@ -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();
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user