diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/AbstractClassResolver.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/AbstractClassResolver.java index ea384686722..9b6a469809f 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/AbstractClassResolver.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/AbstractClassResolver.java @@ -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 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; diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java index 69e5b483e2a..d218af3d2e1 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java @@ -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 ); } diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java index da1f2757154..2fb20b3dc6a 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java @@ -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>() { - @NotNull + this.annotations = storageManager.createLazyValue(new Computable>() { @Override - protected List doCompute() { + public List compute() { return computeAnnotations(); } - }; + }); - this.primaryConstructor = new NullableLazyValueImpl() { + this.primaryConstructor = storageManager.createNullableLazyValue(new Computable() { @Override - protected ConstructorDescriptor doCompute() { + public ConstructorDescriptor compute() { return computePrimaryConstructor(); } - }; + }); this.nestedClassResolver = _nestedClassResolver; - this.classObjectDescriptor = new NullableLazyValueImpl() { + this.classObjectDescriptor = storageManager.createNullableLazyValue(new Computable() { @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 { + private abstract static class NestedClassDescriptors { private final Set declaredNames; + private final MemoizedFunctionToNullable findClass; - public NestedClassDescriptors(@NotNull Set declaredNames) { + public NestedClassDescriptors(@NotNull StorageManager storageManager, @NotNull Set declaredNames) { this.declaredNames = declaredNames; - } + this.findClass = storageManager.createMemoizedFunctionWithNullableValues(new Function() { + @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 getAllDescriptors() { Collection result = new ArrayList(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); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/BuiltinsNamespaceDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/BuiltinsNamespaceDescriptorImpl.java index 4afb8819612..b4779125981 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/BuiltinsNamespaceDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/BuiltinsNamespaceDescriptorImpl.java @@ -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.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 diff --git a/compiler/tests/org/jetbrains/jet/descriptors/serialization/AbstractDescriptorSerializationTest.java b/compiler/tests/org/jetbrains/jet/descriptors/serialization/AbstractDescriptorSerializationTest.java index 1c5509cb1f6..f0658199b86 100644 --- a/compiler/tests/org/jetbrains/jet/descriptors/serialization/AbstractDescriptorSerializationTest.java +++ b/compiler/tests/org/jetbrains/jet/descriptors/serialization/AbstractDescriptorSerializationTest.java @@ -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); } diff --git a/compiler/tests/org/jetbrains/jet/descriptors/serialization/BuiltinsDeserializationTest.java b/compiler/tests/org/jetbrains/jet/descriptors/serialization/BuiltinsDeserializationTest.java index d3d273c79ab..9d9fa1af35a 100644 --- a/compiler/tests/org/jetbrains/jet/descriptors/serialization/BuiltinsDeserializationTest.java +++ b/compiler/tests/org/jetbrains/jet/descriptors/serialization/BuiltinsDeserializationTest.java @@ -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