From 010db0495b27b086908e92d8771a98491b05d266 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Sat, 16 Jun 2012 06:44:16 +0400 Subject: [PATCH] smarter JavaClassOrPackageScope#getAllDescriptors --- .../resolve/java/JavaClassOrPackageScope.java | 35 ++++++++++++++----- .../resolve/java/JavaDescriptorResolver.java | 8 ++--- .../resolve/scopes/DescriptorPredicate.java | 10 ++++++ 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassOrPackageScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassOrPackageScope.java index 1653b88aea6..499f4519304 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassOrPackageScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassOrPackageScope.java @@ -30,7 +30,6 @@ import org.jetbrains.jet.lang.resolve.scopes.DescriptorPredicateUtils; import org.jetbrains.jet.lang.resolve.scopes.JetScopeImpl; import java.util.Collection; -import java.util.Set; /** * @author Stepan Koltsov @@ -74,13 +73,28 @@ public abstract class JavaClassOrPackageScope extends JetScopeImpl { @Override public Collection getAllDescriptors(@NotNull DescriptorPredicate predicate) { if (allDescriptors == null) { - allDescriptors = Sets.newHashSet(); + if (!predicate.includeAll()) { + return computeAllDescriptors(predicate); + } - if (resolverScopeData.psiClass != null) { - allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveMethods(resolverScopeData, NamePredicate.all())); + allDescriptors = computeAllDescriptors(DescriptorPredicate.all()); + } - allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(resolverScopeData, NamePredicate.all())); + return DescriptorPredicateUtils.filter(allDescriptors, predicate); + } + private Collection computeAllDescriptors(@NotNull DescriptorPredicate predicate) { + Collection allDescriptors = Sets.newHashSet(); + + if (resolverScopeData.psiClass != null) { + if (predicate.includeKind(DescriptorPredicate.DescriptorKind.CALLABLE_MEMBER)) { + // TODO: filter by extension here + allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveMethods(resolverScopeData, predicate.asNamePredicate())); + + allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(resolverScopeData, predicate.asNamePredicate())); + } + + if (predicate.includeKind(DescriptorPredicate.DescriptorKind.CLASS)) { // TODO: Trying to hack the situation when we produce namespace descriptor for java class and still want to see inner classes if (getContainingDeclaration() instanceof JavaNamespaceDescriptor) { allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveInnerClasses( @@ -92,11 +106,13 @@ public abstract class JavaClassOrPackageScope extends JetScopeImpl { resolverScopeData.staticMembers)); } } + } - if (resolverScopeData.psiPackage != null) { - boolean isKotlinNamespace = semanticServices.getKotlinNamespaceDescriptor(resolverScopeData.fqName) != null; - final JavaDescriptorResolver descriptorResolver = semanticServices.getDescriptorResolver(); + if (resolverScopeData.psiPackage != null) { + boolean isKotlinNamespace = semanticServices.getKotlinNamespaceDescriptor(resolverScopeData.fqName) != null; + final JavaDescriptorResolver descriptorResolver = semanticServices.getDescriptorResolver(); + if (predicate.includeKind(DescriptorPredicate.DescriptorKind.NAMESPACE)) { for (PsiPackage psiSubPackage : resolverScopeData.psiPackage.getSubPackages()) { NamespaceDescriptor childNs = descriptorResolver.resolveNamespace( new FqName(psiSubPackage.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN); @@ -104,7 +120,9 @@ public abstract class JavaClassOrPackageScope extends JetScopeImpl { allDescriptors.add(childNs); } } + } + if (predicate.includeKind(DescriptorPredicate.DescriptorKind.CLASS)) { for (PsiClass psiClass : resolverScopeData.psiPackage.getClasses()) { if (isKotlinNamespace && JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) { continue; @@ -130,6 +148,7 @@ public abstract class JavaClassOrPackageScope extends JetScopeImpl { } } + // filter again, because previously filter wasn't accurate return DescriptorPredicateUtils.filter(allDescriptors, predicate); } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index e01158c9484..4ee648c3b73 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1424,7 +1424,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes } private void resolveNamedGroupFunctions(@NotNull ClassOrNamespaceDescriptor owner, PsiClass psiClass, - TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers, Name methodName, ResolverScopeData scopeData) { + TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers, @NotNull Name methodName, ResolverScopeData scopeData) { if (namedMembers.functionDescriptors != null) { return; } @@ -1464,7 +1464,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes namedMembers.functionDescriptors = functions; } - private Set getFunctionsFromSupertypes(ResolverScopeData scopeData, Name methodName) { + private Set getFunctionsFromSupertypes(ResolverScopeData scopeData, @NotNull Name methodName) { Set r = new HashSet(); for (JetType supertype : getSupertypes(scopeData)) { for (FunctionDescriptor function : supertype.getMemberScope().getFunctions(methodName)) { @@ -1705,7 +1705,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes new AbstractMap.SimpleEntry(exact, namedMembers)); } else { - return null; + return Collections.emptyList(); } } else { @@ -1714,7 +1714,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes Name methodName = e.getKey(); NamedMembers namedMembers = e.getValue(); if (predicate.matches(methodName)) { - r.add(new AbstractMap.SimpleEntry(exact, namedMembers)); + r.add(new AbstractMap.SimpleEntry(methodName, namedMembers)); } } return r; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/DescriptorPredicate.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/DescriptorPredicate.java index 295d7ece967..c1001099302 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/DescriptorPredicate.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/DescriptorPredicate.java @@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.resolve.name.Name; +import org.jetbrains.jet.lang.resolve.name.NamePredicate; /** * @author Stepan Koltsov @@ -213,4 +214,13 @@ public abstract class DescriptorPredicate { }; } + public NamePredicate asNamePredicate() { + return new NamePredicate() { + @Override + public boolean matches(@NotNull Name name) { + return includeName(name); + } + }; + } + }