logic for fake value arguments creation

moved to 'resolveFakeCall' method
This commit is contained in:
Svetlana Isakova
2012-11-02 16:22:19 +04:00
parent 32391e217a
commit 82e9d1f4fa
4 changed files with 25 additions and 30 deletions
@@ -1089,13 +1089,8 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
if (right != null) {
ExpressionReceiver receiver = ExpressionTypingUtils.safeGetExpressionReceiver(facade, left, context.replaceScope(context.scope));
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<FunctionDescriptor> resolutionResults = resolveFakeCall(
receiver, context.replaceBindingTrace(traceWithFakeArgumentInfo), Collections.<JetExpression>singletonList(fakeArgument), name);
context, receiver, name, KotlinBuiltIns.getInstance().getNullableAnyType());
if (resolutionResults.isSuccess()) {
FunctionDescriptor equals = resolutionResults.getResultingCall().getResultingDescriptor();
@@ -376,7 +376,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
@NotNull WritableSlice<JetExpression, ResolvedCall<FunctionDescriptor>> resolvedCallKey
) {
OverloadResolutionResults<FunctionDescriptor> nextResolutionResults = resolveFakeCall(
new TransientReceiver(iteratorType), context, Collections.<JetExpression>emptyList(), Name.identifier(name));
new TransientReceiver(iteratorType), context, Name.identifier(name));
if (nextResolutionResults.isAmbiguity()) {
context.trace.report(ambiguity.on(loopRangeExpression, iteratorType));
}
@@ -16,6 +16,7 @@
package org.jetbrains.jet.lang.types.expressions;
import com.google.common.collect.Lists;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiElement;
@@ -271,14 +272,29 @@ public class ExpressionTypingUtils {
return typeNames;
}
@NotNull
public static OverloadResolutionResults<FunctionDescriptor> resolveFakeCall(
@NotNull ExpressionTypingContext context, @NotNull ReceiverValue receiver,
@NotNull Name name, @NotNull JetType... argumentTypes
) {
TemporaryBindingTrace traceWithFakeArgumentInfo = TemporaryBindingTrace.create(context.trace, "trace to store fake argument for", name);
int index = 0;
List<JetExpression> fakeArguments = Lists.newArrayList();
for (JetType type : argumentTypes) {
final JetReferenceExpression fakeArgument = JetPsiFactory.createSimpleName(context.expressionTypingServices.getProject(), "fakeArgument" + index++);
fakeArguments.add(fakeArgument);
traceWithFakeArgumentInfo.record(EXPRESSION_TYPE, fakeArgument, type);
}
return makeAndResolveFakeCall(receiver, context.replaceBindingTrace(traceWithFakeArgumentInfo), fakeArguments, name).getSecond();
}
@NotNull
public static OverloadResolutionResults<FunctionDescriptor> resolveFakeCall(
@NotNull ReceiverValue receiver,
@NotNull ExpressionTypingContext context,
@NotNull List<JetExpression> valueArguments,
@NotNull Name name
) {
return makeAndResolveFakeCall(receiver, context, valueArguments, name).getSecond();
return makeAndResolveFakeCall(receiver, context, Collections.<JetExpression>emptyList(), name).getSecond();
}
@NotNull
@@ -320,7 +336,7 @@ public class ExpressionTypingUtils {
JetType expectedType = getExpectedTypeForComponent(context, entry);
OverloadResolutionResults<FunctionDescriptor> results =
resolveFakeCall(receiver, context.replaceExpectedType(expectedType), Collections.<JetExpression>emptyList(), componentName);
resolveFakeCall(receiver, context.replaceExpectedType(expectedType), componentName);
JetType componentType = null;
if (results.isSuccess()) {