From 74f4fde18048a24c3cd25fa4099b93c1fd2be852 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Sat, 9 Jun 2012 17:40:22 +0400 Subject: [PATCH] KT-2240 Wrong overload resolution ambiguity when object literal is involved #KT-2240 fixed --- .../lang/resolve/calls/TaskPrioritizer.java | 28 ++++++++++--------- .../diagnostics/tests/objects/kt2240.jet | 13 +++++++++ 2 files changed, 28 insertions(+), 13 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/objects/kt2240.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TaskPrioritizer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TaskPrioritizer.java index 7a2fdf8e4bb..fc6adc182b8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TaskPrioritizer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TaskPrioritizer.java @@ -184,7 +184,7 @@ import static org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor } } - public static Collection> convertWithImpliedThis(JetScope scope, Iterable receiverParameters, Collection descriptors) { + public static Collection> convertWithImpliedThis(JetScope scope, Collection receiverParameters, Collection descriptors) { Collection> result = Lists.newArrayList(); for (ReceiverDescriptor receiverParameter : receiverParameters) { for (D descriptor : descriptors) { @@ -197,18 +197,20 @@ import static org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor } } } - for (D descriptor : descriptors) { - if (descriptor.getExpectedThisObject().exists()) { - DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); - if (descriptor instanceof ConstructorDescriptor) { - assert containingDeclaration != null; - containingDeclaration = containingDeclaration.getContainingDeclaration(); - } - if (containingDeclaration instanceof ClassDescriptor && ((ClassDescriptor) containingDeclaration).getKind() == ClassKind.OBJECT) { - ResolutionCandidate candidate = ResolutionCandidate.create(descriptor); - candidate.setThisObject(new ClassReceiver((ClassDescriptor) containingDeclaration)); - candidate.setExplicitReceiverKind(ExplicitReceiverKind.NO_EXPLICIT_RECEIVER); - result.add(candidate); + if (receiverParameters.size() == 1 && !receiverParameters.iterator().next().exists()) { + for (D descriptor : descriptors) { + if (descriptor.getExpectedThisObject().exists() && !descriptor.getReceiverParameter().exists()) { + DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); + if (descriptor instanceof ConstructorDescriptor) { + assert containingDeclaration != null; + containingDeclaration = containingDeclaration.getContainingDeclaration(); + } + if (containingDeclaration instanceof ClassDescriptor && DescriptorUtils.isClassObject(containingDeclaration)) { + ResolutionCandidate candidate = ResolutionCandidate.create(descriptor); + candidate.setThisObject(new ClassReceiver((ClassDescriptor) containingDeclaration)); + candidate.setExplicitReceiverKind(ExplicitReceiverKind.NO_EXPLICIT_RECEIVER); + result.add(candidate); + } } } } diff --git a/compiler/testData/diagnostics/tests/objects/kt2240.jet b/compiler/testData/diagnostics/tests/objects/kt2240.jet new file mode 100644 index 00000000000..7a22ea58078 --- /dev/null +++ b/compiler/testData/diagnostics/tests/objects/kt2240.jet @@ -0,0 +1,13 @@ +package a + +//KT-2240 Wrong overload resolution ambiguity when object literal is involved + +class A {} + +fun A.foo(f : T) {} + +val o = object { + fun foo(f: T) { + A().foo(f) // Ambiguity here! + } +} \ No newline at end of file