'resolveFakeCall' instead of 'resolveExactSignature' invocation
This commit is contained in:
+11
-3
@@ -19,7 +19,9 @@ package org.jetbrains.jet.lang.types.expressions;
|
|||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
import com.intellij.lang.ASTNode;
|
import com.intellij.lang.ASTNode;
|
||||||
|
import com.intellij.openapi.util.Pair;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
|
import com.intellij.psi.impl.source.tree.LeafPsiElement;
|
||||||
import com.intellij.psi.tree.IElementType;
|
import com.intellij.psi.tree.IElementType;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
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.checker.JetTypeChecker;
|
||||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
||||||
import org.jetbrains.jet.lexer.JetTokens;
|
import org.jetbrains.jet.lexer.JetTokens;
|
||||||
|
import org.jetbrains.jet.util.slicedmap.WritableSlice;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -992,9 +995,14 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
Name name = Name.identifier("equals");
|
Name name = Name.identifier("equals");
|
||||||
if (right != null) {
|
if (right != null) {
|
||||||
ExpressionReceiver receiver = ExpressionTypingUtils.safeGetExpressionReceiver(facade, left, context.replaceScope(context.scope));
|
ExpressionReceiver receiver = ExpressionTypingUtils.safeGetExpressionReceiver(facade, left, context.replaceScope(context.scope));
|
||||||
OverloadResolutionResults<FunctionDescriptor> resolutionResults = context.resolveExactSignature(
|
|
||||||
receiver, name,
|
final JetReferenceExpression fakeArgument = JetPsiFactory.createSimpleName(context.expressionTypingServices.getProject(), "fakeArgument");
|
||||||
Collections.singletonList(KotlinBuiltIns.getInstance().getNullableAnyType()));
|
TemporaryBindingTrace traceWithFakeArgumentInfo = TemporaryBindingTrace.create(context.trace, "trace to store fake argument for", name);
|
||||||
|
traceWithFakeArgumentInfo.record(EXPRESSION_TYPE, fakeArgument, KotlinBuiltIns.getInstance().getNullableAnyType());
|
||||||
|
|
||||||
|
OverloadResolutionResults<FunctionDescriptor> resolutionResults = resolveFakeCall(
|
||||||
|
receiver, context.replaceBindingTrace(traceWithFakeArgumentInfo), Collections.<JetExpression>singletonList(fakeArgument), name);
|
||||||
|
|
||||||
if (resolutionResults.isSuccess()) {
|
if (resolutionResults.isSuccess()) {
|
||||||
FunctionDescriptor equals = resolutionResults.getResultingCall().getResultingDescriptor();
|
FunctionDescriptor equals = resolutionResults.getResultingCall().getResultingDescriptor();
|
||||||
context.trace.record(REFERENCE_TARGET, operationSign, equals);
|
context.trace.record(REFERENCE_TARGET, operationSign, equals);
|
||||||
|
|||||||
+2
-2
@@ -327,7 +327,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
|
|
||||||
// Make a fake call loopRange.iterator(), and try to resolve it
|
// Make a fake call loopRange.iterator(), and try to resolve it
|
||||||
Name iterator = Name.identifier("iterator");
|
Name iterator = Name.identifier("iterator");
|
||||||
Pair<Call, OverloadResolutionResults<FunctionDescriptor>> calls = makeAndResolveFakeCall(loopRange, context, iterator);
|
Pair<Call, OverloadResolutionResults<FunctionDescriptor>> calls = makeAndResolveFakeCall(loopRange, context, Collections.<JetExpression>emptyList(), iterator);
|
||||||
Call iteratorCall = calls.getFirst();
|
Call iteratorCall = calls.getFirst();
|
||||||
OverloadResolutionResults<FunctionDescriptor> iteratorResolutionResults = calls.getSecond();
|
OverloadResolutionResults<FunctionDescriptor> iteratorResolutionResults = calls.getSecond();
|
||||||
|
|
||||||
@@ -376,7 +376,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
@NotNull WritableSlice<JetExpression, ResolvedCall<FunctionDescriptor>> resolvedCallKey
|
@NotNull WritableSlice<JetExpression, ResolvedCall<FunctionDescriptor>> resolvedCallKey
|
||||||
) {
|
) {
|
||||||
OverloadResolutionResults<FunctionDescriptor> nextResolutionResults = resolveFakeCall(
|
OverloadResolutionResults<FunctionDescriptor> nextResolutionResults = resolveFakeCall(
|
||||||
new TransientReceiver(iteratorType), context, Name.identifier(name));
|
new TransientReceiver(iteratorType), context, Collections.<JetExpression>emptyList(), Name.identifier(name));
|
||||||
if (nextResolutionResults.isAmbiguity()) {
|
if (nextResolutionResults.isAmbiguity()) {
|
||||||
context.trace.report(ambiguity.on(loopRangeExpression, iteratorType));
|
context.trace.report(ambiguity.on(loopRangeExpression, iteratorType));
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-4
@@ -275,20 +275,22 @@ public class ExpressionTypingUtils {
|
|||||||
public static OverloadResolutionResults<FunctionDescriptor> resolveFakeCall(
|
public static OverloadResolutionResults<FunctionDescriptor> resolveFakeCall(
|
||||||
@NotNull ReceiverDescriptor receiver,
|
@NotNull ReceiverDescriptor receiver,
|
||||||
@NotNull ExpressionTypingContext context,
|
@NotNull ExpressionTypingContext context,
|
||||||
|
@NotNull List<JetExpression> valueArguments,
|
||||||
@NotNull Name name
|
@NotNull Name name
|
||||||
) {
|
) {
|
||||||
return makeAndResolveFakeCall(receiver, context, name).getSecond();
|
return makeAndResolveFakeCall(receiver, context, valueArguments, name).getSecond();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static Pair<Call, OverloadResolutionResults<FunctionDescriptor>> makeAndResolveFakeCall(
|
public static Pair<Call, OverloadResolutionResults<FunctionDescriptor>> makeAndResolveFakeCall(
|
||||||
@NotNull ReceiverDescriptor receiver,
|
@NotNull ReceiverDescriptor receiver,
|
||||||
@NotNull ExpressionTypingContext context,
|
@NotNull ExpressionTypingContext context,
|
||||||
|
@NotNull List<JetExpression> valueArguments,
|
||||||
@NotNull Name name
|
@NotNull Name name
|
||||||
) {
|
) {
|
||||||
final JetReferenceExpression fake = JetPsiFactory.createSimpleName(context.expressionTypingServices.getProject(), "fake");
|
final JetReferenceExpression fake = JetPsiFactory.createSimpleName(context.expressionTypingServices.getProject(), "fake");
|
||||||
TemporaryBindingTrace fakeTrace = TemporaryBindingTrace.create(context.trace, "trace for resolve fake call for", name);
|
TemporaryBindingTrace fakeTrace = TemporaryBindingTrace.create(context.trace, "trace to resolve fake call for", name);
|
||||||
Call call = CallMaker.makeCall(fake, receiver, null, fake, Collections.<ValueArgument>emptyList());
|
Call call = CallMaker.makeCallWithExpressions(fake, receiver, null, fake, valueArguments);
|
||||||
OverloadResolutionResults<FunctionDescriptor> results =
|
OverloadResolutionResults<FunctionDescriptor> results =
|
||||||
context.replaceBindingTrace(fakeTrace).resolveCallWithGivenName(call, fake, name);
|
context.replaceBindingTrace(fakeTrace).resolveCallWithGivenName(call, fake, name);
|
||||||
if (results.isSuccess()) {
|
if (results.isSuccess()) {
|
||||||
@@ -318,7 +320,7 @@ public class ExpressionTypingUtils {
|
|||||||
|
|
||||||
JetType expectedType = getExpectedTypeForComponent(context, entry);
|
JetType expectedType = getExpectedTypeForComponent(context, entry);
|
||||||
OverloadResolutionResults<FunctionDescriptor> results =
|
OverloadResolutionResults<FunctionDescriptor> results =
|
||||||
resolveFakeCall(receiver, context.replaceExpectedType(expectedType), componentName);
|
resolveFakeCall(receiver, context.replaceExpectedType(expectedType), Collections.<JetExpression>emptyList(), componentName);
|
||||||
|
|
||||||
JetType componentType = null;
|
JetType componentType = null;
|
||||||
if (results.isSuccess()) {
|
if (results.isSuccess()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user