diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index 739652befb0..d1aed5c2534 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -97,13 +97,13 @@ public class CallResolver { assert calleeExpression instanceof JetSimpleNameExpression; JetSimpleNameExpression nameExpression = (JetSimpleNameExpression) calleeExpression; Name referencedName = nameExpression.getReferencedNameAsName(); - List> callableDescriptorCollectors = Lists.newArrayList(); + CallableDescriptorCollectors 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> prioritizedTasks = @@ -142,9 +142,7 @@ public class CallResolver { @NotNull BasicCallResolutionContext context, @NotNull TracingStrategy tracing ) { - List> collectors = Collections - .>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> collectors + @NotNull CallableDescriptorCollectors collectors ) { List> tasks = TaskPrioritizer.computePrioritizedTasks(context, name, tracing, collectors); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/CallableDescriptorCollectors.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/CallableDescriptorCollectors.java index 78230ecbf2f..5d1e88f60c3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/CallableDescriptorCollectors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/CallableDescriptorCollectors.java @@ -30,15 +30,23 @@ import java.util.*; import static org.jetbrains.jet.lang.resolve.LibrarySourceHacks.filterOutMembersFromLibrarySource; -public class CallableDescriptorCollectors { - public static CallableDescriptorCollector FUNCTIONS = +@SuppressWarnings("unchecked") +public class CallableDescriptorCollectors implements Iterable> { + private static final CallableDescriptorCollector FUNCTIONS_COLLECTOR = new FilteredCollector(new FunctionCollector()); - public static CallableDescriptorCollector VARIABLES = + private static final CallableDescriptorCollector VARIABLES_COLLECTOR = new FilteredCollector(new VariableCollector()); - public static CallableDescriptorCollector PROPERTIES = + private static final CallableDescriptorCollector PROPERTIES_COLLECTOR = new FilteredCollector(new PropertyCollector()); - public static List> FUNCTIONS_AND_VARIABLES = - Lists.newArrayList(FUNCTIONS, VARIABLES); + + public static final CallableDescriptorCollectors FUNCTIONS_AND_VARIABLES = + new CallableDescriptorCollectors(FUNCTIONS_COLLECTOR, VARIABLES_COLLECTOR); + public static final CallableDescriptorCollectors FUNCTIONS = + new CallableDescriptorCollectors(FUNCTIONS_COLLECTOR); + public static final CallableDescriptorCollectors VARIABLES = + new CallableDescriptorCollectors(VARIABLES_COLLECTOR); + public static final CallableDescriptorCollectors PROPERTIES = + new CallableDescriptorCollectors(PROPERTIES_COLLECTOR); private static class FunctionCollector implements CallableDescriptorCollector { @@ -145,19 +153,19 @@ public class CallableDescriptorCollectors { @NotNull @Override public Collection 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 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 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> collectors; + + private CallableDescriptorCollectors(CallableDescriptorCollector... collectors) { + this.collectors = Lists.newArrayList(collectors); + } + + @NotNull + @Override + public Iterator> iterator() { + return collectors.iterator(); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java index 91cbc230255..39eb7ff3f84 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java @@ -81,7 +81,7 @@ public class TaskPrioritizer { @NotNull BasicCallResolutionContext context, @NotNull Name name, @NotNull TracingStrategy tracing, - @NotNull List> callableDescriptorCollectors + @NotNull CallableDescriptorCollectors callableDescriptorCollectors ) { List> variants = new ArrayList>(2); @@ -136,10 +136,10 @@ public class TaskPrioritizer { List variantsForExplicitReceiver = AutoCastUtils.getAutoCastVariants(explicitReceiver, c.context); //members - for (CallableDescriptorCollector callableDescriptorCollector : c.callableDescriptorCollectors) { + for (CallableDescriptorCollector callableDescriptorCollector : c.callableDescriptorCollectors) { Collection> members = Lists.newArrayList(); for (JetType type : variantsForExplicitReceiver) { - Collection membersForThisVariant = + Collection 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 callableDescriptorCollector : c.callableDescriptorCollectors) { + for (CallableDescriptorCollector callableDescriptorCollector : c.callableDescriptorCollectors) { //member extensions for (ReceiverValue implicitReceiver : implicitReceivers) { addMemberExtensionCandidates(implicitReceiver, explicitReceiver, @@ -169,10 +169,10 @@ public class TaskPrioritizer { private static void addMemberExtensionCandidates( @NotNull ReceiverValue thisObject, @NotNull ReceiverValue receiverParameter, - @NotNull CallableDescriptorCollector callableDescriptorCollector, TaskPrioritizerContext c, + @NotNull CallableDescriptorCollector callableDescriptorCollector, TaskPrioritizerContext c, @NotNull ExplicitReceiverKind receiverKind ) { - Collection memberExtensions = callableDescriptorCollector.getNonMembersByName( + Collection 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>> localsList = Lists.newArrayList(); List>> nonlocalsList = Lists.newArrayList(); - for (CallableDescriptorCollector callableDescriptorCollector : c.callableDescriptorCollectors) { + for (CallableDescriptorCollector callableDescriptorCollector : c.callableDescriptorCollectors) { Collection> 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 c, @NotNull ExplicitReceiverKind receiverKind ) { - for (CallableDescriptorCollector callableDescriptorCollector : c.callableDescriptorCollectors) { + for (CallableDescriptorCollector callableDescriptorCollector : c.callableDescriptorCollectors) { addMemberExtensionCandidates(thisObject, receiverParameter, callableDescriptorCollector, c, receiverKind); } } private static Collection> convertWithReceivers( - @NotNull Collection descriptors, + @NotNull Collection descriptors, @NotNull ReceiverValue thisObject, @NotNull ReceiverValue receiverParameter, @NotNull ExplicitReceiverKind explicitReceiverKind, @@ -271,7 +271,7 @@ public class TaskPrioritizer { } private static void convertWithReceivers( - @NotNull Collection descriptors, + @NotNull Collection descriptors, @NotNull ReceiverValue thisObject, @NotNull ReceiverValue receiverParameter, @NotNull Collection> result, @@ -383,14 +383,14 @@ public class TaskPrioritizer { @NotNull public final ResolutionTaskHolder result; @NotNull public final BasicCallResolutionContext context; @NotNull public final JetScope scope; - @NotNull public final List> callableDescriptorCollectors; + @NotNull public final CallableDescriptorCollectors callableDescriptorCollectors; private TaskPrioritizerContext( @NotNull Name name, @NotNull ResolutionTaskHolder result, @NotNull BasicCallResolutionContext context, @NotNull JetScope scope, - @NotNull List> callableDescriptorCollectors + @NotNull CallableDescriptorCollectors callableDescriptorCollectors ) { this.name = name; this.result = result;