001 package org.jetbrains.jet.descriptors.serialization.descriptors;
002
003 import org.jetbrains.annotations.NotNull;
004 import org.jetbrains.annotations.Nullable;
005 import org.jetbrains.jet.descriptors.serialization.*;
006 import org.jetbrains.jet.lang.descriptors.*;
007 import org.jetbrains.jet.lang.resolve.DescriptorUtils;
008 import org.jetbrains.jet.storage.StorageManager;
009 import org.jetbrains.jet.lang.resolve.name.FqName;
010 import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
011 import org.jetbrains.jet.lang.resolve.name.Name;
012
013 import java.util.ArrayList;
014 import java.util.Collection;
015
016 public class DeserializedPackageMemberScope extends DeserializedMemberScope {
017 private final DescriptorFinder descriptorFinder;
018
019 private final FqName packageFqName;
020
021 public DeserializedPackageMemberScope(
022 @NotNull StorageManager storageManager,
023 @NotNull NamespaceDescriptor packageDescriptor,
024 @NotNull AnnotationDeserializer annotationDeserializer,
025 @NotNull DescriptorFinder descriptorFinder,
026 @NotNull ProtoBuf.Package proto,
027 @NotNull NameResolver nameResolver
028 ) {
029 super(storageManager, packageDescriptor,
030 DescriptorDeserializer.create(storageManager, packageDescriptor, nameResolver, descriptorFinder, annotationDeserializer),
031 proto.getMemberList());
032 this.descriptorFinder = descriptorFinder;
033 this.packageFqName = DescriptorUtils.getFQName(packageDescriptor).toSafe();
034 }
035
036 public DeserializedPackageMemberScope(
037 @NotNull StorageManager storageManager,
038 @NotNull NamespaceDescriptor packageDescriptor,
039 @NotNull AnnotationDeserializer annotationDeserializer,
040 @NotNull DescriptorFinder descriptorFinder,
041 @NotNull PackageData packageData
042 ) {
043 this(storageManager, packageDescriptor, annotationDeserializer, descriptorFinder, packageData.getPackageProto(),
044 packageData.getNameResolver());
045 }
046
047 @Nullable
048 @Override
049 protected ClassifierDescriptor getClassDescriptor(@NotNull Name name) {
050 return findClassDescriptor(name, false);
051 }
052
053 @Nullable
054 @Override
055 public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
056 return findClassDescriptor(name, true);
057 }
058
059 @Nullable
060 private ClassDescriptor findClassDescriptor(Name name, boolean object) {
061 ClassDescriptor classDescriptor = descriptorFinder.findClass(new ClassId(packageFqName, FqNameUnsafe.topLevel(name)));
062 if (classDescriptor == null) {
063 return null;
064 }
065 return classDescriptor.getKind().isObject() == object ? classDescriptor : null;
066 }
067
068 @Override
069 protected void addAllClassDescriptors(@NotNull Collection<DeclarationDescriptor> result) {
070 findClassifiers(result, false);
071 }
072
073 @NotNull
074 @Override
075 protected Collection<ClassDescriptor> computeAllObjectDescriptors() {
076 return findClassifiers(new ArrayList<ClassDescriptor>(), true);
077 }
078
079 private <T extends Collection<? super ClassDescriptor>> T findClassifiers(T result, boolean object) {
080 for (Name className : descriptorFinder.getClassNames(packageFqName)) {
081 ClassDescriptor classDescriptor = findClassDescriptor(className, object);
082
083 if (classDescriptor != null) {
084 assert classDescriptor.getKind().isObject() == object;
085 result.add(classDescriptor);
086 }
087 }
088 return result;
089 }
090
091 @Override
092 protected void addNonDeclaredDescriptors(@NotNull Collection<DeclarationDescriptor> result) {
093 // Do nothing
094 }
095
096 @Nullable
097 @Override
098 public NamespaceDescriptor getNamespace(@NotNull Name name) {
099 return descriptorFinder.findPackage(packageFqName.child(name));
100 }
101
102 @Nullable
103 @Override
104 protected ReceiverParameterDescriptor getImplicitReceiver() {
105 return null;
106 }
107 }