Include subpackages and fake overrides into allDescriptors

This commit is contained in:
Andrey Breslav
2012-06-06 22:10:35 +04:00
parent 5a22f43131
commit acee1f5df1
7 changed files with 72 additions and 9 deletions
@@ -44,7 +44,7 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
private final Map<Name, Set<FunctionDescriptor>> functionDescriptors = Maps.newHashMap(); private final Map<Name, Set<FunctionDescriptor>> functionDescriptors = Maps.newHashMap();
private final Map<Name, Set<VariableDescriptor>> propertyDescriptors = Maps.newHashMap(); private final Map<Name, Set<VariableDescriptor>> propertyDescriptors = Maps.newHashMap();
private final List<DeclarationDescriptor> allDescriptors = Lists.newArrayList(); protected final List<DeclarationDescriptor> allDescriptors = Lists.newArrayList();
protected AbstractLazyMemberScope( protected AbstractLazyMemberScope(
@NotNull ResolveSession resolveSession, @NotNull ResolveSession resolveSession,
@@ -200,10 +200,13 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
throw new IllegalArgumentException("Unsupported declaration kind: " + declaration); throw new IllegalArgumentException("Unsupported declaration kind: " + declaration);
} }
} }
addExtraDescriptors();
allDescriptorsComputed = true; allDescriptorsComputed = true;
return allDescriptors; return allDescriptors;
} }
protected abstract void addExtraDescriptors();
@Override @Override
public void getImplicitReceiversHierarchy(@NotNull List<ReceiverDescriptor> result) { public void getImplicitReceiversHierarchy(@NotNull List<ReceiverDescriptor> result) {
ReceiverDescriptor receiver = getImplicitReceiver(); ReceiverDescriptor receiver = getImplicitReceiver();
@@ -16,10 +16,8 @@
package org.jetbrains.jet.lang.resolve.lazy; package org.jetbrains.jet.lang.resolve.lazy;
import com.google.common.collect.HashMultimap; import com.google.common.base.Predicate;
import com.google.common.collect.Maps; import com.google.common.collect.*;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
@@ -38,7 +36,7 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF
private final Collection<JetFile> allFiles; private final Collection<JetFile> allFiles;
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> declaredPackages = Sets.newHashSet();
private final Map<FqName, PackageMemberDeclarationProvider> 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();
@@ -65,7 +63,7 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF
} }
private void addMeAndParentPackages(@NotNull FqName name) { private void addMeAndParentPackages(@NotNull FqName name) {
definedPackages.add(name); declaredPackages.add(name);
if (!name.isRoot()) { if (!name.isRoot()) {
addMeAndParentPackages(name.parent()); addMeAndParentPackages(name.parent());
} }
@@ -73,7 +71,16 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF
/*package*/ boolean isPackageDeclared(@NotNull FqName packageFqName) { /*package*/ boolean isPackageDeclared(@NotNull FqName packageFqName) {
createIndex(); createIndex();
return definedPackages.contains(packageFqName); return declaredPackages.contains(packageFqName);
}
/*package*/ Collection<FqName> getAllDeclaredSubPackagesOf(@NotNull final FqName parent) {
return Collections2.filter(declaredPackages, new Predicate<FqName>() {
@Override
public boolean apply(FqName fqName) {
return !fqName.isRoot() && fqName.parent().equals(parent);
}
});
} }
@Override @Override
@@ -31,6 +31,7 @@ public class FileBasedPackageMemberDeclarationProvider extends AbstractPsiBasedD
private final FqName fqName; private final FqName fqName;
private final FileBasedDeclarationProviderFactory factory; private final FileBasedDeclarationProviderFactory factory;
private final Collection<JetFile> allFiles; private final Collection<JetFile> allFiles;
private Collection<FqName> allDeclaredPackages;
/*package*/ FileBasedPackageMemberDeclarationProvider( /*package*/ FileBasedPackageMemberDeclarationProvider(
@@ -56,4 +57,12 @@ public class FileBasedPackageMemberDeclarationProvider extends AbstractPsiBasedD
public boolean isPackageDeclared(@NotNull Name name) { public boolean isPackageDeclared(@NotNull Name name) {
return factory.isPackageDeclared(fqName.child(name)); return factory.isPackageDeclared(fqName.child(name));
} }
@Override
public Collection<FqName> getAllDeclaredPackages() {
if (allDeclaredPackages == null) {
allDeclaredPackages = factory.getAllDeclaredSubPackagesOf(fqName);
}
return allDeclaredPackages;
}
} }
@@ -75,7 +75,9 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
@Override @Override
public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) { public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
assert fakeOverride instanceof FunctionDescriptor : "A non-function overrides a function"; assert fakeOverride instanceof FunctionDescriptor : "A non-function overrides a function";
result.add((FunctionDescriptor) fakeOverride); FunctionDescriptor functionDescriptor = (FunctionDescriptor) fakeOverride;
result.add(functionDescriptor);
allDescriptors.add(functionDescriptor);
} }
@Override @Override
@@ -100,6 +102,21 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
throw new UnsupportedOperationException(); // TODO throw new UnsupportedOperationException(); // TODO
} }
@Override
protected void addExtraDescriptors() {
for (JetType supertype : thisDescriptor.getTypeConstructor().getSupertypes()) {
for (DeclarationDescriptor descriptor : supertype.getMemberScope().getAllDescriptors()) {
if (descriptor instanceof FunctionDescriptor) {
getFunctions(descriptor.getName());
}
else if (descriptor instanceof PropertyDescriptor) {
getProperties(descriptor.getName());
}
// Nothing else is inherited
}
}
}
@Override @Override
public NamespaceDescriptor getNamespace(@NotNull Name name) { public NamespaceDescriptor getNamespace(@NotNull Name name) {
return null; return null;
@@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
@@ -58,6 +59,7 @@ public class LazyPackageMemberScope extends AbstractLazyMemberScope<NamespaceDes
NamespaceDescriptor namespaceDescriptor = new LazyPackageDescriptor(thisDescriptor, name, resolveSession, packageMemberDeclarationProvider); NamespaceDescriptor namespaceDescriptor = new LazyPackageDescriptor(thisDescriptor, name, resolveSession, packageMemberDeclarationProvider);
packageDescriptors.put(name, namespaceDescriptor); packageDescriptors.put(name, namespaceDescriptor);
allDescriptors.add(namespaceDescriptor);
return namespaceDescriptor; return namespaceDescriptor;
} }
@@ -84,4 +86,11 @@ public class LazyPackageMemberScope extends AbstractLazyMemberScope<NamespaceDes
protected void getNonDeclaredProperties(@NotNull Name name, @NotNull Set<VariableDescriptor> result) { protected void getNonDeclaredProperties(@NotNull Name name, @NotNull Set<VariableDescriptor> result) {
// No extra properties // No extra properties
} }
@Override
protected void addExtraDescriptors() {
for (FqName packageFqName : declarationProvider.getAllDeclaredPackages()) {
getNamespace(packageFqName.shortName());
}
}
} }
@@ -17,12 +17,17 @@
package org.jetbrains.jet.lang.resolve.lazy; package org.jetbrains.jet.lang.resolve.lazy;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.Collection;
/** /**
* @author abreslav * @author abreslav
*/ */
public interface PackageMemberDeclarationProvider extends DeclarationProvider { public interface PackageMemberDeclarationProvider extends DeclarationProvider {
boolean isPackageDeclared(@NotNull Name name); boolean isPackageDeclared(@NotNull Name name);
Collection<FqName> getAllDeclaredPackages();
} }
@@ -94,6 +94,19 @@ public class NamespaceComparator {
else if (ad instanceof FunctionDescriptor) { else if (ad instanceof FunctionDescriptor) {
functionNames.add(ad.getName()); functionNames.add(ad.getName());
} }
else if (ad instanceof NamespaceDescriptor) {
NamespaceDescriptor namespaceDescriptorA = (NamespaceDescriptor) ad;
NamespaceDescriptor namespaceDescriptorB = nsb.getMemberScope().getNamespace(namespaceDescriptorA.getName());
//Assert.assertNotNull("Namespace not found: " + namespaceDescriptorA.getQualifiedName(), namespaceDescriptorB);
if (namespaceDescriptorB == null) {
System.err.println("Namespace not found: " + namespaceDescriptorA.getQualifiedName());
}
else {
sb.append("// <namespace name=\"" + namespaceDescriptorA.getName() + "\">\n");
sb.append(doCompareNamespaces(namespaceDescriptorA, namespaceDescriptorB));
sb.append("// </namespace name=\"" + namespaceDescriptorA.getName() + "\">\n");
}
}
else { else {
throw new AssertionError("unknown member: " + ad); throw new AssertionError("unknown member: " + ad);
} }