Remove NestedClassResolver class

This commit is contained in:
Pavel V. Talanov
2013-07-01 19:56:24 +04:00
committed by Alexander Udalov
parent f9ad6827d4
commit fa93ee7ff2
5 changed files with 21 additions and 56 deletions
@@ -26,27 +26,17 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullable; import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullable;
import org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager; import org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import static org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager.ReferenceKind.STRONG; import static org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager.ReferenceKind.STRONG;
public abstract class AbstractClassResolver implements ClassResolver { public abstract class AbstractClassResolver implements ClassResolver {
private final NestedClassResolver nestedClassResolver;
private final MemoizedFunctionToNullable<ClassId, ClassDescriptor> findClass; private final MemoizedFunctionToNullable<ClassId, ClassDescriptor> findClass;
private final AnnotationDeserializer annotationDeserializer; private final AnnotationDeserializer annotationDeserializer;
public AbstractClassResolver(@NotNull final StorageManager storageManager, @NotNull AnnotationDeserializer annotationDeserializer) { public AbstractClassResolver(@NotNull final StorageManager storageManager, @NotNull AnnotationDeserializer annotationDeserializer) {
this.annotationDeserializer = annotationDeserializer; this.annotationDeserializer = annotationDeserializer;
this.nestedClassResolver = new NestedClassResolver() {
@Nullable
@Override
public ClassDescriptor resolveNestedClass(@NotNull ClassDescriptor outerClass, @NotNull Name name) {
return findClass(getClassId(outerClass).createNestedClassId(name));
}
};
this.findClass = storageManager.createMemoizedFunctionWithNullableValues(new Function<ClassId, ClassDescriptor>() { this.findClass = storageManager.createMemoizedFunctionWithNullableValues(new Function<ClassId, ClassDescriptor>() {
@Override @Override
public ClassDescriptor fun(ClassId classId) { public ClassDescriptor fun(ClassId classId) {
@@ -63,9 +53,8 @@ public abstract class AbstractClassResolver implements ClassResolver {
AbstractClassResolver _this = AbstractClassResolver.this; AbstractClassResolver _this = AbstractClassResolver.this;
ClassDescriptor classDescriptor = new DeserializedClassDescriptor( ClassDescriptor classDescriptor = new DeserializedClassDescriptor(
storageManager, owner, classData.getNameResolver(), _this.annotationDeserializer, classId, storageManager, owner, classData.getNameResolver(),
_this, nestedClassResolver, classProto, null _this.annotationDeserializer, _this, classProto, null);
);
classDescriptorCreated(classDescriptor); classDescriptorCreated(classDescriptor);
return classDescriptor; return classDescriptor;
} }
@@ -19,14 +19,12 @@ package org.jetbrains.jet.descriptors.serialization;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationDeserializer; import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationDeserializer;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedTypeParameterDescriptor; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedTypeParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.*; import org.jetbrains.jet.lang.descriptors.impl.*;
import org.jetbrains.jet.lang.resolve.DescriptorResolver; import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager; import org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.Variance; import org.jetbrains.jet.lang.types.Variance;
import java.util.ArrayList; import java.util.ArrayList;
@@ -115,14 +113,6 @@ public class DescriptorDeserializer {
return create(storageManager, childTypeDeserializer, descriptor, nameResolver, annotationDeserializer); return create(storageManager, childTypeDeserializer, descriptor, nameResolver, annotationDeserializer);
} }
@NotNull
public ClassDescriptor loadClass(@NotNull ProtoBuf.Class proto, @NotNull NestedClassResolver nestedClassResolver) {
return new DeserializedClassDescriptor(
storageManager, containingDeclaration, getNameResolver(), annotationDeserializer,
typeDeserializer.getClassResolver(), nestedClassResolver, proto, typeDeserializer
);
}
@NotNull @NotNull
public CallableMemberDescriptor loadCallable(@NotNull Callable proto) { public CallableMemberDescriptor loadCallable(@NotNull Callable proto) {
Callable.CallableKind callableKind = Flags.CALLABLE_KIND.get(proto.getFlags()); Callable.CallableKind callableKind = Flags.CALLABLE_KIND.get(proto.getFlags());
@@ -1,11 +0,0 @@
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.Name;
public interface NestedClassResolver {
@Nullable
ClassDescriptor resolveNestedClass(@NotNull ClassDescriptor outerClass, @NotNull Name name);
}
@@ -45,6 +45,7 @@ import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassObjectName;
public class DeserializedClassDescriptor extends ClassDescriptorBase implements ClassDescriptor { public class DeserializedClassDescriptor extends ClassDescriptorBase implements ClassDescriptor {
private final ClassId classId;
private final ProtoBuf.Class classProto; private final ProtoBuf.Class classProto;
private final TypeDeserializer typeDeserializer; private final TypeDeserializer typeDeserializer;
private final DescriptorDeserializer deserializer; private final DescriptorDeserializer deserializer;
@@ -56,7 +57,6 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
private final AnnotationDeserializer annotationDeserializer; private final AnnotationDeserializer annotationDeserializer;
private final NotNullLazyValue<List<AnnotationDescriptor>> annotations; private final NotNullLazyValue<List<AnnotationDescriptor>> annotations;
private final NestedClassResolver nestedClassResolver;
private final NullableLazyValue<ClassDescriptor> classObjectDescriptor; private final NullableLazyValue<ClassDescriptor> classObjectDescriptor;
private final NestedClassDescriptors nestedClasses; private final NestedClassDescriptors nestedClasses;
@@ -70,18 +70,21 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
private final ClassKind kind; private final ClassKind kind;
private final boolean isInner; private final boolean isInner;
private final InnerClassesScopeWrapper innerClassesScope; private final InnerClassesScopeWrapper innerClassesScope;
private final ClassResolver classResolver;
public DeserializedClassDescriptor( public DeserializedClassDescriptor(
@NotNull ClassId classId,
@NotNull StorageManager storageManager, @NotNull StorageManager storageManager,
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@NotNull NameResolver nameResolver, @NotNull NameResolver nameResolver,
@NotNull AnnotationDeserializer annotationResolver, @NotNull AnnotationDeserializer annotationResolver,
@NotNull ClassResolver classResolver, @NotNull final ClassResolver classResolver,
@NotNull NestedClassResolver _nestedClassResolver,
@NotNull ProtoBuf.Class classProto, @NotNull ProtoBuf.Class classProto,
@Nullable TypeDeserializer outerTypeDeserializer @Nullable TypeDeserializer outerTypeDeserializer
) { ) {
this.classId = classId;
this.classProto = classProto; this.classProto = classProto;
this.classResolver = classResolver;
this.name = nameResolver.getName(classProto.getName()); this.name = nameResolver.getName(classProto.getName());
TypeDeserializer notNullTypeDeserializer = new TypeDeserializer(storageManager, outerTypeDeserializer, nameResolver, classResolver, TypeDeserializer notNullTypeDeserializer = new TypeDeserializer(storageManager, outerTypeDeserializer, nameResolver, classResolver,
@@ -119,7 +122,6 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
} }
}); });
this.nestedClassResolver = _nestedClassResolver;
this.classObjectDescriptor = storageManager.createNullableLazyValue(new Computable<ClassDescriptor>() { this.classObjectDescriptor = storageManager.createNullableLazyValue(new Computable<ClassDescriptor>() {
@Override @Override
public ClassDescriptor compute() { public ClassDescriptor compute() {
@@ -129,13 +131,13 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
this.nestedClasses = new NestedClassDescriptors(storageManager, stringSet(classProto.getNestedClassNameList(), nameResolver)) { this.nestedClasses = new NestedClassDescriptors(storageManager, stringSet(classProto.getNestedClassNameList(), nameResolver)) {
@Override @Override
protected ClassDescriptor resolveNestedClass(@NotNull Name name) { protected ClassDescriptor resolveNestedClass(@NotNull Name name) {
return nestedClassResolver.resolveNestedClass(DeserializedClassDescriptor.this, name); return classResolver.findClass(DeserializedClassDescriptor.this.classId.createNestedClassId(name));
} }
}; };
this.nestedObjects = new NestedClassDescriptors(storageManager, stringSet(classProto.getNestedObjectNameList(), nameResolver)) { this.nestedObjects = new NestedClassDescriptors(storageManager, stringSet(classProto.getNestedObjectNameList(), nameResolver)) {
@Override @Override
protected ClassDescriptor resolveNestedClass(@NotNull Name name) { protected ClassDescriptor resolveNestedClass(@NotNull Name name) {
return nestedClassResolver.resolveNestedClass(DeserializedClassDescriptor.this, name); return classResolver.findClass(DeserializedClassDescriptor.this.classId.createNestedClassId(name));
} }
}; };
} }
@@ -268,7 +270,7 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
return classObject; return classObject;
} }
return nestedClassResolver.resolveNestedClass(this, getClassObjectName(getName())); return classResolver.findClass(classId.createNestedClassId(getClassObjectName(getName())));
} }
@NotNull @NotNull
@@ -294,7 +296,8 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
private void createEnumEntry(@NotNull MutableClassDescriptor enumClassObject, @NotNull Name name) { private void createEnumEntry(@NotNull MutableClassDescriptor enumClassObject, @NotNull Name name) {
PropertyDescriptorImpl property = new PropertyDescriptorImpl(enumClassObject, Collections.<AnnotationDescriptor>emptyList(), PropertyDescriptorImpl property = new PropertyDescriptorImpl(enumClassObject, Collections.<AnnotationDescriptor>emptyList(),
Modality.FINAL, Visibilities.PUBLIC, false, name, CallableMemberDescriptor.Kind.DECLARATION); Modality.FINAL, Visibilities.PUBLIC, false, name,
CallableMemberDescriptor.Kind.DECLARATION);
property.setType(getDefaultType(), Collections.<TypeParameterDescriptor>emptyList(), property.setType(getDefaultType(), Collections.<TypeParameterDescriptor>emptyList(),
enumClassObject.getThisAsReceiverParameter(), NO_RECEIVER_PARAMETER); enumClassObject.getThisAsReceiverParameter(), NO_RECEIVER_PARAMETER);
@@ -149,7 +149,7 @@ public abstract class AbstractDescriptorSerializationTest extends KotlinTestWith
for (ClassDescriptor classDescriptor : classes) { for (ClassDescriptor classDescriptor : classes) {
ClassId classId = new ClassId(DescriptorUtils.getFQName(classDescriptor.getContainingDeclaration()).toSafe(), ClassId classId = new ClassId(DescriptorUtils.getFQName(classDescriptor.getContainingDeclaration()).toSafe(),
FqNameUnsafe.topLevel(classDescriptor.getName())); FqNameUnsafe.topLevel(classDescriptor.getName()));
ClassDescriptor descriptor = classResolver.findClass(classId); ClassDescriptor descriptor = classResolver.findClass(classId);
assert descriptor != null : "Class not loaded: " + classId; assert descriptor != null : "Class not loaded: " + classId;
if (descriptor.getKind().isObject()) { if (descriptor.getKind().isObject()) {
@@ -211,7 +211,7 @@ public abstract class AbstractDescriptorSerializationTest extends KotlinTestWith
private static NamespaceDescriptorImpl createTestNamespace() { private static NamespaceDescriptorImpl createTestNamespace() {
ModuleDescriptorImpl module = new ModuleDescriptorImpl(Name.special("<name>"), JavaBridgeConfiguration.ALL_JAVA_IMPORTS, ModuleDescriptorImpl module = new ModuleDescriptorImpl(Name.special("<name>"), JavaBridgeConfiguration.ALL_JAVA_IMPORTS,
JavaToKotlinClassMap.getInstance()); JavaToKotlinClassMap.getInstance());
NamespaceDescriptorImpl rootNamespace = NamespaceDescriptorImpl rootNamespace =
new NamespaceDescriptorImpl(module, Collections.<AnnotationDescriptor>emptyList(), JetPsiUtil.ROOT_NAMESPACE_NAME); new NamespaceDescriptorImpl(module, Collections.<AnnotationDescriptor>emptyList(), JetPsiUtil.ROOT_NAMESPACE_NAME);
module.setRootNamespace(rootNamespace); module.setRootNamespace(rootNamespace);
@@ -241,7 +241,8 @@ public abstract class AbstractDescriptorSerializationTest extends KotlinTestWith
} }
} }
private static void serializeClasses(Collection<ClassDescriptor> classes, Map<ClassDescriptor, byte[]> serializedClasses) throws IOException { private static void serializeClasses(Collection<ClassDescriptor> classes, Map<ClassDescriptor, byte[]> serializedClasses)
throws IOException {
for (ClassDescriptor classDescriptor : classes) { for (ClassDescriptor classDescriptor : classes) {
DescriptorSerializer descriptorSerializer = new DescriptorSerializer(); DescriptorSerializer descriptorSerializer = new DescriptorSerializer();
@@ -315,7 +316,7 @@ public abstract class AbstractDescriptorSerializationTest extends KotlinTestWith
@Nullable @Nullable
private ClassDescriptor resolveClass( private ClassDescriptor resolveClass(
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@NotNull final ClassId classId @NotNull ClassId classId
) { ) {
FqNameUnsafe fqName = classId.asSingleFqName(); FqNameUnsafe fqName = classId.asSingleFqName();
@@ -324,17 +325,10 @@ public abstract class AbstractDescriptorSerializationTest extends KotlinTestWith
return parentResolver.findClass(classId); return parentResolver.findClass(classId);
} }
NestedClassResolver nestedClassResolver = new NestedClassResolver() {
@Nullable
@Override
public ClassDescriptor resolveNestedClass(@NotNull ClassDescriptor outerClass, @NotNull Name name) {
return findClass(classId.createNestedClassId(name));
}
};
NameResolver nameResolver = new NameResolver(classMetadata.simpleNames, classMetadata.qualifiedNames); NameResolver nameResolver = new NameResolver(classMetadata.simpleNames, classMetadata.qualifiedNames);
return new DeserializedClassDescriptor(new LockBasedStorageManager(), containingDeclaration, nameResolver, return new DeserializedClassDescriptor(classId, new LockBasedStorageManager(), containingDeclaration, nameResolver,
DeserializedDescriptorResolver.DUMMY_ANNOTATION_DESERIALIZER, this, nestedClassResolver, classMetadata.classProto, null); DeserializedDescriptorResolver.DUMMY_ANNOTATION_DESERIALIZER, this,
classMetadata.classProto, null);
} }
@Nullable @Nullable