Revert "use the power of DescriptorPredicate in completion"

This reverts commit 65b74a19b4.
This commit is contained in:
Stepan Koltsov
2012-06-18 20:49:47 +04:00
parent efe550ee8f
commit 7deeb354a2
8 changed files with 46 additions and 139 deletions
@@ -32,9 +32,9 @@ import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.calls.autocasts.AutoCastServiceImpl;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.name.NamePredicate;
import org.jetbrains.jet.lang.resolve.scopes.DescriptorPredicate;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.JetScopeUtils;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
import org.jetbrains.jet.lang.types.JetType;
@@ -52,8 +52,7 @@ public final class TipsManager {
}
@NotNull
public static Collection<DeclarationDescriptor> getReferenceVariants(
JetSimpleNameExpression expression, BindingContext context, @NotNull NamePredicate name) {
public static Collection<DeclarationDescriptor> getReferenceVariants(JetSimpleNameExpression expression, BindingContext context) {
JetExpression receiverExpression = expression.getReceiverExpression();
if (receiverExpression != null) {
// Process as call expression
@@ -75,30 +74,32 @@ public final class TipsManager {
for (ReceiverDescriptor descriptor : variantsForExplicitReceiver) {
descriptors.addAll(includeExternalCallableExtensions(
excludePrivateDescriptors(descriptor.getType().getMemberScope().getAllDescriptors(DescriptorPredicate.hasName(name))),
resolutionScope, descriptor, name));
// TODO: better predicate
excludePrivateDescriptors(descriptor.getType().getMemberScope().getAllDescriptors(DescriptorPredicate.all())),
resolutionScope, descriptor));
}
return descriptors;
}
return includeExternalCallableExtensions(
excludePrivateDescriptors(expressionType.getMemberScope().getAllDescriptors(DescriptorPredicate.hasName(name))),
resolutionScope, new ExpressionReceiver(receiverExpression, expressionType), name);
// TODO: better predicate
excludePrivateDescriptors(expressionType.getMemberScope().getAllDescriptors(DescriptorPredicate.all())),
resolutionScope, new ExpressionReceiver(receiverExpression, expressionType));
}
return Collections.emptyList();
}
else {
return getVariantsNoReceiver(expression, context, name);
return getVariantsNoReceiver(expression, context);
}
}
public static Collection<DeclarationDescriptor> getVariantsNoReceiver(
JetExpression expression, BindingContext context, @NotNull NamePredicate name) {
public static Collection<DeclarationDescriptor> getVariantsNoReceiver(JetExpression expression, BindingContext context) {
JetScope resolutionScope = context.get(BindingContext.RESOLUTION_SCOPE, expression);
if (resolutionScope != null) {
if (expression.getParent() instanceof JetImportDirective || expression.getParent() instanceof JetNamespaceHeader) {
return resolutionScope.getAllDescriptors(DescriptorPredicate.namespaces(name));
// TODO: better predicate
return excludeNonPackageDescriptors(resolutionScope.getAllDescriptors(DescriptorPredicate.all()));
}
else {
Collection<DeclarationDescriptor> descriptorsSet = Sets.newHashSet();
@@ -108,11 +109,13 @@ public final class TipsManager {
for (ReceiverDescriptor receiverDescriptor : result) {
JetType receiverType = receiverDescriptor.getType();
descriptorsSet.addAll(receiverType.getMemberScope().getAllDescriptors(DescriptorPredicate.hasName(name)));
// TODO: better predicate
descriptorsSet.addAll(receiverType.getMemberScope().getAllDescriptors(DescriptorPredicate.all()));
}
descriptorsSet.addAll(resolutionScope.getAllDescriptors(DescriptorPredicate.hasName(name)));
return excludeNotCallableExtensions(excludePrivateDescriptors(descriptorsSet), resolutionScope, name);
// TODO: better predicate
descriptorsSet.addAll(resolutionScope.getAllDescriptors(DescriptorPredicate.all()));
return excludeNotCallableExtensions(excludePrivateDescriptors(descriptorsSet), resolutionScope);
}
}
return Collections.emptyList();
@@ -145,9 +148,7 @@ public final class TipsManager {
}
public static Collection<DeclarationDescriptor> excludeNotCallableExtensions(
@NotNull Collection<? extends DeclarationDescriptor> descriptors,
@NotNull final JetScope scope,
@NotNull NamePredicate name
@NotNull Collection<? extends DeclarationDescriptor> descriptors, @NotNull final JetScope scope
) {
final Set<DeclarationDescriptor> descriptorsSet = Sets.newHashSet(descriptors);
@@ -155,10 +156,9 @@ public final class TipsManager {
scope.getImplicitReceiversHierarchy(result);
descriptorsSet.removeAll(
Collections2.filter(scope.getAllDescriptors(DescriptorPredicate.extension(name)), new Predicate<DeclarationDescriptor>() {
Collections2.filter(JetScopeUtils.getAllExtensions(scope), new Predicate<CallableDescriptor>() {
@Override
public boolean apply(DeclarationDescriptor declarationDescriptor) {
CallableDescriptor callableDescriptor = (CallableDescriptor) declarationDescriptor;
public boolean apply(CallableDescriptor callableDescriptor) {
if (!callableDescriptor.getReceiverParameter().exists()) {
return false;
}
@@ -187,8 +187,7 @@ public final class TipsManager {
private static Set<DeclarationDescriptor> includeExternalCallableExtensions(
@NotNull Collection<DeclarationDescriptor> descriptors,
@NotNull final JetScope externalScope,
@NotNull final ReceiverDescriptor receiverDescriptor,
@NotNull NamePredicate name
@NotNull final ReceiverDescriptor receiverDescriptor
) {
// It's impossible to add extension function for namespace
JetType receiverType = receiverDescriptor.getType();
@@ -199,13 +198,13 @@ public final class TipsManager {
Set<DeclarationDescriptor> descriptorsSet = Sets.newHashSet(descriptors);
descriptorsSet.addAll(
Collections2.filter(externalScope.getAllDescriptors(DescriptorPredicate.extension(name)),
new Predicate<DeclarationDescriptor>() {
@Override
public boolean apply(DeclarationDescriptor callableDescriptor) {
return ExpressionTypingUtils.checkIsExtensionCallable(receiverDescriptor, (CallableDescriptor) callableDescriptor);
}
}));
Collections2.filter(JetScopeUtils.getAllExtensions(externalScope),
new Predicate<CallableDescriptor>() {
@Override
public boolean apply(CallableDescriptor callableDescriptor) {
return ExpressionTypingUtils.checkIsExtensionCallable(receiverDescriptor, callableDescriptor);
}
}));
return descriptorsSet;
}
@@ -128,9 +128,9 @@ public abstract class DescriptorPredicate {
private static class HasName extends DescriptorPredicate {
@NotNull
private final NamePredicate required;
private final Name required;
private HasName(@NotNull NamePredicate required) {
private HasName(@NotNull Name required) {
this.required = required;
}
@@ -151,24 +151,18 @@ public abstract class DescriptorPredicate {
@Override
public boolean includeName(@NotNull Name name) {
return required.matches(name);
return required.equals(name);
}
}
public static DescriptorPredicate hasName(@NotNull NamePredicate required) {
return new HasName(required);
public static DescriptorPredicate hasName(@NotNull Name name) {
return new HasName(name);
}
private static class MembersOfType extends DescriptorPredicate {
@NotNull
private final DescriptorKind required;
private MembersOfType(@NotNull DescriptorKind required) {
this.required = required;
}
private static class CallableMembers extends DescriptorPredicate {
public static final CallableMembers instance = new CallableMembers();
@Override
public boolean includeName(@NotNull Name name) {
@@ -182,71 +176,24 @@ public abstract class DescriptorPredicate {
@Override
public boolean include(@NotNull DeclarationDescriptor descriptor) {
return descriptorKind(descriptor) == required;
return descriptor instanceof CallableMemberDescriptor;
}
@Override
public boolean includeKind(@NotNull DescriptorKind kind) {
return kind == required;
return kind == DescriptorKind.CALLABLE_MEMBER;
}
}
private static final DescriptorPredicate callableMembers = new MembersOfType(DescriptorKind.CALLABLE_MEMBER);
public static DescriptorPredicate callableMembers() {
return callableMembers;
}
private static final DescriptorPredicate namespaces = new MembersOfType(DescriptorKind.NAMESPACE);
public static DescriptorPredicate namespaces() {
return namespaces;
return CallableMembers.instance;
}
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 class Extension extends CallableMembers {
private static final Extension instance = new Extension();
private Extension() {
super(DescriptorKind.CALLABLE_MEMBER);
}
@Override
public boolean includeExtension(boolean extension) {
return extension;
@@ -258,31 +205,6 @@ 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(DescriptorPredicateUtils.filter(allDescriptors, predicate), getInheritedDescriptors(predicate));
return concat(allDescriptors, getInheritedDescriptors(predicate));
}
allDescriptorsDone = true;