ResolveMode enum to {TOP_LEVEL_CALL, NESTED_CALL}
 completeValueArgumentsInference to completeNestedCallsInference
This commit is contained in:
Svetlana Isakova
2013-02-07 19:41:19 +04:00
parent c069eedc9b
commit ff4a9fdab3
8 changed files with 23 additions and 23 deletions
@@ -181,11 +181,11 @@ public class ArgumentTypeResolver {
if (expression instanceof JetCallExpression) { if (expression instanceof JetCallExpression) {
result = callExpressionResolver.getCallExpressionTypeInfoForCall( result = callExpressionResolver.getCallExpressionTypeInfoForCall(
(JetCallExpression) expression, ReceiverValue.NO_RECEIVER, null, (JetCallExpression) expression, ReceiverValue.NO_RECEIVER, null,
context.replaceExpectedType(TypeUtils.NO_EXPECTED_TYPE), ResolveMode.INTERNAL); context.replaceExpectedType(TypeUtils.NO_EXPECTED_TYPE), ResolveMode.NESTED_CALL);
} }
if (expression instanceof JetQualifiedExpression) { if (expression instanceof JetQualifiedExpression) {
result = callExpressionResolver.getQualifiedExpressionExtendedTypeInfo( result = callExpressionResolver.getQualifiedExpressionExtendedTypeInfo(
(JetQualifiedExpression) expression, context.replaceExpectedType(TypeUtils.NO_EXPECTED_TYPE), ResolveMode.INTERNAL); (JetQualifiedExpression) expression, context.replaceExpectedType(TypeUtils.NO_EXPECTED_TYPE), ResolveMode.NESTED_CALL);
} }
if (result != null) { if (result != null) {
recordExpressionType(expression, context, result.getTypeInfo()); recordExpressionType(expression, context, result.getTypeInfo());
@@ -159,7 +159,7 @@ public class CallExpressionResolver {
if (!results.isNothing()) { if (!results.isNothing()) {
checkSuper(receiver, results, context.trace, callExpression); checkSuper(receiver, results, context.trace, callExpression);
result[0] = true; result[0] = true;
if (results.isSingleResult() && resolveMode == ResolveMode.NORMAL) { if (results.isSingleResult() && resolveMode == ResolveMode.TOP_LEVEL_CALL) {
if (CallResolverUtil.hasReturnTypeDependentOnNotInferredParams(results.getResultingCall())) { if (CallResolverUtil.hasReturnTypeDependentOnNotInferredParams(results.getResultingCall())) {
return null; return null;
} }
@@ -179,7 +179,7 @@ public class CallExpressionResolver {
CallResolver callResolver = expressionTypingServices.getCallResolver(); CallResolver callResolver = expressionTypingServices.getCallResolver();
Call call = CallMaker.makePropertyCall(receiver, callOperationNode, nameExpression); Call call = CallMaker.makePropertyCall(receiver, callOperationNode, nameExpression);
OverloadResolutionResults<VariableDescriptor> resolutionResult = callResolver.resolveSimpleProperty( OverloadResolutionResults<VariableDescriptor> resolutionResult = callResolver.resolveSimpleProperty(
BasicCallResolutionContext.create(context.replaceBindingTrace(traceForVariable), call, ResolveMode.NORMAL)); BasicCallResolutionContext.create(context.replaceBindingTrace(traceForVariable), call, ResolveMode.TOP_LEVEL_CALL));
if (!resolutionResult.isNothing()) { if (!resolutionResult.isNothing()) {
traceForVariable.commit(); traceForVariable.commit();
checkSuper(receiver, resolutionResult, context.trace, nameExpression); checkSuper(receiver, resolutionResult, context.trace, nameExpression);
@@ -223,7 +223,7 @@ public class CallExpressionResolver {
Call call = CallMaker.makeCall(nameExpression, receiver, callOperationNode, nameExpression, Collections.<ValueArgument>emptyList()); Call call = CallMaker.makeCall(nameExpression, receiver, callOperationNode, nameExpression, Collections.<ValueArgument>emptyList());
TemporaryBindingTrace traceForFunction = TemporaryBindingTrace.create(context.trace, "trace to resolve as function", nameExpression); TemporaryBindingTrace traceForFunction = TemporaryBindingTrace.create(context.trace, "trace to resolve as function", nameExpression);
ResolvedCall<FunctionDescriptor> resolvedCall = getResolvedCallForFunction(call, nameExpression, receiver, context, ResolveMode.NORMAL, result); ResolvedCall<FunctionDescriptor> resolvedCall = getResolvedCallForFunction(call, nameExpression, receiver, context, ResolveMode.TOP_LEVEL_CALL, result);
if (result[0]) { if (result[0]) {
FunctionDescriptor functionDescriptor = resolvedCall != null ? resolvedCall.getResultingDescriptor() : null; FunctionDescriptor functionDescriptor = resolvedCall != null ? resolvedCall.getResultingDescriptor() : null;
traceForFunction.commit(); traceForFunction.commit();
@@ -240,7 +240,7 @@ public class CallExpressionResolver {
@NotNull @NotNull
public JetTypeInfo getCallExpressionTypeInfo(@NotNull JetCallExpression callExpression, @NotNull ReceiverValue receiver, public JetTypeInfo getCallExpressionTypeInfo(@NotNull JetCallExpression callExpression, @NotNull ReceiverValue receiver,
@Nullable ASTNode callOperationNode, @NotNull ResolutionContext context) { @Nullable ASTNode callOperationNode, @NotNull ResolutionContext context) {
return getCallExpressionTypeInfoForCall(callExpression, receiver, callOperationNode, context, ResolveMode.NORMAL).getTypeInfo(); return getCallExpressionTypeInfoForCall(callExpression, receiver, callOperationNode, context, ResolveMode.TOP_LEVEL_CALL).getTypeInfo();
} }
@NotNull @NotNull
@@ -250,7 +250,7 @@ public class CallExpressionResolver {
) { ) {
TypeInfoForCall typeInfoForCall = getCallExpressionTypeInfoForCallWithoutFinalTypeCheck(callExpression, receiver, callOperationNode, TypeInfoForCall typeInfoForCall = getCallExpressionTypeInfoForCallWithoutFinalTypeCheck(callExpression, receiver, callOperationNode,
context, resolveMode); context, resolveMode);
if (resolveMode == ResolveMode.NORMAL) { if (resolveMode == ResolveMode.TOP_LEVEL_CALL) {
DataFlowUtils.checkType(typeInfoForCall.getType(), callExpression, context, typeInfoForCall.getDataFlowInfo()); DataFlowUtils.checkType(typeInfoForCall.getType(), callExpression, context, typeInfoForCall.getDataFlowInfo());
} }
return typeInfoForCall; return typeInfoForCall;
@@ -352,7 +352,7 @@ public class CallExpressionResolver {
@NotNull @NotNull
public JetTypeInfo getQualifiedExpressionTypeInfo(@NotNull JetQualifiedExpression expression, @NotNull ResolutionContext context) { public JetTypeInfo getQualifiedExpressionTypeInfo(@NotNull JetQualifiedExpression expression, @NotNull ResolutionContext context) {
return getQualifiedExpressionExtendedTypeInfo(expression, context, ResolveMode.NORMAL).getTypeInfo(); return getQualifiedExpressionExtendedTypeInfo(expression, context, ResolveMode.TOP_LEVEL_CALL).getTypeInfo();
} }
@NotNull @NotNull
@@ -392,7 +392,7 @@ public class CallExpressionResolver {
context.trace.record(BindingContext.EXPRESSION_TYPE, selectorExpression, selectorReturnType); context.trace.record(BindingContext.EXPRESSION_TYPE, selectorExpression, selectorReturnType);
} }
JetTypeInfo typeInfo = JetTypeInfo.create(selectorReturnType, selectorReturnTypeInfo.getDataFlowInfo()); JetTypeInfo typeInfo = JetTypeInfo.create(selectorReturnType, selectorReturnTypeInfo.getDataFlowInfo());
if (resolveMode == ResolveMode.NORMAL) { if (resolveMode == ResolveMode.TOP_LEVEL_CALL) {
DataFlowUtils.checkType(typeInfo.getType(), expression, context, typeInfo.getDataFlowInfo()); DataFlowUtils.checkType(typeInfo.getType(), expression, context, typeInfo.getDataFlowInfo());
} }
return TypeInfoForCall.create(typeInfo, selectorReturnTypeInfo); return TypeInfoForCall.create(typeInfo, selectorReturnTypeInfo);
@@ -126,7 +126,7 @@ public class CallResolver {
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull DataFlowInfo dataFlowInfo @NotNull DataFlowInfo dataFlowInfo
) { ) {
return resolveFunctionCall(BasicCallResolutionContext.create(trace, scope, call, expectedType, dataFlowInfo, ResolveMode.NORMAL, false)); return resolveFunctionCall(BasicCallResolutionContext.create(trace, scope, call, expectedType, dataFlowInfo, ResolveMode.TOP_LEVEL_CALL, false));
} }
@NotNull @NotNull
@@ -292,7 +292,7 @@ public class CallResolver {
if (prioritizedTasks.isEmpty()) { if (prioritizedTasks.isEmpty()) {
return results; return results;
} }
if (context.resolveMode == ResolveMode.INTERNAL) return results; if (context.resolveMode == ResolveMode.NESTED_CALL) return results;
TracingStrategy tracing = prioritizedTasks.iterator().next().tracing; TracingStrategy tracing = prioritizedTasks.iterator().next().tracing;
return completeTypeInferenceDependentOnExpectedType(context, results, tracing); return completeTypeInferenceDependentOnExpectedType(context, results, tracing);
@@ -335,7 +335,7 @@ public class CallResolver {
if (!resolvedCall.hasUnknownTypeParameters()) { if (!resolvedCall.hasUnknownTypeParameters()) {
CallCandidateResolutionContext<D> callCandidateResolutionContext = CallCandidateResolutionContext<D> callCandidateResolutionContext =
CallCandidateResolutionContext.createForCallBeingAnalyzed((ResolvedCallImpl<D>) resolvedCall, context, tracing); CallCandidateResolutionContext.createForCallBeingAnalyzed((ResolvedCallImpl<D>) resolvedCall, context, tracing);
candidateResolver.completeValueArgumentsInference(callCandidateResolutionContext); candidateResolver.completeNestedCallsInference(callCandidateResolutionContext);
return results; return results;
} }
ResolvedCallImpl<D> copy = CallResolverUtil.copy((ResolvedCallImpl<D>) resolvedCall, context); ResolvedCallImpl<D> copy = CallResolverUtil.copy((ResolvedCallImpl<D>) resolvedCall, context);
@@ -229,7 +229,7 @@ public class CandidateResolver {
if (!constraintSystem.isSuccessful()) { if (!constraintSystem.isSuccessful()) {
resolvedCall.setResultingSubstitutor(constraintSystemWithoutExpectedTypeConstraint.getResultingSubstitutor()); resolvedCall.setResultingSubstitutor(constraintSystemWithoutExpectedTypeConstraint.getResultingSubstitutor());
completeValueArgumentsInference(context); completeNestedCallsInference(context);
List<JetType> argumentTypes = checkValueArgumentTypes(context, resolvedCall, context.trace, List<JetType> argumentTypes = checkValueArgumentTypes(context, resolvedCall, context.trace,
RESOLVE_FUNCTION_ARGUMENTS).argumentTypes; RESOLVE_FUNCTION_ARGUMENTS).argumentTypes;
JetType receiverType = resolvedCall.getReceiverArgument().exists() ? resolvedCall.getReceiverArgument().getType() : null; JetType receiverType = resolvedCall.getReceiverArgument().exists() ? resolvedCall.getReceiverArgument().getType() : null;
@@ -256,7 +256,7 @@ public class CandidateResolver {
} }
resolvedCall.setResultingSubstitutor(constraintSystem.getResultingSubstitutor()); resolvedCall.setResultingSubstitutor(constraintSystem.getResultingSubstitutor());
completeValueArgumentsInference(context); completeNestedCallsInference(context);
// Here we type check the arguments with inferred types expected // Here we type check the arguments with inferred types expected
checkAllValueArguments(context, context.trace, RESOLVE_FUNCTION_ARGUMENTS); checkAllValueArguments(context, context.trace, RESOLVE_FUNCTION_ARGUMENTS);
@@ -273,7 +273,7 @@ public class CandidateResolver {
} }
} }
public <D extends CallableDescriptor> void completeValueArgumentsInference( public <D extends CallableDescriptor> void completeNestedCallsInference(
@NotNull CallCandidateResolutionContext<D> context @NotNull CallCandidateResolutionContext<D> context
) { ) {
ResolvedCallImpl<D> resolvedCall = context.candidateCall; ResolvedCallImpl<D> resolvedCall = context.candidateCall;
@@ -296,12 +296,12 @@ public class CandidateResolver {
if (storedContextForArgument == null) continue; if (storedContextForArgument == null) continue;
CallCandidateResolutionContext<FunctionDescriptor> contextForArgument = CallCandidateResolutionContext<FunctionDescriptor> contextForArgument =
storedContextForArgument.replaceResolveMode(ResolveMode.NORMAL).replaceBindingTrace(context.trace).replaceExpectedType(expectedType); storedContextForArgument.replaceResolveMode(ResolveMode.TOP_LEVEL_CALL).replaceBindingTrace(context.trace).replaceExpectedType(expectedType);
if (contextForArgument.candidateCall.hasUnknownTypeParameters()) { if (contextForArgument.candidateCall.hasUnknownTypeParameters()) {
completeTypeInferenceDependentOnExpectedTypeForCall(contextForArgument, true); completeTypeInferenceDependentOnExpectedTypeForCall(contextForArgument, true);
} }
else { else {
completeValueArgumentsInference(contextForArgument); completeNestedCallsInference(contextForArgument);
} }
} }
} }
@@ -17,6 +17,6 @@
package org.jetbrains.jet.lang.resolve.calls.context; package org.jetbrains.jet.lang.resolve.calls.context;
public enum ResolveMode { public enum ResolveMode {
NORMAL, TOP_LEVEL_CALL,
INTERNAL NESTED_CALL
} }
@@ -106,6 +106,6 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull @NotNull
public OverloadResolutionResults<FunctionDescriptor> resolveCallWithGivenName(@NotNull Call call, @NotNull JetReferenceExpression functionReference, @NotNull Name name) { public OverloadResolutionResults<FunctionDescriptor> resolveCallWithGivenName(@NotNull Call call, @NotNull JetReferenceExpression functionReference, @NotNull Name name) {
return expressionTypingServices.getCallResolver().resolveCallWithGivenName( return expressionTypingServices.getCallResolver().resolveCallWithGivenName(
BasicCallResolutionContext.create(this, call, ResolveMode.NORMAL), functionReference, name); BasicCallResolutionContext.create(this, call, ResolveMode.TOP_LEVEL_CALL), functionReference, name);
} }
} }
@@ -2125,9 +2125,9 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/diagnostics/tests/inference/complicated"), "kt", true); JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/diagnostics/tests/inference/complicated"), "kt", true);
} }
@TestMetadata("completeValueArgumentsInference.kt") @TestMetadata("completeNestedCallsInference.kt")
public void testCompleteValueArgumentsInference() throws Exception { public void testCompleteNestedCallsInference() throws Exception {
doTest("compiler/testData/diagnostics/tests/inference/complicated/completeValueArgumentsInference.kt"); doTest("compiler/testData/diagnostics/tests/inference/complicated/completeNestedCallsInference.kt");
} }
} }