use the power of DescriptorPredicate in completion

This commit is contained in:
Stepan Koltsov
2012-06-16 06:44:17 +04:00
parent 010db0495b
commit 65b74a19b4
8 changed files with 139 additions and 46 deletions
@@ -128,9 +128,9 @@ public abstract class DescriptorPredicate {
private static class HasName extends DescriptorPredicate {
@NotNull
private final Name required;
private final NamePredicate required;
private HasName(@NotNull Name required) {
private HasName(@NotNull NamePredicate required) {
this.required = required;
}
@@ -151,18 +151,24 @@ public abstract class DescriptorPredicate {
@Override
public boolean includeName(@NotNull Name name) {
return required.equals(name);
return required.matches(name);
}
}
public static DescriptorPredicate hasName(@NotNull Name name) {
return new HasName(name);
public static DescriptorPredicate hasName(@NotNull NamePredicate required) {
return new HasName(required);
}
private static class CallableMembers extends DescriptorPredicate {
public static final CallableMembers instance = new CallableMembers();
private static class MembersOfType extends DescriptorPredicate {
@NotNull
private final DescriptorKind required;
private MembersOfType(@NotNull DescriptorKind required) {
this.required = required;
}
@Override
public boolean includeName(@NotNull Name name) {
@@ -176,24 +182,71 @@ public abstract class DescriptorPredicate {
@Override
public boolean include(@NotNull DeclarationDescriptor descriptor) {
return descriptor instanceof CallableMemberDescriptor;
return descriptorKind(descriptor) == required;
}
@Override
public boolean includeKind(@NotNull DescriptorKind kind) {
return kind == DescriptorKind.CALLABLE_MEMBER;
return kind == required;
}
}
private static final DescriptorPredicate callableMembers = new MembersOfType(DescriptorKind.CALLABLE_MEMBER);
public static DescriptorPredicate callableMembers() {
return CallableMembers.instance;
return callableMembers;
}
private static final DescriptorPredicate namespaces = new MembersOfType(DescriptorKind.NAMESPACE);
public static DescriptorPredicate namespaces() {
return namespaces;
}
private static class Extension extends CallableMembers {
private static class MembersOrTypeWithName extends MembersOfType {
@NotNull
private final NamePredicate required;
private MembersOrTypeWithName(@NotNull DescriptorKind descriptorKind, @NotNull NamePredicate required) {
super(descriptorKind);
this.required = required;
}
@Override
public boolean includeName(@NotNull Name name) {
return required.matches(name);
}
}
public static DescriptorPredicate callableMembers(@NotNull NamePredicate required) {
if (required.isAll()) {
return callableMembers();
}
else {
return new MembersOrTypeWithName(DescriptorKind.CALLABLE_MEMBER, required);
}
}
public static DescriptorPredicate namespaces(@NotNull NamePredicate required) {
if (required.isAll()) {
return namespaces();
}
else {
return new MembersOrTypeWithName(DescriptorKind.NAMESPACE, required);
}
}
private static class Extension extends MembersOfType {
private static final Extension instance = new Extension();
private Extension() {
super(DescriptorKind.CALLABLE_MEMBER);
}
@Override
public boolean includeExtension(boolean extension) {
return extension;
@@ -205,6 +258,31 @@ public abstract class DescriptorPredicate {
}
private static class ExtensionWithName extends Extension {
@NotNull
private final NamePredicate required;
private ExtensionWithName(@NotNull NamePredicate required) {
this.required = required;
}
@Override
public boolean includeName(@NotNull Name name) {
return required.matches(name);
}
}
public static DescriptorPredicate extension(@NotNull NamePredicate required) {
if (required.isAll()) {
return extension();
}
else {
return new ExtensionWithName(required);
}
}
public Predicate<DeclarationDescriptor> asGuavaPredicate() {
return new Predicate<DeclarationDescriptor>() {
@Override
@@ -158,7 +158,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
if (!allDescriptorsDone) {
if (!predicate.includeAll()) {
// super-optimized version
return concat(allDescriptors, getInheritedDescriptors(predicate));
return concat(DescriptorPredicateUtils.filter(allDescriptors, predicate), getInheritedDescriptors(predicate));
}
allDescriptorsDone = true;