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