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    }