extracted 'getResultingCall' method

rewrote 'getResultingType' in terms of it
This commit is contained in:
Svetlana Isakova
2013-06-21 14:16:27 +04:00
parent 2eadd5202d
commit 0eed0c6c7f
6 changed files with 43 additions and 15 deletions
@@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults; import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsImpl; import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsImpl;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsUtil;
import org.jetbrains.jet.lang.resolve.calls.util.CallMaker; import org.jetbrains.jet.lang.resolve.calls.util.CallMaker;
import org.jetbrains.jet.lang.resolve.constants.ConstantUtils; import org.jetbrains.jet.lang.resolve.constants.ConstantUtils;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
@@ -193,11 +194,7 @@ public class CallExpressionResolver {
if (!results.isNothing()) { if (!results.isNothing()) {
checkSuper(call.getExplicitReceiver(), results, context.trace, callExpression); checkSuper(call.getExplicitReceiver(), results, context.trace, callExpression);
result[0] = true; result[0] = true;
if (results.isSingleResult() && context.resolveMode == ResolveMode.TOP_LEVEL_CALL) { return OverloadResolutionResultsUtil.getResultingCall(results, context.resolveMode);
if (!CallResolverUtil.hasInferredReturnType(results.getResultingCall())) return null;
}
return results.isSingleResult() ? results.getResultingCall() : null;
} }
result[0] = false; result[0] = false;
return null; return null;
@@ -20,6 +20,9 @@ import com.google.common.collect.Lists;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.resolve.calls.CallResolverUtil;
import org.jetbrains.jet.lang.resolve.calls.context.ResolveMode;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
@@ -35,10 +38,24 @@ public class OverloadResolutionResultsUtil {
} }
@Nullable @Nullable
public static <D extends CallableDescriptor> JetType getResultType(OverloadResolutionResults<D> results) { public static <D extends CallableDescriptor> JetType getResultingType(
if (results.isSuccess()) { @NotNull OverloadResolutionResults<D> results,
return results.getResultingDescriptor().getReturnType(); @NotNull ResolveMode resolveMode
) {
ResolvedCall<D> resultingCall = getResultingCall((OverloadResolutionResultsImpl<D>) results, resolveMode);
return resultingCall != null ? resultingCall.getResultingDescriptor().getReturnType() : null;
}
@Nullable
public static <D extends CallableDescriptor> ResolvedCallWithTrace<D> getResultingCall(
@NotNull OverloadResolutionResultsImpl<D> results,
@NotNull ResolveMode resolveMode
) {
if (results.isSingleResult() && resolveMode == ResolveMode.TOP_LEVEL_CALL) {
if (!CallResolverUtil.hasInferredReturnType(results.getResultingCall())) {
return null;
}
} }
return null; return results.isSingleResult() ? results.getResultingCall() : null;
} }
} }
@@ -36,8 +36,6 @@ import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowValueFactory;
import org.jetbrains.jet.lang.resolve.calls.autocasts.Nullability; import org.jetbrains.jet.lang.resolve.calls.autocasts.Nullability;
import org.jetbrains.jet.lang.resolve.calls.context.CheckValueArgumentsMode; import org.jetbrains.jet.lang.resolve.calls.context.CheckValueArgumentsMode;
import org.jetbrains.jet.lang.resolve.calls.context.ExpressionPosition; import org.jetbrains.jet.lang.resolve.calls.context.ExpressionPosition;
import org.jetbrains.jet.lang.resolve.calls.context.ResolutionResultsCache;
import org.jetbrains.jet.lang.resolve.calls.context.ResolveMode;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace;
import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall; import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults; import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults;
@@ -1055,7 +1053,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
CallMaker.makeCallWithExpressions(callElement, receiver, null, operationSign, Collections.singletonList(left)), CallMaker.makeCallWithExpressions(callElement, receiver, null, operationSign, Collections.singletonList(left)),
operationSign, operationSign,
OperatorConventions.CONTAINS); OperatorConventions.CONTAINS);
JetType containsType = OverloadResolutionResultsUtil.getResultType(resolutionResult); JetType containsType = OverloadResolutionResultsUtil.getResultingType(resolutionResult, context.resolveMode);
ensureBooleanResult(operationSign, OperatorConventions.CONTAINS, containsType, context); ensureBooleanResult(operationSign, OperatorConventions.CONTAINS, containsType, context);
if (left != null) { if (left != null) {
@@ -1165,7 +1163,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
dataFlowInfo = facade.getTypeInfo(right, contextWithDataFlow).getDataFlowInfo(); dataFlowInfo = facade.getTypeInfo(right, contextWithDataFlow).getDataFlowInfo();
} }
return JetTypeInfo.create(OverloadResolutionResultsUtil.getResultType(resolutionResults), dataFlowInfo); return JetTypeInfo.create(OverloadResolutionResultsUtil.getResultingType(resolutionResults, context.resolveMode), dataFlowInfo);
} }
@NotNull @NotNull
@@ -240,14 +240,15 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
TemporaryBindingTrace assignmentOperationTrace = TemporaryBindingTrace.create(context.trace, "trace to check assignment operation like '+=' for", expression); TemporaryBindingTrace assignmentOperationTrace = TemporaryBindingTrace.create(context.trace, "trace to check assignment operation like '+=' for", expression);
OverloadResolutionResults<FunctionDescriptor> assignmentOperationDescriptors = BasicExpressionTypingVisitor.getResolutionResultsForBinaryCall( OverloadResolutionResults<FunctionDescriptor> assignmentOperationDescriptors = BasicExpressionTypingVisitor.getResolutionResultsForBinaryCall(
scope, name, context.replaceBindingTrace(assignmentOperationTrace).replaceResolutionResultsCache(), expression, receiver); scope, name, context.replaceBindingTrace(assignmentOperationTrace).replaceResolutionResultsCache(), expression, receiver);
JetType assignmentOperationType = OverloadResolutionResultsUtil.getResultType(assignmentOperationDescriptors); JetType assignmentOperationType = OverloadResolutionResultsUtil.getResultingType(assignmentOperationDescriptors,
context.resolveMode);
// Check for '+' // Check for '+'
Name counterpartName = OperatorConventions.BINARY_OPERATION_NAMES.get(OperatorConventions.ASSIGNMENT_OPERATION_COUNTERPARTS.get(operationType)); Name counterpartName = OperatorConventions.BINARY_OPERATION_NAMES.get(OperatorConventions.ASSIGNMENT_OPERATION_COUNTERPARTS.get(operationType));
TemporaryBindingTrace binaryOperationTrace = TemporaryBindingTrace.create(context.trace, "trace to check binary operation like '+' for", expression); TemporaryBindingTrace binaryOperationTrace = TemporaryBindingTrace.create(context.trace, "trace to check binary operation like '+' for", expression);
OverloadResolutionResults<FunctionDescriptor> binaryOperationDescriptors = BasicExpressionTypingVisitor.getResolutionResultsForBinaryCall( OverloadResolutionResults<FunctionDescriptor> binaryOperationDescriptors = BasicExpressionTypingVisitor.getResolutionResultsForBinaryCall(
scope, counterpartName, context.replaceBindingTrace(binaryOperationTrace).replaceResolutionResultsCache(), expression, receiver); scope, counterpartName, context.replaceBindingTrace(binaryOperationTrace).replaceResolutionResultsCache(), expression, receiver);
JetType binaryOperationType = OverloadResolutionResultsUtil.getResultType(binaryOperationDescriptors); JetType binaryOperationType = OverloadResolutionResultsUtil.getResultingType(binaryOperationDescriptors, context.resolveMode);
JetType type = assignmentOperationType != null ? assignmentOperationType : binaryOperationType; JetType type = assignmentOperationType != null ? assignmentOperationType : binaryOperationType;
if (assignmentOperationType != null && binaryOperationType != null) { if (assignmentOperationType != null && binaryOperationType != null) {
@@ -0,0 +1,10 @@
package aaa
fun <T> T.foo(t: T) = t
fun id<T>(t: T) = t
fun a() {
val i = id(2 foo 3)
i : Int // i shouldn't be resolved to error element
}
@@ -2846,6 +2846,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
doTest("compiler/testData/diagnostics/tests/inference/nestedCalls/completeNestedForVariableAsFunctionCall.kt"); doTest("compiler/testData/diagnostics/tests/inference/nestedCalls/completeNestedForVariableAsFunctionCall.kt");
} }
@TestMetadata("inferenceForNestedBinaryCall.kt")
public void testInferenceForNestedBinaryCall() throws Exception {
doTest("compiler/testData/diagnostics/tests/inference/nestedCalls/inferenceForNestedBinaryCall.kt");
}
@TestMetadata("kt3395.kt") @TestMetadata("kt3395.kt")
public void testKt3395() throws Exception { public void testKt3395() throws Exception {
doTest("compiler/testData/diagnostics/tests/inference/nestedCalls/kt3395.kt"); doTest("compiler/testData/diagnostics/tests/inference/nestedCalls/kt3395.kt");