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.lang.descriptors.impl;
018    
019    import org.jetbrains.annotations.NotNull;
020    import org.jetbrains.jet.lang.descriptors.*;
021    import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
022    import org.jetbrains.jet.lang.resolve.DescriptorUtils;
023    import org.jetbrains.jet.lang.resolve.name.FqName;
024    import org.jetbrains.jet.lang.resolve.name.Name;
025    import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
026    
027    import java.util.List;
028    
029    public class NamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl {
030    
031        private WritableScope memberScope;
032    
033        public NamespaceDescriptorImpl(@NotNull NamespaceDescriptorParent containingDeclaration,
034                                       @NotNull List<AnnotationDescriptor> annotations,
035                                       @NotNull Name name) {
036            super(containingDeclaration, annotations, name);
037        }
038    
039        public void initialize(@NotNull WritableScope memberScope) {
040            if (this.memberScope != null) {
041                throw new IllegalStateException("Namespace member scope reinitialize");
042            }
043    
044            this.memberScope = memberScope;
045        }
046    
047        @Override
048        @NotNull
049        public WritableScope getMemberScope() {
050            return memberScope;
051        }
052    
053        @Override
054        public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
055            getMemberScope().addNamespace(namespaceDescriptor);
056        }
057    
058        @NotNull
059        @Override
060        public FqName getFqName() {
061            return DescriptorUtils.getFQName(this).toSafe();
062        }
063    
064        private NamespaceLikeBuilder builder = null;
065        public NamespaceLikeBuilder getBuilder() {
066            if (builder == null) {
067                builder = new NamespaceLikeBuilder() {
068                    @Override
069                    public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) {
070                        getMemberScope().addClassifierDescriptor(classDescriptor);
071                    }
072    
073                    @Override
074                    public void addObjectDescriptor(@NotNull MutableClassDescriptorLite objectDescriptor) {
075                        getMemberScope().addObjectDescriptor(objectDescriptor);
076                    }
077    
078                    @Override
079                    public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) {
080                        getMemberScope().addFunctionDescriptor(functionDescriptor);
081                    }
082    
083                    @Override
084                    public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) {
085                        getMemberScope().addPropertyDescriptor(propertyDescriptor);
086                    }
087    
088                    @NotNull
089                    @Override
090                    public DeclarationDescriptor getOwnerForChildren() {
091                        return NamespaceDescriptorImpl.this;
092                    }
093    
094                    @Override
095                    public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptorLite classObjectDescriptor) {
096                        throw new IllegalStateException("Must be guaranteed not to happen by the parser");
097                    }
098                };
099            }
100    
101            return builder;
102        }
103    }