001 package org.jetbrains.jet.lang.resolve;
002
003 import com.google.common.collect.Maps;
004 import com.intellij.util.containers.ContainerUtil;
005 import com.intellij.util.containers.MultiMap;
006 import org.jetbrains.annotations.NotNull;
007 import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
008 import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
009 import org.jetbrains.jet.lang.descriptors.PackageFragmentProvider;
010 import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor;
011 import org.jetbrains.jet.lang.resolve.name.FqName;
012
013 import java.util.Collection;
014 import java.util.List;
015 import java.util.Map;
016
017 public class MutablePackageFragmentProvider implements PackageFragmentProvider {
018 private final ModuleDescriptor module;
019
020 private final Map<FqName, MutablePackageFragmentDescriptor> fqNameToPackage = Maps.newHashMap();
021 private final MultiMap<FqName, FqName> subPackages = MultiMap.create();
022
023 public MutablePackageFragmentProvider(@NotNull ModuleDescriptor module) {
024 this.module = module;
025 fqNameToPackage.put(FqName.ROOT, new MutablePackageFragmentDescriptor(module, FqName.ROOT));
026 }
027
028 @NotNull
029 @Override
030 public List<PackageFragmentDescriptor> getPackageFragments(@NotNull FqName fqName) {
031 return ContainerUtil.<PackageFragmentDescriptor>createMaybeSingletonList(fqNameToPackage.get(fqName));
032 }
033
034 @NotNull
035 @Override
036 public Collection<FqName> getSubPackagesOf(@NotNull FqName fqName) {
037 return subPackages.get(fqName);
038 }
039
040 @NotNull
041 public MutablePackageFragmentDescriptor getOrCreateFragment(@NotNull FqName fqName) {
042 if (!fqNameToPackage.containsKey(fqName)) {
043 FqName parent = fqName.parent();
044 getOrCreateFragment(parent); // assure that parent exists
045
046 fqNameToPackage.put(fqName, new MutablePackageFragmentDescriptor(module, fqName));
047 subPackages.putValue(parent, fqName);
048 }
049
050 return fqNameToPackage.get(fqName);
051 }
052
053 @NotNull
054 public ModuleDescriptor getModule() {
055 return module;
056 }
057
058 @NotNull
059 public Collection<MutablePackageFragmentDescriptor> getAllFragments() {
060 return fqNameToPackage.values();
061 }
062 }