001    /*
002     * Copyright 2010-2013 JetBrains s.r.o.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package org.jetbrains.jet.descriptors.serialization.descriptors;
018    
019    import org.jetbrains.annotations.NotNull;
020    import org.jetbrains.annotations.Nullable;
021    import org.jetbrains.jet.descriptors.serialization.*;
022    import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
023    import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
024    import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
025    import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
026    import org.jetbrains.jet.lang.resolve.name.FqName;
027    import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
028    import org.jetbrains.jet.lang.resolve.name.Name;
029    import org.jetbrains.jet.storage.StorageManager;
030    
031    import java.util.ArrayList;
032    import java.util.Collection;
033    import java.util.List;
034    
035    public class DeserializedPackageMemberScope extends DeserializedMemberScope {
036        private final DescriptorFinder descriptorFinder;
037    
038        private final FqName packageFqName;
039    
040        public DeserializedPackageMemberScope(
041                @NotNull StorageManager storageManager,
042                @NotNull PackageFragmentDescriptor packageDescriptor,
043                @NotNull Deserializers deserializers,
044                @NotNull MemberFilter memberFilter,
045                @NotNull DescriptorFinder descriptorFinder,
046                @NotNull ProtoBuf.Package proto,
047                @NotNull NameResolver nameResolver
048        ) {
049            super(storageManager, packageDescriptor,
050                  DescriptorDeserializer.create(storageManager, packageDescriptor, nameResolver, descriptorFinder, deserializers),
051                  getFilteredMembers(packageDescriptor, proto, memberFilter, nameResolver));
052            this.descriptorFinder = descriptorFinder;
053            this.packageFqName = packageDescriptor.getFqName();
054        }
055    
056        public DeserializedPackageMemberScope(
057                @NotNull StorageManager storageManager,
058                @NotNull PackageFragmentDescriptor packageDescriptor,
059                @NotNull Deserializers deserializers,
060                @NotNull MemberFilter memberFilter,
061                @NotNull DescriptorFinder descriptorFinder,
062                @NotNull PackageData packageData
063        ) {
064            this(storageManager, packageDescriptor, deserializers, memberFilter, descriptorFinder, packageData.getPackageProto(),
065                 packageData.getNameResolver());
066        }
067    
068        @Nullable
069        @Override
070        protected ClassDescriptor getClassDescriptor(@NotNull Name name) {
071            return descriptorFinder.findClass(new ClassId(packageFqName, FqNameUnsafe.topLevel(name)));
072        }
073    
074        @Override
075        protected void addAllClassDescriptors(@NotNull Collection<DeclarationDescriptor> result) {
076            for (Name className : descriptorFinder.getClassNames(packageFqName)) {
077                ClassDescriptor classDescriptor = getClassDescriptor(className);
078    
079                if (classDescriptor != null) {
080                    result.add(classDescriptor);
081                }
082            }
083        }
084    
085        @Override
086        protected void addNonDeclaredDescriptors(@NotNull Collection<DeclarationDescriptor> result) {
087            // Do nothing
088        }
089    
090        @Nullable
091        @Override
092        protected ReceiverParameterDescriptor getImplicitReceiver() {
093            return null;
094        }
095    
096        @NotNull
097        private static Collection<ProtoBuf.Callable> getFilteredMembers(
098                @NotNull PackageFragmentDescriptor packageDescriptor,
099                @NotNull ProtoBuf.Package packageProto,
100                @NotNull MemberFilter memberFilter,
101                @NotNull NameResolver nameResolver
102        ) {
103            List<ProtoBuf.Callable> result = new ArrayList<ProtoBuf.Callable>();
104            for (ProtoBuf.Callable member : packageProto.getMemberList()) {
105                if (memberFilter.acceptPackagePartClass(packageDescriptor, member, nameResolver)) {
106                    result.add(member);
107                }
108            }
109            return result;
110        }
111    }