Include subpackages and fake overrides into allDescriptors
This commit is contained in:
+4
-1
@@ -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();
|
||||||
|
|||||||
+14
-7
@@ -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
|
||||||
|
|||||||
+9
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-1
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user