diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index 222d0143e38..bed5e619a86 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.resolve.calls; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; @@ -407,15 +406,17 @@ public class CallResolver { return; } + Set unmappedArguments = Sets.newLinkedHashSet(); ValueArgumentsToParametersMapper.Status argumentMappingStatus = ValueArgumentsToParametersMapper.mapValueArgumentsToParameters(context.call, context.tracing, - candidateCall); + candidateCall, unmappedArguments); if (!argumentMappingStatus.isSuccess()) { candidateCall.addStatus(OTHER_ERROR); if (argumentMappingStatus == ValueArgumentsToParametersMapper.Status.ERROR) { checkTypesWithNoCallee(context.toBasic()); return; } + checkUnknownArgumentTypes(context.toBasic(), unmappedArguments); } List jetTypeArguments = context.call.getTypeArguments(); @@ -611,6 +612,15 @@ public class CallResolver { } } + private void checkUnknownArgumentTypes(BasicResolutionContext context, Set unknownArguments) { + for (ValueArgument valueArgument : unknownArguments) { + JetExpression argumentExpression = valueArgument.getArgumentExpression(); + if (argumentExpression != null) { + expressionTypingServices.getType(context.scope, argumentExpression, NO_EXPECTED_TYPE, context.trace); + } + } + } + private static void replaceValueParametersWithSubstitutedOnes( ResolvedCallImpl candidateCall, @NotNull D substitutedDescriptor) { 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 769d11f2881..105ec16e5f2 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 @@ -71,7 +71,8 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap public static Status mapValueArgumentsToParameters( @NotNull Call call, @NotNull TracingStrategy tracing, - @NotNull ResolvedCallImpl candidateCall + @NotNull ResolvedCallImpl candidateCall, + @NotNull Set unmappedArguments ) { TemporaryBindingTrace temporaryTrace = candidateCall.getTrace(); Map varargs = Maps.newHashMap(); @@ -99,14 +100,19 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap ValueParameterDescriptor valueParameterDescriptor = parameterByName.get(nameReference.getReferencedName()); if (valueParameterDescriptor == null) { temporaryTrace.report(NAMED_PARAMETER_NOT_FOUND.on(nameReference)); + unmappedArguments.add(valueArgument); status = ERROR; } else { + temporaryTrace.record(REFERENCE_TARGET, nameReference, valueParameterDescriptor); if (!usedParameters.add(valueParameterDescriptor)) { temporaryTrace.report(ARGUMENT_PASSED_TWICE.on(nameReference)); + unmappedArguments.add(valueArgument); + status = WEAK_ERROR; + } + else { + status = status.compose(put(candidateCall, valueParameterDescriptor, valueArgument, varargs)); } - temporaryTrace.record(REFERENCE_TARGET, nameReference, valueParameterDescriptor); - status = status.compose(put(candidateCall, valueParameterDescriptor, valueArgument, varargs)); } if (somePositioned) { temporaryTrace.report(MIXING_NAMED_AND_POSITIONED_ARGUMENTS.on(nameReference)); @@ -134,12 +140,14 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap } else { temporaryTrace.report(TOO_MANY_ARGUMENTS.on(valueArgument.asElement(), candidate)); - status = ERROR; + unmappedArguments.add(valueArgument); + status = WEAK_ERROR; } } else { temporaryTrace.report(TOO_MANY_ARGUMENTS.on(valueArgument.asElement(), candidate)); - status = ERROR; + unmappedArguments.add(valueArgument); + status = WEAK_ERROR; } } } diff --git a/compiler/testData/diagnostics/tests/spreadArguments/SpreadVarargs.jet b/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.jet similarity index 100% rename from compiler/testData/diagnostics/tests/spreadArguments/SpreadVarargs.jet rename to compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.jet diff --git a/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.jet b/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.jet new file mode 100644 index 00000000000..e5d1371119a --- /dev/null +++ b/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.jet @@ -0,0 +1,8 @@ +package a + +fun foo(i: Int, s: String) { +} + +fun test() { + foo("", 1, xx) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/checkArguments/kt1940.jet b/compiler/testData/diagnostics/tests/checkArguments/kt1940.jet new file mode 100644 index 00000000000..9253288be94 --- /dev/null +++ b/compiler/testData/diagnostics/tests/checkArguments/kt1940.jet @@ -0,0 +1,9 @@ +//KT-1940 Exception while repeating named parameters +package kt1940 + +fun foo(i: Int) {} + +fun test() { + foo(1, i = 2) //exception + foo(i = 1, i = 2) //exception +} \ No newline at end of file