restored priorities
members with invoke have more priority than extensions
This commit is contained in:
+6
@@ -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() {
|
public List<ResolutionTask<D, F>> getTasks() {
|
||||||
if (tasks == null) {
|
if (tasks == null) {
|
||||||
tasks = Lists.newArrayList();
|
tasks = Lists.newArrayList();
|
||||||
|
|||||||
+43
-32
@@ -89,16 +89,16 @@ public class TaskPrioritizer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ResolutionTaskHolder<D, F> result = new ResolutionTaskHolder<D, F>(functionReference, context, new MyPriorityProvider<D>(context));
|
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, callableDescriptorCollectors);
|
||||||
doComputeTasks(scope, explicitReceiver, name, result, context, callableDescriptorCollector);
|
|
||||||
}
|
|
||||||
return result.getTasks();
|
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 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();
|
ProgressIndicatorProvider.checkCanceled();
|
||||||
|
|
||||||
AutoCastServiceImpl autoCastService = new AutoCastServiceImpl(context.dataFlowInfo, context.trace.getBindingContext());
|
AutoCastServiceImpl autoCastService = new AutoCastServiceImpl(context.dataFlowInfo, context.trace.getBindingContext());
|
||||||
@@ -110,42 +110,53 @@ public class TaskPrioritizer {
|
|||||||
if (receiver.exists()) {
|
if (receiver.exists()) {
|
||||||
List<ReceiverValue> variantsForExplicitReceiver = autoCastService.getVariantsForReceiver(receiver);
|
List<ReceiverValue> variantsForExplicitReceiver = autoCastService.getVariantsForReceiver(receiver);
|
||||||
|
|
||||||
Collection<ResolutionCandidate<D>> members = Lists.newArrayList();
|
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : callableDescriptorCollectors) {
|
||||||
for (ReceiverValue variant : variantsForExplicitReceiver) {
|
Collection<ResolutionCandidate<D>> members = Lists.newArrayList();
|
||||||
Collection<? extends D> membersForThisVariant = callableDescriptorCollector.getMembersByName(variant.getType(), name);
|
for (ReceiverValue variant : variantsForExplicitReceiver) {
|
||||||
convertWithReceivers(membersForThisVariant, Collections.singletonList(variant),
|
Collection<? extends D> membersForThisVariant = callableDescriptorCollector.getMembersByName(variant.getType(), name);
|
||||||
Collections.singletonList(NO_RECEIVER), members, hasExplicitThisObject);
|
convertWithReceivers(membersForThisVariant, Collections.singletonList(variant),
|
||||||
|
Collections.singletonList(NO_RECEIVER), members, hasExplicitThisObject);
|
||||||
|
}
|
||||||
|
result.addCandidates(members);
|
||||||
}
|
}
|
||||||
|
|
||||||
result.addCandidates(members);
|
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : callableDescriptorCollectors) {
|
||||||
|
for (ReceiverValue implicitReceiver : implicitReceivers) {
|
||||||
for (ReceiverValue implicitReceiver : implicitReceivers) {
|
Collection<? extends D> memberExtensions = callableDescriptorCollector.getNonMembersByName(
|
||||||
Collection<? extends D> memberExtensions = callableDescriptorCollector.getNonMembersByName(
|
implicitReceiver.getType().getMemberScope(), name);
|
||||||
implicitReceiver.getType().getMemberScope(), name);
|
List<ReceiverValue> variantsForImplicitReceiver = autoCastService.getVariantsForReceiver(implicitReceiver);
|
||||||
List<ReceiverValue> variantsForImplicitReceiver = autoCastService.getVariantsForReceiver(implicitReceiver);
|
result.addCandidates(convertWithReceivers(memberExtensions, variantsForImplicitReceiver,
|
||||||
result.addCandidates(convertWithReceivers(memberExtensions, variantsForImplicitReceiver,
|
variantsForExplicitReceiver, hasExplicitThisObject));
|
||||||
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 {
|
else {
|
||||||
Collection<ResolutionCandidate<D>> functions = convertWithImpliedThis(scope, Collections.singletonList(receiver), callableDescriptorCollector
|
List<Collection<ResolutionCandidate<D>>> localsList = Lists.newArrayList();
|
||||||
.getNonExtensionsByName(scope, name));
|
List<Collection<ResolutionCandidate<D>>> nonlocalsList = Lists.newArrayList();
|
||||||
|
for (CallableDescriptorCollector<? extends D> callableDescriptorCollector : callableDescriptorCollectors) {
|
||||||
|
|
||||||
List<ResolutionCandidate<D>> nonlocals = Lists.newArrayList();
|
Collection<ResolutionCandidate<D>> functions =
|
||||||
List<ResolutionCandidate<D>> locals = Lists.newArrayList();
|
convertWithImpliedThis(scope, Collections.singletonList(receiver), callableDescriptorCollector
|
||||||
//noinspection unchecked,RedundantTypeArguments
|
.getNonExtensionsByName(scope, name));
|
||||||
TaskPrioritizer.<D>splitLexicallyLocalDescriptors(functions, scope.getContainingDeclaration(), locals, nonlocals);
|
|
||||||
|
|
||||||
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) {
|
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");
|
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")
|
@TestMetadata("receiverVsThisObject.resolve")
|
||||||
public void testReceiverVsThisObject() throws Exception {
|
public void testReceiverVsThisObject() throws Exception {
|
||||||
doTest("compiler/testData/resolve/candidatesPriority/receiverVsThisObject.resolve");
|
doTest("compiler/testData/resolve/candidatesPriority/receiverVsThisObject.resolve");
|
||||||
|
|||||||
Reference in New Issue
Block a user