diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 977ed1c5f3b..f0796033515 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -19,7 +19,9 @@ package org.jetbrains.jet.lang.types.expressions; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; +import com.intellij.psi.impl.source.tree.LeafPsiElement; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -49,6 +51,7 @@ import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lexer.JetTokens; +import org.jetbrains.jet.util.slicedmap.WritableSlice; import java.util.*; @@ -992,9 +995,14 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { Name name = Name.identifier("equals"); if (right != null) { ExpressionReceiver receiver = ExpressionTypingUtils.safeGetExpressionReceiver(facade, left, context.replaceScope(context.scope)); - OverloadResolutionResults resolutionResults = context.resolveExactSignature( - receiver, name, - Collections.singletonList(KotlinBuiltIns.getInstance().getNullableAnyType())); + + final JetReferenceExpression fakeArgument = JetPsiFactory.createSimpleName(context.expressionTypingServices.getProject(), "fakeArgument"); + TemporaryBindingTrace traceWithFakeArgumentInfo = TemporaryBindingTrace.create(context.trace, "trace to store fake argument for", name); + traceWithFakeArgumentInfo.record(EXPRESSION_TYPE, fakeArgument, KotlinBuiltIns.getInstance().getNullableAnyType()); + + OverloadResolutionResults resolutionResults = resolveFakeCall( + receiver, context.replaceBindingTrace(traceWithFakeArgumentInfo), Collections.singletonList(fakeArgument), name); + if (resolutionResults.isSuccess()) { FunctionDescriptor equals = resolutionResults.getResultingCall().getResultingDescriptor(); context.trace.record(REFERENCE_TARGET, operationSign, equals); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java index eb2d514d4da..5778c0f095d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java @@ -327,7 +327,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { // Make a fake call loopRange.iterator(), and try to resolve it Name iterator = Name.identifier("iterator"); - Pair> calls = makeAndResolveFakeCall(loopRange, context, iterator); + Pair> calls = makeAndResolveFakeCall(loopRange, context, Collections.emptyList(), iterator); Call iteratorCall = calls.getFirst(); OverloadResolutionResults iteratorResolutionResults = calls.getSecond(); @@ -376,7 +376,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { @NotNull WritableSlice> resolvedCallKey ) { OverloadResolutionResults nextResolutionResults = resolveFakeCall( - new TransientReceiver(iteratorType), context, Name.identifier(name)); + new TransientReceiver(iteratorType), context, Collections.emptyList(), Name.identifier(name)); if (nextResolutionResults.isAmbiguity()) { context.trace.report(ambiguity.on(loopRangeExpression, iteratorType)); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java index 65fa9904ffb..d778f30cab1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java @@ -275,20 +275,22 @@ public class ExpressionTypingUtils { public static OverloadResolutionResults resolveFakeCall( @NotNull ReceiverDescriptor receiver, @NotNull ExpressionTypingContext context, + @NotNull List valueArguments, @NotNull Name name ) { - return makeAndResolveFakeCall(receiver, context, name).getSecond(); + return makeAndResolveFakeCall(receiver, context, valueArguments, name).getSecond(); } @NotNull public static Pair> makeAndResolveFakeCall( @NotNull ReceiverDescriptor receiver, @NotNull ExpressionTypingContext context, + @NotNull List valueArguments, @NotNull Name name ) { final JetReferenceExpression fake = JetPsiFactory.createSimpleName(context.expressionTypingServices.getProject(), "fake"); - TemporaryBindingTrace fakeTrace = TemporaryBindingTrace.create(context.trace, "trace for resolve fake call for", name); - Call call = CallMaker.makeCall(fake, receiver, null, fake, Collections.emptyList()); + TemporaryBindingTrace fakeTrace = TemporaryBindingTrace.create(context.trace, "trace to resolve fake call for", name); + Call call = CallMaker.makeCallWithExpressions(fake, receiver, null, fake, valueArguments); OverloadResolutionResults results = context.replaceBindingTrace(fakeTrace).resolveCallWithGivenName(call, fake, name); if (results.isSuccess()) { @@ -318,7 +320,7 @@ public class ExpressionTypingUtils { JetType expectedType = getExpectedTypeForComponent(context, entry); OverloadResolutionResults results = - resolveFakeCall(receiver, context.replaceExpectedType(expectedType), componentName); + resolveFakeCall(receiver, context.replaceExpectedType(expectedType), Collections.emptyList(), componentName); JetType componentType = null; if (results.isSuccess()) {