Deserialized scopes rely on storage manager

This commit is contained in:
Andrey Breslav
2013-06-19 15:56:25 +04:00
committed by Alexander Udalov
parent 8ff99b9fe7
commit 48435531ea
4 changed files with 27 additions and 24 deletions
@@ -90,7 +90,7 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
this.containingDeclaration = containingDeclaration;
this.typeConstructor = new DeserializedClassTypeConstructor(typeParameters);
this.memberScope = new DeserializedClassMemberScope(this);
this.memberScope = new DeserializedClassMemberScope(storageManager, this);
this.innerClassesScope = new InnerClassesScopeWrapper(memberScope);
this.thisAsReceiverParameter = new LazyClassReceiverParameterDescriptor();
@@ -327,8 +327,8 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
private static class DeserializedClassMemberScope extends DeserializedMemberScope {
private final DeserializedClassDescriptor classDescriptor;
public DeserializedClassMemberScope(@NotNull DeserializedClassDescriptor classDescriptor) {
super(classDescriptor, classDescriptor.deserializer, classDescriptor.classProto.getMembersList());
public DeserializedClassMemberScope(@NotNull StorageManager storageManager, @NotNull DeserializedClassDescriptor classDescriptor) {
super(storageManager, classDescriptor, classDescriptor.deserializer, classDescriptor.classProto.getMembersList());
this.classDescriptor = classDescriptor;
}
@@ -16,22 +16,23 @@
package org.jetbrains.jet.descriptors.serialization.descriptors;
import com.intellij.openapi.util.Computable;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.DescriptorDeserializer;
import org.jetbrains.jet.descriptors.serialization.Flags;
import org.jetbrains.jet.descriptors.serialization.ProtoBuf;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNotNull;
import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNotNullImpl;
import org.jetbrains.jet.lang.resolve.lazy.storage.NotNullLazyValue;
import org.jetbrains.jet.lang.resolve.lazy.storage.NotNullLazyValueImpl;
import org.jetbrains.jet.lang.resolve.lazy.storage.*;
import org.jetbrains.jet.lang.resolve.name.LabelName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import java.util.*;
import static org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager.ReferenceKind.STRONG;
public abstract class DeserializedMemberScope implements JetScope {
private static final Filter<ProtoBuf.Callable.CallableKind> FUNCTION = new Filter<ProtoBuf.Callable.CallableKind>() {
@@ -49,6 +50,8 @@ public abstract class DeserializedMemberScope implements JetScope {
private final DeclarationDescriptor containingDeclaration;
private final DescriptorDeserializer deserializer;
// Never modified after creation
private final Map<Name, List<ProtoBuf.Callable>> membersProtos;
private final MemoizedFunctionToNotNull<Name, Collection<FunctionDescriptor>> functions;
@@ -57,6 +60,7 @@ public abstract class DeserializedMemberScope implements JetScope {
private final NotNullLazyValue<Collection<ClassDescriptor>> objectDescriptors;
public DeserializedMemberScope(
@NotNull StorageManager storageManager,
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull DescriptorDeserializer deserializer,
@NotNull List<ProtoBuf.Callable> membersList
@@ -65,34 +69,30 @@ public abstract class DeserializedMemberScope implements JetScope {
this.deserializer = deserializer;
this.membersProtos = groupByName(membersList);
this.functions = new MemoizedFunctionToNotNullImpl<Name, Collection<FunctionDescriptor>>() {
@NotNull
this.functions = storageManager.createMemoizedFunction(new Function<Name, Collection<FunctionDescriptor>>() {
@Override
protected Collection<FunctionDescriptor> doCompute(Name name) {
public Collection<FunctionDescriptor> fun(Name name) {
return computeFunctions(name);
}
};
this.properties = new MemoizedFunctionToNotNullImpl<Name, Collection<VariableDescriptor>>() {
@NotNull
}, STRONG);
this.properties = storageManager.createMemoizedFunction(new Function<Name, Collection<VariableDescriptor>>() {
@Override
protected Collection<VariableDescriptor> doCompute(Name name) {
public Collection<VariableDescriptor> fun(Name name) {
return computeProperties(name);
}
};
this.allDescriptors = new NotNullLazyValueImpl<Collection<DeclarationDescriptor>>() {
@NotNull
}, STRONG);
this.allDescriptors = storageManager.createLazyValue(new Computable<Collection<DeclarationDescriptor>>() {
@Override
protected Collection<DeclarationDescriptor> doCompute() {
public Collection<DeclarationDescriptor> compute() {
return computeAllDescriptors();
}
};
this.objectDescriptors = new NotNullLazyValueImpl<Collection<ClassDescriptor>>() {
@NotNull
});
this.objectDescriptors = storageManager.createLazyValue(new Computable<Collection<ClassDescriptor>>() {
@Override
protected Collection<ClassDescriptor> doCompute() {
public Collection<ClassDescriptor> compute() {
return computeAllObjectDescriptors();
}
};
});
}
@NotNull
@@ -11,6 +11,7 @@ import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -25,12 +26,13 @@ public abstract class DeserializedPackageMemberScope extends DeserializedMemberS
private final FqName packageFqName;
public DeserializedPackageMemberScope(
@NotNull StorageManager storageManager,
@NotNull NamespaceDescriptor packageDescriptor,
@NotNull DescriptorDeserializer deserializer,
@NotNull List<ProtoBuf.Callable> membersList,
ClassResolver classResolver
) {
super(packageDescriptor, deserializer, membersList);
super(storageManager, packageDescriptor, deserializer, membersList);
this.classResolver = classResolver;
this.packageFqName = DescriptorUtils.getFQName(packageDescriptor).toSafe();
}
@@ -94,6 +94,7 @@ class BuiltinsNamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl {
}
};
members = new DeserializedPackageMemberScope(
storageManager,
this,
DescriptorDeserializer.create(this, nameResolver, classResolver, AnnotationDeserializer.UNSUPPORTED),
loadCallables(), classResolver