Added CallableDescriptorCollectors

to use it instead List<CallableDescriptorCollector>
This commit is contained in:
Svetlana Isakova
2014-03-18 08:59:23 +04:00
parent 8f269f1806
commit db253ae7e1
3 changed files with 44 additions and 29 deletions
@@ -97,13 +97,13 @@ public class CallResolver {
assert calleeExpression instanceof JetSimpleNameExpression;
JetSimpleNameExpression nameExpression = (JetSimpleNameExpression) calleeExpression;
Name referencedName = nameExpression.getReferencedNameAsName();
List<CallableDescriptorCollector<? extends VariableDescriptor>> callableDescriptorCollectors = Lists.newArrayList();
CallableDescriptorCollectors<VariableDescriptor> callableDescriptorCollectors;
if (nameExpression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER) {
referencedName = Name.identifier(referencedName.asString().substring(1));
callableDescriptorCollectors.add(CallableDescriptorCollectors.PROPERTIES);
callableDescriptorCollectors = CallableDescriptorCollectors.PROPERTIES;
}
else {
callableDescriptorCollectors.add(CallableDescriptorCollectors.VARIABLES);
callableDescriptorCollectors = CallableDescriptorCollectors.VARIABLES;
}
TracingStrategy tracing = TracingStrategyImpl.create(nameExpression, context.call);
List<ResolutionTask<VariableDescriptor, VariableDescriptor>> prioritizedTasks =
@@ -142,9 +142,7 @@ public class CallResolver {
@NotNull BasicCallResolutionContext context,
@NotNull TracingStrategy tracing
) {
List<CallableDescriptorCollector<? extends CallableDescriptor>> collectors = Collections
.<CallableDescriptorCollector<? extends CallableDescriptor>>singletonList(CallableDescriptorCollectors.FUNCTIONS);
return resolveCallWithGivenName(context, Name.identifier("invoke"), tracing, collectors);
return resolveCallWithGivenName(context, Name.identifier("invoke"), tracing, CallableDescriptorCollectors.FUNCTIONS);
}
@NotNull
@@ -152,7 +150,7 @@ public class CallResolver {
@NotNull BasicCallResolutionContext context,
@NotNull Name name,
@NotNull TracingStrategy tracing,
@NotNull List<CallableDescriptorCollector<? extends CallableDescriptor>> collectors
@NotNull CallableDescriptorCollectors<CallableDescriptor> collectors
) {
List<ResolutionTask<CallableDescriptor, FunctionDescriptor>> tasks =
TaskPrioritizer.<CallableDescriptor, FunctionDescriptor>computePrioritizedTasks(context, name, tracing, collectors);
@@ -30,15 +30,23 @@ import java.util.*;
import static org.jetbrains.jet.lang.resolve.LibrarySourceHacks.filterOutMembersFromLibrarySource;
public class CallableDescriptorCollectors {
public static CallableDescriptorCollector<FunctionDescriptor> FUNCTIONS =
@SuppressWarnings("unchecked")
public class CallableDescriptorCollectors<D extends CallableDescriptor> implements Iterable<CallableDescriptorCollector<D>> {
private static final CallableDescriptorCollector<FunctionDescriptor> FUNCTIONS_COLLECTOR =
new FilteredCollector<FunctionDescriptor>(new FunctionCollector());
public static CallableDescriptorCollector<VariableDescriptor> VARIABLES =
private static final CallableDescriptorCollector<VariableDescriptor> VARIABLES_COLLECTOR =
new FilteredCollector<VariableDescriptor>(new VariableCollector());
public static CallableDescriptorCollector<VariableDescriptor> PROPERTIES =
private static final CallableDescriptorCollector<VariableDescriptor> PROPERTIES_COLLECTOR =
new FilteredCollector<VariableDescriptor>(new PropertyCollector());
public static List<CallableDescriptorCollector<? extends CallableDescriptor>> FUNCTIONS_AND_VARIABLES =
Lists.newArrayList(FUNCTIONS, VARIABLES);
public static final CallableDescriptorCollectors<CallableDescriptor> FUNCTIONS_AND_VARIABLES =
new CallableDescriptorCollectors(FUNCTIONS_COLLECTOR, VARIABLES_COLLECTOR);
public static final CallableDescriptorCollectors<CallableDescriptor> FUNCTIONS =
new CallableDescriptorCollectors(FUNCTIONS_COLLECTOR);
public static final CallableDescriptorCollectors<VariableDescriptor> VARIABLES =
new CallableDescriptorCollectors(VARIABLES_COLLECTOR);
public static final CallableDescriptorCollectors<VariableDescriptor> PROPERTIES =
new CallableDescriptorCollectors(PROPERTIES_COLLECTOR);
private static class FunctionCollector implements CallableDescriptorCollector<FunctionDescriptor> {
@@ -145,19 +153,19 @@ public class CallableDescriptorCollectors {
@NotNull
@Override
public Collection<VariableDescriptor> getNonExtensionsByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace) {
return filterProperties(VARIABLES.getNonExtensionsByName(scope, name, bindingTrace));
return filterProperties(VARIABLES_COLLECTOR.getNonExtensionsByName(scope, name, bindingTrace));
}
@NotNull
@Override
public Collection<VariableDescriptor> getMembersByName(@NotNull JetType receiver, Name name, @NotNull BindingTrace bindingTrace) {
return filterProperties(VARIABLES.getMembersByName(receiver, name, bindingTrace));
return filterProperties(VARIABLES_COLLECTOR.getMembersByName(receiver, name, bindingTrace));
}
@NotNull
@Override
public Collection<VariableDescriptor> getNonMembersByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace) {
return filterProperties(VARIABLES.getNonMembersByName(scope, name, bindingTrace));
return filterProperties(VARIABLES_COLLECTOR.getNonMembersByName(scope, name, bindingTrace));
}
@Override
@@ -197,6 +205,15 @@ public class CallableDescriptorCollectors {
}
}
private CallableDescriptorCollectors() {
private final Collection<CallableDescriptorCollector<D>> collectors;
private CallableDescriptorCollectors(CallableDescriptorCollector<D>... collectors) {
this.collectors = Lists.newArrayList(collectors);
}
@NotNull
@Override
public Iterator<CallableDescriptorCollector<D>> iterator() {
return collectors.iterator();
}
}
@@ -81,7 +81,7 @@ public class TaskPrioritizer {
@NotNull BasicCallResolutionContext context,
@NotNull Name name,
@NotNull TracingStrategy tracing,
@NotNull List<CallableDescriptorCollector<? extends D>> callableDescriptorCollectors
@NotNull CallableDescriptorCollectors<D> callableDescriptorCollectors
) {
List<Pair<JetScope, ReceiverValue>> variants = new ArrayList<Pair<JetScope, ReceiverValue>>(2);
@@ -136,10 +136,10 @@ public class TaskPrioritizer {
List<JetType> variantsForExplicitReceiver = AutoCastUtils.getAutoCastVariants(explicitReceiver, c.context);
//members
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : c.callableDescriptorCollectors) {
for (CallableDescriptorCollector<D> callableDescriptorCollector : c.callableDescriptorCollectors) {
Collection<ResolutionCandidate<D>> members = Lists.newArrayList();
for (JetType type : variantsForExplicitReceiver) {
Collection<? extends D> membersForThisVariant =
Collection<D> membersForThisVariant =
callableDescriptorCollector.getMembersByName(type, c.name, c.context.trace);
convertWithReceivers(membersForThisVariant, explicitReceiver,
NO_RECEIVER, members, createKind(THIS_OBJECT, isExplicit), c.context.call);
@@ -147,7 +147,7 @@ public class TaskPrioritizer {
c.result.addCandidates(members);
}
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : c.callableDescriptorCollectors) {
for (CallableDescriptorCollector<D> callableDescriptorCollector : c.callableDescriptorCollectors) {
//member extensions
for (ReceiverValue implicitReceiver : implicitReceivers) {
addMemberExtensionCandidates(implicitReceiver, explicitReceiver,
@@ -169,10 +169,10 @@ public class TaskPrioritizer {
private static <D extends CallableDescriptor, F extends D> void addMemberExtensionCandidates(
@NotNull ReceiverValue thisObject,
@NotNull ReceiverValue receiverParameter,
@NotNull CallableDescriptorCollector<? extends D> callableDescriptorCollector, TaskPrioritizerContext<D, F> c,
@NotNull CallableDescriptorCollector<D> callableDescriptorCollector, TaskPrioritizerContext<D, F> c,
@NotNull ExplicitReceiverKind receiverKind
) {
Collection<? extends D> memberExtensions = callableDescriptorCollector.getNonMembersByName(
Collection<D> memberExtensions = callableDescriptorCollector.getNonMembersByName(
thisObject.getType().getMemberScope(), c.name, c.context.trace);
c.result.addCandidates(convertWithReceivers(
memberExtensions, thisObject, receiverParameter, receiverKind, c.context.call));
@@ -184,7 +184,7 @@ public class TaskPrioritizer {
) {
List<Collection<ResolutionCandidate<D>>> localsList = Lists.newArrayList();
List<Collection<ResolutionCandidate<D>>> nonlocalsList = Lists.newArrayList();
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : c.callableDescriptorCollectors) {
for (CallableDescriptorCollector<D> callableDescriptorCollector : c.callableDescriptorCollectors) {
Collection<ResolutionCandidate<D>> members = convertWithImpliedThisAndNoReceiver(
c.scope, callableDescriptorCollector.getNonExtensionsByName(c.scope, c.name, c.context.trace), c.context.call);
@@ -253,13 +253,13 @@ public class TaskPrioritizer {
@NotNull TaskPrioritizerContext<D, F> c,
@NotNull ExplicitReceiverKind receiverKind
) {
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : c.callableDescriptorCollectors) {
for (CallableDescriptorCollector<D> callableDescriptorCollector : c.callableDescriptorCollectors) {
addMemberExtensionCandidates(thisObject, receiverParameter, callableDescriptorCollector, c, receiverKind);
}
}
private static <D extends CallableDescriptor> Collection<ResolutionCandidate<D>> convertWithReceivers(
@NotNull Collection<? extends D> descriptors,
@NotNull Collection<D> descriptors,
@NotNull ReceiverValue thisObject,
@NotNull ReceiverValue receiverParameter,
@NotNull ExplicitReceiverKind explicitReceiverKind,
@@ -271,7 +271,7 @@ public class TaskPrioritizer {
}
private static <D extends CallableDescriptor> void convertWithReceivers(
@NotNull Collection<? extends D> descriptors,
@NotNull Collection<D> descriptors,
@NotNull ReceiverValue thisObject,
@NotNull ReceiverValue receiverParameter,
@NotNull Collection<ResolutionCandidate<D>> result,
@@ -383,14 +383,14 @@ public class TaskPrioritizer {
@NotNull public final ResolutionTaskHolder<D, F> result;
@NotNull public final BasicCallResolutionContext context;
@NotNull public final JetScope scope;
@NotNull public final List<CallableDescriptorCollector<? extends D>> callableDescriptorCollectors;
@NotNull public final CallableDescriptorCollectors<D> callableDescriptorCollectors;
private TaskPrioritizerContext(
@NotNull Name name,
@NotNull ResolutionTaskHolder<D, F> result,
@NotNull BasicCallResolutionContext context,
@NotNull JetScope scope,
@NotNull List<CallableDescriptorCollector<? extends D>> callableDescriptorCollectors
@NotNull CallableDescriptorCollectors<D> callableDescriptorCollectors
) {
this.name = name;
this.result = result;