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;
018    
019    import org.jetbrains.annotations.NotNull;
020    import org.jetbrains.annotations.Nullable;
021    import org.jetbrains.jet.lang.ModuleConfiguration;
022    import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
023    import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
024    import org.jetbrains.jet.lang.descriptors.impl.DeclarationDescriptorImpl;
025    import org.jetbrains.jet.lang.descriptors.impl.NamespaceDescriptorImpl;
026    import org.jetbrains.jet.lang.resolve.ImportPath;
027    import org.jetbrains.jet.lang.resolve.name.FqName;
028    import org.jetbrains.jet.lang.resolve.name.Name;
029    import org.jetbrains.jet.lang.types.TypeSubstitutor;
030    
031    import javax.inject.Inject;
032    import java.util.Collections;
033    import java.util.List;
034    
035    public class ModuleDescriptorImpl extends DeclarationDescriptorImpl implements ClassOrNamespaceDescriptor, ModuleDescriptor {
036        private NamespaceDescriptor rootNamepsace;
037        private ModuleConfiguration moduleConfiguration;
038        private final List<ImportPath> defaultImports;
039        private final PlatformToKotlinClassMap platformToKotlinClassMap;
040    
041        public ModuleDescriptorImpl(
042                @NotNull Name name,
043                @NotNull List<ImportPath> defaultImports,
044                @NotNull PlatformToKotlinClassMap platformToKotlinClassMap
045        ) {
046            super(Collections.<AnnotationDescriptor>emptyList(), name);
047            if (!name.isSpecial()) {
048                throw new IllegalArgumentException("module name must be special: " + name);
049            }
050            this.defaultImports = defaultImports;
051            this.platformToKotlinClassMap = platformToKotlinClassMap;
052        }
053    
054        public void setRootNamespace(@NotNull NamespaceDescriptor rootNs) {
055            if (this.rootNamepsace != null) {
056                throw new IllegalStateException("setRootNamespace() is called twice");
057            }
058            this.rootNamepsace = rootNs;
059        }
060    
061        @Override
062        @Nullable
063        public DeclarationDescriptor getContainingDeclaration() {
064            return null;
065        }
066    
067        @Nullable
068        @Override
069        public NamespaceDescriptor getNamespace(@NotNull FqName fqName) {
070            if (fqName.isRoot()) return rootNamepsace;
071            NamespaceDescriptor current = rootNamepsace;
072            for (Name simpleName : fqName.pathSegments()) {
073                current = current.getMemberScope().getNamespace(simpleName);
074                if (current == null) return null;
075            }
076            return current;
077        }
078    
079        @NotNull
080        @Override
081        public ModuleConfiguration getModuleConfiguration() {
082            return moduleConfiguration;
083        }
084    
085        @Inject
086        public ModuleDescriptorImpl setModuleConfiguration(@NotNull ModuleConfiguration moduleConfiguration) {
087            assert this.moduleConfiguration == null : "Trying to set module configuration twice for " + this;
088            this.moduleConfiguration = moduleConfiguration;
089            return this;
090        }
091    
092        @NotNull
093        @Override
094        public List<ImportPath> getDefaultImports() {
095            return defaultImports;
096        }
097    
098        @NotNull
099        @Override
100        public PlatformToKotlinClassMap getPlatformToKotlinClassMap() {
101            return platformToKotlinClassMap;
102        }
103    
104        public NamespaceDescriptorImpl getRootNamespaceDescriptorImpl() {
105            return (NamespaceDescriptorImpl) rootNamepsace;
106        }
107    
108        @NotNull
109        @Override
110        public ModuleDescriptor substitute(@NotNull TypeSubstitutor substitutor) {
111            return this;
112        }
113    
114        @Override
115        public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
116            return visitor.visitModuleDeclaration(this, data);
117        }
118    
119    
120        @Override
121        public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
122            if (namespaceDescriptor.getContainingDeclaration() != this) {
123                throw new IllegalStateException();
124            }
125            setRootNamespace(namespaceDescriptor);
126        }
127    
128    }