diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java index a09075dcf59..fad4f2c7b93 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java @@ -73,12 +73,32 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap @NotNull ResolvedCallImpl candidateCall, @NotNull Set unmappedArguments ) { - DelegatingBindingTrace traceForCall = candidateCall.getTrace(); Map varargs = Maps.newHashMap(); Set usedParameters = Sets.newHashSet(); - D candidate = candidateCall.getCandidateDescriptor(); + Status status = processArgumentsInParens(call, candidateCall, unmappedArguments, varargs, usedParameters); + status = processFunctionLiteralArguments(call, candidateCall, varargs, usedParameters, status); + + status = reportUnusedParameters(tracing, candidateCall, usedParameters, status); + + status = checkReceiverArgument(call, tracing, candidateCall, status); + + assert (candidateCall.getThisObject().exists() == (candidateCall.getResultingDescriptor().getExpectedThisObject() != null)) + : "Shouldn't happen because of TaskPrioritizer: " + candidateCall.getCandidateDescriptor(); + + return status; + } + + private static Status processArgumentsInParens( + Call call, + ResolvedCallImpl candidateCall, + Set unmappedArguments, + Map varargs, + Set usedParameters + ) { + DelegatingBindingTrace traceForCall = candidateCall.getTrace(); + D candidate = candidateCall.getCandidateDescriptor(); List valueParameters = candidate.getValueParameters(); Map parameterByName = Maps.newHashMap(); @@ -151,6 +171,19 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap } } } + return status; + } + + private static Status processFunctionLiteralArguments( + Call call, + ResolvedCallImpl candidateCall, + Map varargs, + Set usedParameters, + Status status + ) { + D candidate = candidateCall.getCandidateDescriptor(); + DelegatingBindingTrace traceForCall = candidateCall.getTrace(); + List valueParameters = candidate.getValueParameters(); List functionLiteralArguments = call.getFunctionLiteralArguments(); if (!functionLiteralArguments.isEmpty()) { @@ -192,8 +225,18 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap status = WEAK_ERROR; } } + return status; + } + private static Status reportUnusedParameters( + TracingStrategy tracing, + ResolvedCallImpl candidateCall, + Set usedParameters, + Status status + ) { + DelegatingBindingTrace traceForCall = candidateCall.getTrace(); + List valueParameters = candidateCall.getCandidateDescriptor().getValueParameters(); for (ValueParameterDescriptor valueParameter : valueParameters) { if (!usedParameters.contains(valueParameter)) { if (valueParameter.hasDefaultValue()) { @@ -208,6 +251,17 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap } } } + return status; + } + + private static Status checkReceiverArgument( + Call call, + TracingStrategy tracing, + ResolvedCallImpl candidateCall, + Status status + ) { + DelegatingBindingTrace traceForCall = candidateCall.getTrace(); + D candidate = candidateCall.getCandidateDescriptor(); ReceiverParameterDescriptor receiverParameter = candidate.getReceiverParameter(); ReceiverValue receiverArgument = candidateCall.getReceiverArgument(); @@ -224,13 +278,15 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap status = ERROR; } } - - assert (candidateCall.getThisObject().exists() == (candidateCall.getResultingDescriptor().getExpectedThisObject() != null)) : "Shouldn't happen because of TaskPrioritizer: " + candidateCall.getCandidateDescriptor(); - return status; } - private static Status put(ResolvedCallImpl candidateCall, ValueParameterDescriptor valueParameterDescriptor, ValueArgument valueArgument, Map varargs) { + private static Status put( + ResolvedCallImpl candidateCall, + ValueParameterDescriptor valueParameterDescriptor, + ValueArgument valueArgument, + Map varargs + ) { Status error = OK; if (valueParameterDescriptor.getVarargElementType() != null) { VarargValueArgument vararg = varargs.get(valueParameterDescriptor);