PackageMemberDeclarationProvider introduced

This commit is contained in:
Andrey Breslav
2012-06-05 16:32:20 +04:00
parent 42c29da718
commit e5e3bc0ee5
9 changed files with 38 additions and 18 deletions
@@ -40,6 +40,4 @@ public interface DeclarationProvider {
@Nullable @Nullable
JetClassOrObject getClassOrObjectDeclaration(@NotNull Name name); JetClassOrObject getClassOrObjectDeclaration(@NotNull Name name);
boolean isPackageDeclared(@NotNull Name name);
} }
@@ -29,5 +29,5 @@ public interface DeclarationProviderFactory {
ClassMemberDeclarationProvider getClassMemberDeclarationProvider(@NotNull JetClassOrObject jetClassOrObject); ClassMemberDeclarationProvider getClassMemberDeclarationProvider(@NotNull JetClassOrObject jetClassOrObject);
@Nullable @Nullable
DeclarationProvider getPackageMemberDeclarationProvider(@NotNull FqName packageFqName); PackageMemberDeclarationProvider getPackageMemberDeclarationProvider(@NotNull FqName packageFqName);
} }
@@ -39,7 +39,7 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF
private final Multimap<FqName, JetFile> filesByPackage = HashMultimap.create(); private final Multimap<FqName, JetFile> filesByPackage = HashMultimap.create();
private final Set<FqName> definedPackages = Sets.newHashSet(); private final Set<FqName> definedPackages = Sets.newHashSet();
private final Map<FqName, DeclarationProvider> packageDeclarationProviders = Maps.newHashMap(); private final Map<FqName, PackageMemberDeclarationProvider> packageDeclarationProviders = Maps.newHashMap();
private final Map<JetClassOrObject, ClassMemberDeclarationProvider> classMemberDeclarationProviders = Maps.newHashMap(); private final Map<JetClassOrObject, ClassMemberDeclarationProvider> classMemberDeclarationProviders = Maps.newHashMap();
private boolean indexed = false; private boolean indexed = false;
@@ -77,10 +77,10 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF
} }
@Override @Override
public DeclarationProvider getPackageMemberDeclarationProvider(@NotNull FqName packageFqName) { public PackageMemberDeclarationProvider getPackageMemberDeclarationProvider(@NotNull FqName packageFqName) {
createIndex(); createIndex();
DeclarationProvider declarationProvider = packageDeclarationProviders.get(packageFqName); PackageMemberDeclarationProvider declarationProvider = packageDeclarationProviders.get(packageFqName);
if (declarationProvider != null) { if (declarationProvider != null) {
return declarationProvider; return declarationProvider;
} }
@@ -26,7 +26,7 @@ import java.util.Collection;
/** /**
* @author abreslav * @author abreslav
*/ */
public class FileBasedPackageMemberDeclarationProvider extends AbstractPsiBasedDeclarationProvider { public class FileBasedPackageMemberDeclarationProvider extends AbstractPsiBasedDeclarationProvider implements PackageMemberDeclarationProvider {
private final FqName fqName; private final FqName fqName;
private final FileBasedDeclarationProviderFactory factory; private final FileBasedDeclarationProviderFactory factory;
@@ -38,7 +38,7 @@ public class LazyPackageDescriptor extends AbstractNamespaceDescriptorImpl imple
@NotNull NamespaceDescriptorParent containingDeclaration, @NotNull NamespaceDescriptorParent containingDeclaration,
@NotNull Name name, @NotNull Name name,
@NotNull ResolveSession resolveSession, @NotNull ResolveSession resolveSession,
@NotNull DeclarationProvider declarationProvider @NotNull PackageMemberDeclarationProvider declarationProvider
) { ) {
super(containingDeclaration, Collections.<AnnotationDescriptor>emptyList(), name); super(containingDeclaration, Collections.<AnnotationDescriptor>emptyList(), name);
this.memberScope = new LazyPackageMemberScope(resolveSession, declarationProvider, this); this.memberScope = new LazyPackageMemberScope(resolveSession, declarationProvider, this);
@@ -34,12 +34,12 @@ import java.util.Set;
/** /**
* @author abreslav * @author abreslav
*/ */
public class LazyPackageMemberScope extends AbstractLazyMemberScope<NamespaceDescriptor, DeclarationProvider> { public class LazyPackageMemberScope extends AbstractLazyMemberScope<NamespaceDescriptor, PackageMemberDeclarationProvider> {
private final Map<Name, NamespaceDescriptor> packageDescriptors = Maps.newHashMap(); private final Map<Name, NamespaceDescriptor> packageDescriptors = Maps.newHashMap();
public LazyPackageMemberScope(@NotNull ResolveSession resolveSession, public LazyPackageMemberScope(@NotNull ResolveSession resolveSession,
@NotNull DeclarationProvider declarationProvider, @NotNull PackageMemberDeclarationProvider declarationProvider,
@NotNull NamespaceDescriptor thisPackage) { @NotNull NamespaceDescriptor thisPackage) {
super(resolveSession, declarationProvider, thisPackage); super(resolveSession, declarationProvider, thisPackage);
} }
@@ -52,7 +52,7 @@ public class LazyPackageMemberScope extends AbstractLazyMemberScope<NamespaceDes
if (!declarationProvider.isPackageDeclared(name)) return null; if (!declarationProvider.isPackageDeclared(name)) return null;
DeclarationProvider packageMemberDeclarationProvider = resolveSession.getDeclarationProviderFactory().getPackageMemberDeclarationProvider( PackageMemberDeclarationProvider packageMemberDeclarationProvider = resolveSession.getDeclarationProviderFactory().getPackageMemberDeclarationProvider(
DescriptorUtils.getFQName(thisDescriptor).child(name).toSafe()); DescriptorUtils.getFQName(thisDescriptor).child(name).toSafe());
assert packageMemberDeclarationProvider != null : "Package is declared, but declaration provider is not found: " + name; assert packageMemberDeclarationProvider != null : "Package is declared, but declaration provider is not found: " + name;
NamespaceDescriptor namespaceDescriptor = new LazyPackageDescriptor(thisDescriptor, name, resolveSession, packageMemberDeclarationProvider); NamespaceDescriptor namespaceDescriptor = new LazyPackageDescriptor(thisDescriptor, name, resolveSession, packageMemberDeclarationProvider);
@@ -0,0 +1,28 @@
/*
* Copyright 2010-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.resolve.lazy;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.name.Name;
/**
* @author abreslav
*/
public interface PackageMemberDeclarationProvider extends DeclarationProvider {
boolean isPackageDeclared(@NotNull Name name);
}
@@ -20,7 +20,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetClassObject; import org.jetbrains.jet.lang.psi.JetClassObject;
import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.resolve.name.Name;
/** /**
* @author abreslav * @author abreslav
@@ -57,9 +56,4 @@ public class PsiBasedClassMemberDeclarationProvider extends AbstractPsiBasedDecl
createIndex(); createIndex();
return jetClassObject; return jetClassObject;
} }
@Override
public boolean isPackageDeclared(@NotNull Name name) {
throw new UnsupportedOperationException("Shouldn't be called on a ClassMemberDeclarationProvider");
}
} }
@@ -59,7 +59,7 @@ public class ResolveSession {
) { ) {
this.injector = new InjectorForLazyResolve(project, this, trace); this.injector = new InjectorForLazyResolve(project, this, trace);
this.module = rootDescriptor; this.module = rootDescriptor;
DeclarationProvider provider = declarationProviderFactory.getPackageMemberDeclarationProvider(FqName.ROOT); PackageMemberDeclarationProvider provider = declarationProviderFactory.getPackageMemberDeclarationProvider(FqName.ROOT);
assert provider != null : "No declaration provider for root package in " + rootDescriptor; assert provider != null : "No declaration provider for root package in " + rootDescriptor;
this.rootPackage = new LazyPackageDescriptor(rootDescriptor, FqNameUnsafe.ROOT_NAME, this, provider); this.rootPackage = new LazyPackageDescriptor(rootDescriptor, FqNameUnsafe.ROOT_NAME, this, provider);
rootDescriptor.setRootNamespace(rootPackage); rootDescriptor.setRootNamespace(rootPackage);