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 com.google.common.collect.Lists;
020 import com.google.common.collect.Maps;
021 import com.intellij.openapi.diagnostic.Logger;
022 import org.jetbrains.annotations.NotNull;
023 import org.jetbrains.annotations.Nullable;
024 import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
025 import org.jetbrains.jet.lang.descriptors.annotations.Annotations;
026 import org.jetbrains.jet.lang.descriptors.impl.CompositePackageFragmentProvider;
027 import org.jetbrains.jet.lang.descriptors.impl.DeclarationDescriptorImpl;
028 import org.jetbrains.jet.lang.descriptors.impl.PackageViewDescriptorImpl;
029 import org.jetbrains.jet.lang.resolve.ImportPath;
030 import org.jetbrains.jet.lang.resolve.name.FqName;
031 import org.jetbrains.jet.lang.resolve.name.Name;
032 import org.jetbrains.jet.lang.types.TypeSubstitutor;
033
034 import java.util.ArrayList;
035 import java.util.List;
036 import java.util.Map;
037
038 public class ModuleDescriptorImpl extends DeclarationDescriptorImpl implements ModuleDescriptor {
039 private static final Logger LOG = Logger.getInstance(ModuleDescriptorImpl.class);
040
041
042 private final Map<DependencyKind, List<PackageFragmentProvider>> prioritizedFragmentProviders = Maps.newHashMap();
043 private final List<PackageFragmentProvider> fragmentProviders = Lists.newArrayList();
044 private final CompositePackageFragmentProvider packageFragmentProvider = new CompositePackageFragmentProvider(fragmentProviders);
045 private final List<ImportPath> defaultImports;
046 private final PlatformToKotlinClassMap platformToKotlinClassMap;
047
048 public ModuleDescriptorImpl(
049 @NotNull Name name,
050 @NotNull List<ImportPath> defaultImports,
051 @NotNull PlatformToKotlinClassMap platformToKotlinClassMap
052 ) {
053 super(Annotations.EMPTY, name);
054 if (!name.isSpecial()) {
055 throw new IllegalArgumentException("module name must be special: " + name);
056 }
057 this.defaultImports = defaultImports;
058 this.platformToKotlinClassMap = platformToKotlinClassMap;
059 }
060
061 public void addFragmentProvider(@NotNull DependencyKind dependencyKind, @NotNull PackageFragmentProvider provider) {
062 if (fragmentProviders.contains(provider)) {
063 LOG.error("Trying to add already present fragment provider: " + provider);
064 }
065 List<PackageFragmentProvider> providers = prioritizedFragmentProviders.get(dependencyKind);
066 if (providers == null) {
067 providers = new ArrayList<PackageFragmentProvider>(1);
068 prioritizedFragmentProviders.put(dependencyKind, providers);
069 }
070 providers.add(provider);
071 buildProvidersList();
072 }
073
074 private void buildProvidersList() {
075 fragmentProviders.clear();
076 for (DependencyKind dependencyKind : DependencyKind.values()) {
077 List<PackageFragmentProvider> providers = prioritizedFragmentProviders.get(dependencyKind);
078 if (providers != null) {
079 fragmentProviders.addAll(providers);
080 }
081 }
082 }
083
084 @Override
085 @Nullable
086 public DeclarationDescriptor getContainingDeclaration() {
087 return null;
088 }
089
090 @NotNull
091 @Override
092 public PackageFragmentProvider getPackageFragmentProvider() {
093 return packageFragmentProvider;
094 }
095
096 @Nullable
097 @Override
098 public PackageViewDescriptor getPackage(@NotNull FqName fqName) {
099 List<PackageFragmentDescriptor> fragments = packageFragmentProvider.getPackageFragments(fqName);
100 return !fragments.isEmpty() ? new PackageViewDescriptorImpl(this, fqName, fragments) : null;
101 }
102
103 @NotNull
104 @Override
105 public List<ImportPath> getDefaultImports() {
106 return defaultImports;
107 }
108
109 @NotNull
110 @Override
111 public PlatformToKotlinClassMap getPlatformToKotlinClassMap() {
112 return platformToKotlinClassMap;
113 }
114
115 @NotNull
116 @Override
117 public ModuleDescriptor substitute(@NotNull TypeSubstitutor substitutor) {
118 return this;
119 }
120
121 @Override
122 public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
123 return visitor.visitModuleDeclaration(this, data);
124 }
125 }