restored priorities

members with invoke have more priority than extensions
This commit is contained in:
Svetlana Isakova
2013-07-02 21:50:11 +04:00
parent 54e1cf0879
commit 9347a48df8
4 changed files with 62 additions and 32 deletions
@@ -63,6 +63,12 @@ public class ResolutionTaskHolder<D extends CallableDescriptor, F extends D> {
}
}
public void addCandidates(@NotNull List<Collection<ResolutionCandidate<D>>> candidatesList) {
for (Collection<ResolutionCandidate<D>> candidates : candidatesList) {
addCandidates(candidates);
}
}
public List<ResolutionTask<D, F>> getTasks() {
if (tasks == null) {
tasks = Lists.newArrayList();
@@ -89,16 +89,16 @@ public class TaskPrioritizer {
}
ResolutionTaskHolder<D, F> result = new ResolutionTaskHolder<D, F>(functionReference, context, new MyPriorityProvider<D>(context));
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : callableDescriptorCollectors) {
doComputeTasks(scope, explicitReceiver, name, result, context, callableDescriptorCollector);
}
doComputeTasks(scope, explicitReceiver, name, result, context, callableDescriptorCollectors);
return result.getTasks();
}
private static <D extends CallableDescriptor, F extends D> void doComputeTasks(@NotNull JetScope scope, @NotNull ReceiverValue receiver,
private static <D extends CallableDescriptor, F extends D> void doComputeTasks(
@NotNull JetScope scope, @NotNull ReceiverValue receiver,
@NotNull Name name, @NotNull ResolutionTaskHolder<D, F> result,
@NotNull BasicCallResolutionContext context, @NotNull CallableDescriptorCollector<? extends D> callableDescriptorCollector) {
@NotNull BasicCallResolutionContext context,
@NotNull List<CallableDescriptorCollector<? extends D>> callableDescriptorCollectors
) {
ProgressIndicatorProvider.checkCanceled();
AutoCastServiceImpl autoCastService = new AutoCastServiceImpl(context.dataFlowInfo, context.trace.getBindingContext());
@@ -110,42 +110,53 @@ public class TaskPrioritizer {
if (receiver.exists()) {
List<ReceiverValue> variantsForExplicitReceiver = autoCastService.getVariantsForReceiver(receiver);
Collection<ResolutionCandidate<D>> members = Lists.newArrayList();
for (ReceiverValue variant : variantsForExplicitReceiver) {
Collection<? extends D> membersForThisVariant = callableDescriptorCollector.getMembersByName(variant.getType(), name);
convertWithReceivers(membersForThisVariant, Collections.singletonList(variant),
Collections.singletonList(NO_RECEIVER), members, hasExplicitThisObject);
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : callableDescriptorCollectors) {
Collection<ResolutionCandidate<D>> members = Lists.newArrayList();
for (ReceiverValue variant : variantsForExplicitReceiver) {
Collection<? extends D> membersForThisVariant = callableDescriptorCollector.getMembersByName(variant.getType(), name);
convertWithReceivers(membersForThisVariant, Collections.singletonList(variant),
Collections.singletonList(NO_RECEIVER), members, hasExplicitThisObject);
}
result.addCandidates(members);
}
result.addCandidates(members);
for (ReceiverValue implicitReceiver : implicitReceivers) {
Collection<? extends D> memberExtensions = callableDescriptorCollector.getNonMembersByName(
implicitReceiver.getType().getMemberScope(), name);
List<ReceiverValue> variantsForImplicitReceiver = autoCastService.getVariantsForReceiver(implicitReceiver);
result.addCandidates(convertWithReceivers(memberExtensions, variantsForImplicitReceiver,
variantsForExplicitReceiver, hasExplicitThisObject));
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : callableDescriptorCollectors) {
for (ReceiverValue implicitReceiver : implicitReceivers) {
Collection<? extends D> memberExtensions = callableDescriptorCollector.getNonMembersByName(
implicitReceiver.getType().getMemberScope(), name);
List<ReceiverValue> variantsForImplicitReceiver = autoCastService.getVariantsForReceiver(implicitReceiver);
result.addCandidates(convertWithReceivers(memberExtensions, variantsForImplicitReceiver,
variantsForExplicitReceiver, hasExplicitThisObject));
}
Collection<ResolutionCandidate<D>> extensionFunctions = convertWithImpliedThis(
scope, variantsForExplicitReceiver, callableDescriptorCollector.getNonMembersByName(scope, name));
result.addCandidates(extensionFunctions);
}
Collection<ResolutionCandidate<D>> extensionFunctions = convertWithImpliedThis(
scope, variantsForExplicitReceiver, callableDescriptorCollector.getNonMembersByName(scope, name));
result.addCandidates(extensionFunctions);
}
else {
Collection<ResolutionCandidate<D>> functions = convertWithImpliedThis(scope, Collections.singletonList(receiver), callableDescriptorCollector
.getNonExtensionsByName(scope, name));
List<Collection<ResolutionCandidate<D>>> localsList = Lists.newArrayList();
List<Collection<ResolutionCandidate<D>>> nonlocalsList = Lists.newArrayList();
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : callableDescriptorCollectors) {
List<ResolutionCandidate<D>> nonlocals = Lists.newArrayList();
List<ResolutionCandidate<D>> locals = Lists.newArrayList();
//noinspection unchecked,RedundantTypeArguments
TaskPrioritizer.<D>splitLexicallyLocalDescriptors(functions, scope.getContainingDeclaration(), locals, nonlocals);
Collection<ResolutionCandidate<D>> functions =
convertWithImpliedThis(scope, Collections.singletonList(receiver), callableDescriptorCollector
.getNonExtensionsByName(scope, name));
result.addCandidates(locals);
List<ResolutionCandidate<D>> nonlocals = Lists.newArrayList();
List<ResolutionCandidate<D>> locals = Lists.newArrayList();
//noinspection unchecked,RedundantTypeArguments
TaskPrioritizer.<D>splitLexicallyLocalDescriptors(functions, scope.getContainingDeclaration(), locals, nonlocals);
localsList.add(locals);
nonlocalsList.add(nonlocals);
}
result.addCandidates(localsList);
for (ReceiverValue implicitReceiver : implicitReceivers) {
doComputeTasks(scope, implicitReceiver, name, result, context, callableDescriptorCollector);
doComputeTasks(scope, implicitReceiver, name, result, context, callableDescriptorCollectors);
}
result.addCandidates(nonlocals);
result.addCandidates(nonlocalsList);
}
}
@@ -0,0 +1,8 @@
annotation class data
public class BinaryResponse(~data~val data: () -> String) {
fun writeResponse() {
`data`data()
}
}
@@ -228,6 +228,11 @@ public class JetResolveTestGenerated extends AbstractResolveTest {
doTest("compiler/testData/resolve/candidatesPriority/memberVsLocalExtension.resolve");
}
@TestMetadata("memberWithInvokeVsNonLocal.resolve")
public void testMemberWithInvokeVsNonLocal() throws Exception {
doTest("compiler/testData/resolve/candidatesPriority/memberWithInvokeVsNonLocal.resolve");
}
@TestMetadata("receiverVsThisObject.resolve")
public void testReceiverVsThisObject() throws Exception {
doTest("compiler/testData/resolve/candidatesPriority/receiverVsThisObject.resolve");