Class descriptors rely on StorageManager
This commit is contained in:
committed by
Alexander Udalov
parent
f527fe251c
commit
8ff99b9fe7
+5
-3
@@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullable;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullableImpl;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
|
||||
@@ -33,7 +34,7 @@ public abstract class AbstractClassResolver implements ClassResolver {
|
||||
private final MemoizedFunctionToNullable<ClassId, ClassDescriptor> findClass;
|
||||
private final AnnotationDeserializer annotationDeserializer;
|
||||
|
||||
public AbstractClassResolver(@NotNull AnnotationDeserializer annotationDeserializer) {
|
||||
public AbstractClassResolver(@NotNull final StorageManager storageManager, @NotNull AnnotationDeserializer annotationDeserializer) {
|
||||
this.annotationDeserializer = annotationDeserializer;
|
||||
|
||||
this.nestedClassResolver = new NestedClassResolver() {
|
||||
@@ -64,9 +65,10 @@ public abstract class AbstractClassResolver implements ClassResolver {
|
||||
classId.isTopLevelClass() ? getPackage(classId.getPackageFqName()) : findClass(classId.getOuterClassId());
|
||||
assert owner != null : "No owner found for " + classId;
|
||||
|
||||
AbstractClassResolver outer = AbstractClassResolver.this;
|
||||
AbstractClassResolver _this = AbstractClassResolver.this;
|
||||
ClassDescriptor classDescriptor = new DeserializedClassDescriptor(
|
||||
owner, classData.getNameResolver(), outer.annotationDeserializer, outer, nestedClassResolver, classProto, null
|
||||
storageManager, owner, classData.getNameResolver(), _this.annotationDeserializer,
|
||||
_this, nestedClassResolver, classProto, null
|
||||
);
|
||||
classDescriptorCreated(classDescriptor);
|
||||
return classDescriptor;
|
||||
|
||||
+1
-1
@@ -112,7 +112,7 @@ public class DescriptorDeserializer {
|
||||
@NotNull
|
||||
public ClassDescriptor loadClass(@NotNull ProtoBuf.Class proto, @NotNull NestedClassResolver nestedClassResolver) {
|
||||
return new DeserializedClassDescriptor(
|
||||
containingDeclaration, getNameResolver(), annotationDeserializer,
|
||||
storageManager, containingDeclaration, getNameResolver(), annotationDeserializer,
|
||||
typeDeserializer.getClassResolver(), nestedClassResolver, proto, typeDeserializer
|
||||
);
|
||||
}
|
||||
|
||||
+28
-24
@@ -16,6 +16,8 @@
|
||||
|
||||
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.*;
|
||||
@@ -67,6 +69,7 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
|
||||
private final InnerClassesScopeWrapper innerClassesScope;
|
||||
|
||||
public DeserializedClassDescriptor(
|
||||
@NotNull StorageManager storageManager,
|
||||
@NotNull DeclarationDescriptor containingDeclaration,
|
||||
@NotNull NameResolver nameResolver,
|
||||
@NotNull AnnotationDeserializer annotationResolver,
|
||||
@@ -98,35 +101,34 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
|
||||
this.isInner = Flags.INNER.get(flags);
|
||||
|
||||
this.annotationDeserializer = annotationResolver;
|
||||
this.annotations = new NotNullLazyValueImpl<List<AnnotationDescriptor>>() {
|
||||
@NotNull
|
||||
this.annotations = storageManager.createLazyValue(new Computable<List<AnnotationDescriptor>>() {
|
||||
@Override
|
||||
protected List<AnnotationDescriptor> doCompute() {
|
||||
public List<AnnotationDescriptor> compute() {
|
||||
return computeAnnotations();
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
this.primaryConstructor = new NullableLazyValueImpl<ConstructorDescriptor>() {
|
||||
this.primaryConstructor = storageManager.createNullableLazyValue(new Computable<ConstructorDescriptor>() {
|
||||
@Override
|
||||
protected ConstructorDescriptor doCompute() {
|
||||
public ConstructorDescriptor compute() {
|
||||
return computePrimaryConstructor();
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
this.nestedClassResolver = _nestedClassResolver;
|
||||
this.classObjectDescriptor = new NullableLazyValueImpl<ClassDescriptor>() {
|
||||
this.classObjectDescriptor = storageManager.createNullableLazyValue(new Computable<ClassDescriptor>() {
|
||||
@Override
|
||||
protected ClassDescriptor doCompute() {
|
||||
public ClassDescriptor compute() {
|
||||
return computeClassObjectDecriptor();
|
||||
}
|
||||
};
|
||||
this.nestedClasses = new NestedClassDescriptors(stringSet(classProto.getNestedClassNamesList(), nameResolver)) {
|
||||
});
|
||||
this.nestedClasses = new NestedClassDescriptors(storageManager, stringSet(classProto.getNestedClassNamesList(), nameResolver)) {
|
||||
@Override
|
||||
protected ClassDescriptor resolveNestedClass(@NotNull Name name) {
|
||||
return nestedClassResolver.resolveNestedClass(DeserializedClassDescriptor.this, name);
|
||||
}
|
||||
};
|
||||
this.nestedObjects = new NestedClassDescriptors(stringSet(classProto.getNestedObjectNamesList(), nameResolver)) {
|
||||
this.nestedObjects = new NestedClassDescriptors(storageManager, stringSet(classProto.getNestedObjectNamesList(), nameResolver)) {
|
||||
@Override
|
||||
protected ClassDescriptor resolveNestedClass(@NotNull Name name) {
|
||||
return nestedClassResolver.resolveNestedClass(DeserializedClassDescriptor.this, name);
|
||||
@@ -404,7 +406,7 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
|
||||
@Nullable
|
||||
@Override
|
||||
protected ClassifierDescriptor getClassDescriptor(@NotNull Name name) {
|
||||
return classDescriptor.nestedClasses.fun(name);
|
||||
return classDescriptor.nestedClasses.findClass.fun(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -415,7 +417,7 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
|
||||
@Nullable
|
||||
@Override
|
||||
public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
|
||||
return classDescriptor.nestedObjects.fun(name);
|
||||
return classDescriptor.nestedObjects.findClass.fun(name);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -425,19 +427,21 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
|
||||
}
|
||||
}
|
||||
|
||||
private abstract static class NestedClassDescriptors extends MemoizedFunctionToNullableImpl<Name, ClassDescriptor> {
|
||||
private abstract static class NestedClassDescriptors {
|
||||
private final Set<String> declaredNames;
|
||||
private final MemoizedFunctionToNullable<Name, ClassDescriptor> findClass;
|
||||
|
||||
public NestedClassDescriptors(@NotNull Set<String> declaredNames) {
|
||||
public NestedClassDescriptors(@NotNull StorageManager storageManager, @NotNull Set<String> declaredNames) {
|
||||
this.declaredNames = declaredNames;
|
||||
}
|
||||
this.findClass = storageManager.createMemoizedFunctionWithNullableValues(new Function<Name, ClassDescriptor>() {
|
||||
@Override
|
||||
public ClassDescriptor fun(Name name) {
|
||||
NestedClassDescriptors _this = NestedClassDescriptors.this;
|
||||
if (!_this.declaredNames.contains(name.asString())) return null;
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
protected final ClassDescriptor doCompute(@NotNull Name name) {
|
||||
if (!declaredNames.contains(name.asString())) return null;
|
||||
|
||||
return resolveNestedClass(name);
|
||||
return resolveNestedClass(name);
|
||||
}
|
||||
}, StorageManager.ReferenceKind.STRONG);
|
||||
}
|
||||
|
||||
protected abstract ClassDescriptor resolveNestedClass(@NotNull Name name);
|
||||
@@ -446,7 +450,7 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
|
||||
public Collection<ClassDescriptor> getAllDescriptors() {
|
||||
Collection<ClassDescriptor> result = new ArrayList<ClassDescriptor>(declaredNames.size());
|
||||
for (String name : declaredNames) {
|
||||
ClassDescriptor descriptor = fun(Name.identifier(name));
|
||||
ClassDescriptor descriptor = findClass.fun(Name.identifier(name));
|
||||
if (descriptor != null) {
|
||||
result.add(descriptor);
|
||||
}
|
||||
|
||||
+4
-2
@@ -11,8 +11,10 @@ import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.impl.AbstractNamespaceDescriptorImpl;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.storage.LockBasedStorageManager;
|
||||
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.StorageManager;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||
@@ -34,12 +36,12 @@ class BuiltinsNamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl {
|
||||
public BuiltinsNamespaceDescriptorImpl(@NotNull NamespaceDescriptor containingDeclaration) {
|
||||
super(containingDeclaration, Collections.<AnnotationDescriptor>emptyList(), KotlinBuiltIns.BUILT_INS_PACKAGE_NAME);
|
||||
|
||||
|
||||
StorageManager storageManager = new LockBasedStorageManager();
|
||||
try {
|
||||
nameResolver =
|
||||
NameSerializationUtil.deserializeNameResolver(getStream(BuiltInsSerializationUtil.getNameTableFilePath(this)));
|
||||
|
||||
ClassResolver classResolver = new AbstractClassResolver(AnnotationDeserializer.UNSUPPORTED) {
|
||||
ClassResolver classResolver = new AbstractClassResolver(storageManager, AnnotationDeserializer.UNSUPPORTED) {
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
|
||||
+2
-1
@@ -41,6 +41,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaToKotlinClassMap;
|
||||
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.KotlinTestWithEnvironment;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.LazyResolveTestUtil;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.storage.LockBasedStorageManager;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullable;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullableImpl;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
@@ -398,7 +399,7 @@ public abstract class AbstractDescriptorSerializationTest extends KotlinTestWith
|
||||
};
|
||||
|
||||
NameResolver nameResolver = new NameResolver(classMetadata.simpleNames, classMetadata.qualifiedNames);
|
||||
return new DeserializedClassDescriptor(containingDeclaration, nameResolver, DUMMY_ANNOTATION_DESERIALIZER,
|
||||
return new DeserializedClassDescriptor(new LockBasedStorageManager(), containingDeclaration, nameResolver, DUMMY_ANNOTATION_DESERIALIZER,
|
||||
this, nestedClassResolver, classMetadata.classProto, null);
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -33,6 +33,7 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration;
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaToKotlinClassMap;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.KotlinTestWithEnvironment;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.storage.LockBasedStorageManager;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||
@@ -98,7 +99,7 @@ public class BuiltinsDeserializationTest extends KotlinTestWithEnvironment {
|
||||
|
||||
final NameResolver nameResolver = NameSerializationUtil.createNameResolver(serializer.getNameTable());
|
||||
|
||||
ClassResolver classResolver = new AbstractClassResolver(AnnotationDeserializer.UNSUPPORTED) {
|
||||
ClassResolver classResolver = new AbstractClassResolver(new LockBasedStorageManager(), AnnotationDeserializer.UNSUPPORTED) {
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user