From acee1f5df1283d9e02b2ef63a33ce396f7613862 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 6 Jun 2012 22:10:35 +0400 Subject: [PATCH] Include subpackages and fake overrides into allDescriptors --- .../resolve/lazy/AbstractLazyMemberScope.java | 5 ++++- .../FileBasedDeclarationProviderFactory.java | 21 ++++++++++++------- ...BasedPackageMemberDeclarationProvider.java | 9 ++++++++ .../resolve/lazy/LazyClassMemberScope.java | 19 ++++++++++++++++- .../resolve/lazy/LazyPackageMemberScope.java | 9 ++++++++ .../PackageMemberDeclarationProvider.java | 5 +++++ .../cli/jvm/compiler/NamespaceComparator.java | 13 ++++++++++++ 7 files changed, 72 insertions(+), 9 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java index 8afe5218f09..1a5d456e6bc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java @@ -44,7 +44,7 @@ public abstract class AbstractLazyMemberScope> functionDescriptors = Maps.newHashMap(); private final Map> propertyDescriptors = Maps.newHashMap(); - private final List allDescriptors = Lists.newArrayList(); + protected final List allDescriptors = Lists.newArrayList(); protected AbstractLazyMemberScope( @NotNull ResolveSession resolveSession, @@ -200,10 +200,13 @@ public abstract class AbstractLazyMemberScope result) { ReceiverDescriptor receiver = getImplicitReceiver(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedDeclarationProviderFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedDeclarationProviderFactory.java index 252d7119114..2837d94cdd4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedDeclarationProviderFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedDeclarationProviderFactory.java @@ -16,10 +16,8 @@ package org.jetbrains.jet.lang.resolve.lazy; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Maps; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; +import com.google.common.base.Predicate; +import com.google.common.collect.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetFile; @@ -38,7 +36,7 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF private final Collection allFiles; private final Multimap filesByPackage = HashMultimap.create(); - private final Set definedPackages = Sets.newHashSet(); + private final Set declaredPackages = Sets.newHashSet(); private final Map packageDeclarationProviders = Maps.newHashMap(); private final Map classMemberDeclarationProviders = Maps.newHashMap(); @@ -65,7 +63,7 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF } private void addMeAndParentPackages(@NotNull FqName name) { - definedPackages.add(name); + declaredPackages.add(name); if (!name.isRoot()) { addMeAndParentPackages(name.parent()); } @@ -73,7 +71,16 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF /*package*/ boolean isPackageDeclared(@NotNull FqName packageFqName) { createIndex(); - return definedPackages.contains(packageFqName); + return declaredPackages.contains(packageFqName); + } + + /*package*/ Collection getAllDeclaredSubPackagesOf(@NotNull final FqName parent) { + return Collections2.filter(declaredPackages, new Predicate() { + @Override + public boolean apply(FqName fqName) { + return !fqName.isRoot() && fqName.parent().equals(parent); + } + }); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedPackageMemberDeclarationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedPackageMemberDeclarationProvider.java index 8e9490037d4..c32c70e88a1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedPackageMemberDeclarationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedPackageMemberDeclarationProvider.java @@ -31,6 +31,7 @@ public class FileBasedPackageMemberDeclarationProvider extends AbstractPsiBasedD private final FqName fqName; private final FileBasedDeclarationProviderFactory factory; private final Collection allFiles; + private Collection allDeclaredPackages; /*package*/ FileBasedPackageMemberDeclarationProvider( @@ -56,4 +57,12 @@ public class FileBasedPackageMemberDeclarationProvider extends AbstractPsiBasedD public boolean isPackageDeclared(@NotNull Name name) { return factory.isPackageDeclared(fqName.child(name)); } + + @Override + public Collection getAllDeclaredPackages() { + if (allDeclaredPackages == null) { + allDeclaredPackages = factory.getAllDeclaredSubPackagesOf(fqName); + } + return allDeclaredPackages; + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java index 41fec808225..d80e42face7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java @@ -75,7 +75,9 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope result) { // No extra properties } + + @Override + protected void addExtraDescriptors() { + for (FqName packageFqName : declarationProvider.getAllDeclaredPackages()) { + getNamespace(packageFqName.shortName()); + } + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/PackageMemberDeclarationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/PackageMemberDeclarationProvider.java index 0283c20890d..db07c4c8484 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/PackageMemberDeclarationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/PackageMemberDeclarationProvider.java @@ -17,12 +17,17 @@ package org.jetbrains.jet.lang.resolve.lazy; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; +import java.util.Collection; + /** * @author abreslav */ public interface PackageMemberDeclarationProvider extends DeclarationProvider { boolean isPackageDeclared(@NotNull Name name); + + Collection getAllDeclaredPackages(); } diff --git a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java index 9fe2116c725..6b6ea8a0e48 100644 --- a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java +++ b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java @@ -94,6 +94,19 @@ public class NamespaceComparator { else if (ad instanceof FunctionDescriptor) { 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("// \n"); + sb.append(doCompareNamespaces(namespaceDescriptorA, namespaceDescriptorB)); + sb.append("// \n"); + } + } else { throw new AssertionError("unknown member: " + ad); }