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; assert calleeExpression instanceof JetSimpleNameExpression;
JetSimpleNameExpression nameExpression = (JetSimpleNameExpression) calleeExpression; JetSimpleNameExpression nameExpression = (JetSimpleNameExpression) calleeExpression;
Name referencedName = nameExpression.getReferencedNameAsName(); Name referencedName = nameExpression.getReferencedNameAsName();
List<CallableDescriptorCollector<? extends VariableDescriptor>> callableDescriptorCollectors = Lists.newArrayList(); CallableDescriptorCollectors<VariableDescriptor> callableDescriptorCollectors;
if (nameExpression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER) { if (nameExpression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER) {
referencedName = Name.identifier(referencedName.asString().substring(1)); referencedName = Name.identifier(referencedName.asString().substring(1));
callableDescriptorCollectors.add(CallableDescriptorCollectors.PROPERTIES); callableDescriptorCollectors = CallableDescriptorCollectors.PROPERTIES;
} }
else { else {
callableDescriptorCollectors.add(CallableDescriptorCollectors.VARIABLES); callableDescriptorCollectors = CallableDescriptorCollectors.VARIABLES;
} }
TracingStrategy tracing = TracingStrategyImpl.create(nameExpression, context.call); TracingStrategy tracing = TracingStrategyImpl.create(nameExpression, context.call);
List<ResolutionTask<VariableDescriptor, VariableDescriptor>> prioritizedTasks = List<ResolutionTask<VariableDescriptor, VariableDescriptor>> prioritizedTasks =
@@ -142,9 +142,7 @@ public class CallResolver {
@NotNull BasicCallResolutionContext context, @NotNull BasicCallResolutionContext context,
@NotNull TracingStrategy tracing @NotNull TracingStrategy tracing
) { ) {
List<CallableDescriptorCollector<? extends CallableDescriptor>> collectors = Collections return resolveCallWithGivenName(context, Name.identifier("invoke"), tracing, CallableDescriptorCollectors.FUNCTIONS);
.<CallableDescriptorCollector<? extends CallableDescriptor>>singletonList(CallableDescriptorCollectors.FUNCTIONS);
return resolveCallWithGivenName(context, Name.identifier("invoke"), tracing, collectors);
} }
@NotNull @NotNull
@@ -152,7 +150,7 @@ public class CallResolver {
@NotNull BasicCallResolutionContext context, @NotNull BasicCallResolutionContext context,
@NotNull Name name, @NotNull Name name,
@NotNull TracingStrategy tracing, @NotNull TracingStrategy tracing,
@NotNull List<CallableDescriptorCollector<? extends CallableDescriptor>> collectors @NotNull CallableDescriptorCollectors<CallableDescriptor> collectors
) { ) {
List<ResolutionTask<CallableDescriptor, FunctionDescriptor>> tasks = List<ResolutionTask<CallableDescriptor, FunctionDescriptor>> tasks =
TaskPrioritizer.<CallableDescriptor, FunctionDescriptor>computePrioritizedTasks(context, name, tracing, collectors); TaskPrioritizer.<CallableDescriptor, FunctionDescriptor>computePrioritizedTasks(context, name, tracing, collectors);
@@ -30,15 +30,23 @@ import java.util.*;
import static org.jetbrains.jet.lang.resolve.LibrarySourceHacks.filterOutMembersFromLibrarySource; import static org.jetbrains.jet.lang.resolve.LibrarySourceHacks.filterOutMembersFromLibrarySource;
public class CallableDescriptorCollectors { @SuppressWarnings("unchecked")
public static CallableDescriptorCollector<FunctionDescriptor> FUNCTIONS = public class CallableDescriptorCollectors<D extends CallableDescriptor> implements Iterable<CallableDescriptorCollector<D>> {
private static final CallableDescriptorCollector<FunctionDescriptor> FUNCTIONS_COLLECTOR =
new FilteredCollector<FunctionDescriptor>(new FunctionCollector()); new FilteredCollector<FunctionDescriptor>(new FunctionCollector());
public static CallableDescriptorCollector<VariableDescriptor> VARIABLES = private static final CallableDescriptorCollector<VariableDescriptor> VARIABLES_COLLECTOR =
new FilteredCollector<VariableDescriptor>(new VariableCollector()); new FilteredCollector<VariableDescriptor>(new VariableCollector());
public static CallableDescriptorCollector<VariableDescriptor> PROPERTIES = private static final CallableDescriptorCollector<VariableDescriptor> PROPERTIES_COLLECTOR =
new FilteredCollector<VariableDescriptor>(new PropertyCollector()); 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> { private static class FunctionCollector implements CallableDescriptorCollector<FunctionDescriptor> {
@@ -145,19 +153,19 @@ public class CallableDescriptorCollectors {
@NotNull @NotNull
@Override @Override
public Collection<VariableDescriptor> getNonExtensionsByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace) { 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 @NotNull
@Override @Override
public Collection<VariableDescriptor> getMembersByName(@NotNull JetType receiver, Name name, @NotNull BindingTrace bindingTrace) { 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 @NotNull
@Override @Override
public Collection<VariableDescriptor> getNonMembersByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace) { 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 @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 BasicCallResolutionContext context,
@NotNull Name name, @NotNull Name name,
@NotNull TracingStrategy tracing, @NotNull TracingStrategy tracing,
@NotNull List<CallableDescriptorCollector<? extends D>> callableDescriptorCollectors @NotNull CallableDescriptorCollectors<D> callableDescriptorCollectors
) { ) {
List<Pair<JetScope, ReceiverValue>> variants = new ArrayList<Pair<JetScope, ReceiverValue>>(2); 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); List<JetType> variantsForExplicitReceiver = AutoCastUtils.getAutoCastVariants(explicitReceiver, c.context);
//members //members
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : c.callableDescriptorCollectors) { for (CallableDescriptorCollector<D> callableDescriptorCollector : c.callableDescriptorCollectors) {
Collection<ResolutionCandidate<D>> members = Lists.newArrayList(); Collection<ResolutionCandidate<D>> members = Lists.newArrayList();
for (JetType type : variantsForExplicitReceiver) { for (JetType type : variantsForExplicitReceiver) {
Collection<? extends D> membersForThisVariant = Collection<D> membersForThisVariant =
callableDescriptorCollector.getMembersByName(type, c.name, c.context.trace); callableDescriptorCollector.getMembersByName(type, c.name, c.context.trace);
convertWithReceivers(membersForThisVariant, explicitReceiver, convertWithReceivers(membersForThisVariant, explicitReceiver,
NO_RECEIVER, members, createKind(THIS_OBJECT, isExplicit), c.context.call); NO_RECEIVER, members, createKind(THIS_OBJECT, isExplicit), c.context.call);
@@ -147,7 +147,7 @@ public class TaskPrioritizer {
c.result.addCandidates(members); c.result.addCandidates(members);
} }
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : c.callableDescriptorCollectors) { for (CallableDescriptorCollector<D> callableDescriptorCollector : c.callableDescriptorCollectors) {
//member extensions //member extensions
for (ReceiverValue implicitReceiver : implicitReceivers) { for (ReceiverValue implicitReceiver : implicitReceivers) {
addMemberExtensionCandidates(implicitReceiver, explicitReceiver, addMemberExtensionCandidates(implicitReceiver, explicitReceiver,
@@ -169,10 +169,10 @@ public class TaskPrioritizer {
private static <D extends CallableDescriptor, F extends D> void addMemberExtensionCandidates( private static <D extends CallableDescriptor, F extends D> void addMemberExtensionCandidates(
@NotNull ReceiverValue thisObject, @NotNull ReceiverValue thisObject,
@NotNull ReceiverValue receiverParameter, @NotNull ReceiverValue receiverParameter,
@NotNull CallableDescriptorCollector<? extends D> callableDescriptorCollector, TaskPrioritizerContext<D, F> c, @NotNull CallableDescriptorCollector<D> callableDescriptorCollector, TaskPrioritizerContext<D, F> c,
@NotNull ExplicitReceiverKind receiverKind @NotNull ExplicitReceiverKind receiverKind
) { ) {
Collection<? extends D> memberExtensions = callableDescriptorCollector.getNonMembersByName( Collection<D> memberExtensions = callableDescriptorCollector.getNonMembersByName(
thisObject.getType().getMemberScope(), c.name, c.context.trace); thisObject.getType().getMemberScope(), c.name, c.context.trace);
c.result.addCandidates(convertWithReceivers( c.result.addCandidates(convertWithReceivers(
memberExtensions, thisObject, receiverParameter, receiverKind, c.context.call)); 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>>> localsList = Lists.newArrayList();
List<Collection<ResolutionCandidate<D>>> nonlocalsList = 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( Collection<ResolutionCandidate<D>> members = convertWithImpliedThisAndNoReceiver(
c.scope, callableDescriptorCollector.getNonExtensionsByName(c.scope, c.name, c.context.trace), c.context.call); 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 TaskPrioritizerContext<D, F> c,
@NotNull ExplicitReceiverKind receiverKind @NotNull ExplicitReceiverKind receiverKind
) { ) {
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : c.callableDescriptorCollectors) { for (CallableDescriptorCollector<D> callableDescriptorCollector : c.callableDescriptorCollectors) {
addMemberExtensionCandidates(thisObject, receiverParameter, callableDescriptorCollector, c, receiverKind); addMemberExtensionCandidates(thisObject, receiverParameter, callableDescriptorCollector, c, receiverKind);
} }
} }
private static <D extends CallableDescriptor> Collection<ResolutionCandidate<D>> convertWithReceivers( private static <D extends CallableDescriptor> Collection<ResolutionCandidate<D>> convertWithReceivers(
@NotNull Collection<? extends D> descriptors, @NotNull Collection<D> descriptors,
@NotNull ReceiverValue thisObject, @NotNull ReceiverValue thisObject,
@NotNull ReceiverValue receiverParameter, @NotNull ReceiverValue receiverParameter,
@NotNull ExplicitReceiverKind explicitReceiverKind, @NotNull ExplicitReceiverKind explicitReceiverKind,
@@ -271,7 +271,7 @@ public class TaskPrioritizer {
} }
private static <D extends CallableDescriptor> void convertWithReceivers( private static <D extends CallableDescriptor> void convertWithReceivers(
@NotNull Collection<? extends D> descriptors, @NotNull Collection<D> descriptors,
@NotNull ReceiverValue thisObject, @NotNull ReceiverValue thisObject,
@NotNull ReceiverValue receiverParameter, @NotNull ReceiverValue receiverParameter,
@NotNull Collection<ResolutionCandidate<D>> result, @NotNull Collection<ResolutionCandidate<D>> result,
@@ -383,14 +383,14 @@ public class TaskPrioritizer {
@NotNull public final ResolutionTaskHolder<D, F> result; @NotNull public final ResolutionTaskHolder<D, F> result;
@NotNull public final BasicCallResolutionContext context; @NotNull public final BasicCallResolutionContext context;
@NotNull public final JetScope scope; @NotNull public final JetScope scope;
@NotNull public final List<CallableDescriptorCollector<? extends D>> callableDescriptorCollectors; @NotNull public final CallableDescriptorCollectors<D> callableDescriptorCollectors;
private TaskPrioritizerContext( private TaskPrioritizerContext(
@NotNull Name name, @NotNull Name name,
@NotNull ResolutionTaskHolder<D, F> result, @NotNull ResolutionTaskHolder<D, F> result,
@NotNull BasicCallResolutionContext context, @NotNull BasicCallResolutionContext context,
@NotNull JetScope scope, @NotNull JetScope scope,
@NotNull List<CallableDescriptorCollector<? extends D>> callableDescriptorCollectors @NotNull CallableDescriptorCollectors<D> callableDescriptorCollectors
) { ) {
this.name = name; this.name = name;
this.result = result; this.result = result;