Minor refactoring in DeserializedClassDescriptor

This commit is contained in:
Alexander Udalov
2013-09-23 21:09:47 +04:00
parent a97bb80216
commit f7db95f63c
@@ -45,6 +45,7 @@ import java.util.*;
import static org.jetbrains.jet.descriptors.serialization.TypeDeserializer.TypeParameterResolver.NONE; import static org.jetbrains.jet.descriptors.serialization.TypeDeserializer.TypeParameterResolver.NONE;
import static org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER; import static org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassObjectName; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassObjectName;
import static org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager.ReferenceKind.STRONG;
public class DeserializedClassDescriptor extends AbstractClassDescriptor implements ClassDescriptor { public class DeserializedClassDescriptor extends AbstractClassDescriptor implements ClassDescriptor {
@@ -77,7 +78,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
public DeserializedClassDescriptor( public DeserializedClassDescriptor(
@NotNull StorageManager storageManager, @NotNull StorageManager storageManager,
@NotNull AnnotationDeserializer annotationResolver, @NotNull AnnotationDeserializer annotationResolver,
@NotNull final DescriptorFinder descriptorFinder, @NotNull DescriptorFinder descriptorFinder,
@NotNull ClassData classData @NotNull ClassData classData
) { ) {
super(classData.getNameResolver().getClassId(classData.getClassProto().getFqName()).getRelativeClassName().shortName()); super(classData.getNameResolver().getClassId(classData.getClassProto().getFqName()).getRelativeClassName().shortName());
@@ -134,25 +135,15 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
return computeClassObjectDescriptor(); return computeClassObjectDescriptor();
} }
}); });
this.nestedClasses = new NestedClassDescriptors(storageManager, stringSet(classProto.getNestedClassNameList(), nameResolver)) { this.nestedClasses = new NestedClassDescriptors(storageManager, names(classProto.getNestedClassNameList(), nameResolver));
@Override this.nestedObjects = new NestedClassDescriptors(storageManager, names(classProto.getNestedObjectNameList(), nameResolver));
protected ClassDescriptor resolveNestedClass(@NotNull Name name) {
return descriptorFinder.findClass(classId.createNestedClassId(name));
}
};
this.nestedObjects = new NestedClassDescriptors(storageManager, stringSet(classProto.getNestedObjectNameList(), nameResolver)) {
@Override
protected ClassDescriptor resolveNestedClass(@NotNull Name name) {
return descriptorFinder.findClass(classId.createNestedClassId(name));
}
};
} }
@NotNull @NotNull
private static Set<String> stringSet(@NotNull List<Integer> nameIndices, @NotNull NameResolver nameResolver) { private static Set<Name> names(@NotNull List<Integer> nameIndices, @NotNull NameResolver nameResolver) {
Set<String> result = new HashSet<String>(nameIndices.size()); Set<Name> result = new HashSet<Name>(nameIndices.size());
for (Integer index : nameIndices) { for (Integer index : nameIndices) {
result.add(nameResolver.getName(index).asString()); result.add(nameResolver.getName(index));
} }
return result; return result;
} }
@@ -493,30 +484,27 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
} }
} }
private abstract static class NestedClassDescriptors { private class NestedClassDescriptors {
private final Set<String> declaredNames; private final Set<Name> declaredNames;
private final MemoizedFunctionToNullable<Name, ClassDescriptor> findClass; private final MemoizedFunctionToNullable<Name, ClassDescriptor> findClass;
public NestedClassDescriptors(@NotNull StorageManager storageManager, @NotNull Set<String> declaredNames) { public NestedClassDescriptors(@NotNull StorageManager storageManager, @NotNull Set<Name> declaredNames) {
this.declaredNames = declaredNames; this.declaredNames = declaredNames;
this.findClass = storageManager.createMemoizedFunctionWithNullableValues(new Function<Name, ClassDescriptor>() { this.findClass = storageManager.createMemoizedFunctionWithNullableValues(new Function<Name, ClassDescriptor>() {
@Override @Override
public ClassDescriptor fun(Name name) { public ClassDescriptor fun(Name name) {
NestedClassDescriptors _this = NestedClassDescriptors.this; return NestedClassDescriptors.this.declaredNames.contains(name) ?
if (!_this.declaredNames.contains(name.asString())) return null; descriptorFinder.findClass(classId.createNestedClassId(name)) :
null;
return resolveNestedClass(name);
} }
}, StorageManager.ReferenceKind.STRONG); }, STRONG);
} }
protected abstract ClassDescriptor resolveNestedClass(@NotNull Name name);
@NotNull @NotNull
public Collection<ClassDescriptor> getAllDescriptors() { public Collection<ClassDescriptor> getAllDescriptors() {
Collection<ClassDescriptor> result = new ArrayList<ClassDescriptor>(declaredNames.size()); Collection<ClassDescriptor> result = new ArrayList<ClassDescriptor>(declaredNames.size());
for (String name : declaredNames) { for (Name name : declaredNames) {
ClassDescriptor descriptor = findClass.fun(Name.identifier(name)); ClassDescriptor descriptor = findClass.fun(name);
if (descriptor != null) { if (descriptor != null) {
result.add(descriptor); result.add(descriptor);
} }