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.*;
023    import org.jetbrains.jet.lang.resolve.name.FqName;
024    import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
025    import org.jetbrains.jet.lang.resolve.name.Name;
026    import org.jetbrains.jet.storage.StorageManager;
027    
028    import java.util.Collection;
029    
030    public class DeserializedPackageMemberScope extends DeserializedMemberScope {
031        private final DescriptorFinder descriptorFinder;
032    
033        private final FqName packageFqName;
034    
035        public DeserializedPackageMemberScope(
036                @NotNull StorageManager storageManager,
037                @NotNull PackageFragmentDescriptor packageDescriptor,
038                @NotNull Deserializers deserializers,
039                @NotNull DescriptorFinder descriptorFinder,
040                @NotNull ProtoBuf.Package proto,
041                @NotNull NameResolver nameResolver
042        ) {
043            super(storageManager, packageDescriptor,
044                  DescriptorDeserializer.create(storageManager, packageDescriptor, nameResolver, descriptorFinder, deserializers),
045                  proto.getMemberList());
046            this.descriptorFinder = descriptorFinder;
047            this.packageFqName = packageDescriptor.getFqName();
048        }
049    
050        public DeserializedPackageMemberScope(
051                @NotNull StorageManager storageManager,
052                @NotNull PackageFragmentDescriptor packageDescriptor,
053                @NotNull Deserializers deserializers,
054                @NotNull DescriptorFinder descriptorFinder,
055                @NotNull PackageData packageData
056        ) {
057            this(storageManager, packageDescriptor, deserializers, descriptorFinder, packageData.getPackageProto(),
058                 packageData.getNameResolver());
059        }
060    
061        @Nullable
062        @Override
063        protected ClassDescriptor getClassDescriptor(@NotNull Name name) {
064            return descriptorFinder.findClass(new ClassId(packageFqName, FqNameUnsafe.topLevel(name)));
065        }
066    
067        @Override
068        protected void addAllClassDescriptors(@NotNull Collection<DeclarationDescriptor> result) {
069            for (Name className : descriptorFinder.getClassNames(packageFqName)) {
070                ClassDescriptor classDescriptor = getClassDescriptor(className);
071    
072                if (classDescriptor != null) {
073                    result.add(classDescriptor);
074                }
075            }
076        }
077    
078        @Override
079        protected void addNonDeclaredDescriptors(@NotNull Collection<DeclarationDescriptor> result) {
080            // Do nothing
081        }
082    
083        @Nullable
084        @Override
085        protected ReceiverParameterDescriptor getImplicitReceiver() {
086            return null;
087        }
088    }