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 f3284357758..1d683049e37 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 @@ -103,25 +103,11 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap } } - private final ProcessorState initial = new ProcessorState() { - - @Override - public ProcessorState processNamedArgument(@NotNull ValueArgument argument) { - return namedOnly.processNamedArgument(argument); - } - - @Override - public ProcessorState processPositionedArgument( - @NotNull ValueArgument argument, int index - ) { - return positionedOnly.processPositionedArgument(argument, index); - } - }; - + // We saw only positioned arguments so far private final ProcessorState positionedOnly = new ProcessorState() { @Override public ProcessorState processNamedArgument(@NotNull ValueArgument argument) { - return error.processNamedArgument(argument); + return positionedThenNamed.processNamedArgument(argument); } @Override @@ -159,7 +145,8 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap } }; - private final ProcessorState namedOnly = new ProcessorState() { + // We saw zero or more positioned arguments and then a named one + private final ProcessorState positionedThenNamed = new ProcessorState() { @Override public ProcessorState processNamedArgument(@NotNull ValueArgument argument) { assert argument.isNamed(); @@ -184,25 +171,7 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap } } - return namedOnly; - } - - @Override - public ProcessorState processPositionedArgument( - @NotNull ValueArgument argument, int index - ) { - return error.processPositionedArgument(argument, index); - } - }; - - private final ProcessorState error = new ProcessorState() { - @Override - public ProcessorState processNamedArgument(@NotNull ValueArgument argument) { - namedOnly.processNamedArgument(argument); - - candidateCall.getTrace().report(MIXING_NAMED_AND_POSITIONED_ARGUMENTS.on(argument.getArgumentName())); - setStatus(WEAK_ERROR); - return error; + return positionedThenNamed; } @Override @@ -211,12 +180,13 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap ) { candidateCall.getTrace().report(MIXING_NAMED_AND_POSITIONED_ARGUMENTS.on(argument.asElement())); setStatus(WEAK_ERROR); - return error; + + return positionedThenNamed; } }; public void process() { - ProcessorState state = initial; + ProcessorState state = positionedOnly; List arguments = call.getValueArguments(); for (int i = 0; i < arguments.size(); i++) { ValueArgument valueArgument = arguments.get(i); diff --git a/compiler/testData/codegen/box/defaultArguments/function/mixingNamedAndPositioned.kt b/compiler/testData/codegen/box/defaultArguments/function/mixingNamedAndPositioned.kt new file mode 100644 index 00000000000..cb206b8d271 --- /dev/null +++ b/compiler/testData/codegen/box/defaultArguments/function/mixingNamedAndPositioned.kt @@ -0,0 +1,16 @@ +fun foo(a: String = "Default", b: Int = 1, c: Long = 2): String { + return "$a $b $c" +} + +fun box(): String { + val test1 = foo("test1", 2, c = 3) + if (test1 != "test1 2 3") return test1 + + val test2 = foo("test2", c = 3) + if (test2 != "test2 1 3") return test2 + + val test3 = foo("test3", b = 3) + if (test3 != "test3 3 2") return test3 + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/NamedArgumentsAndDefaultValues.kt b/compiler/testData/diagnostics/tests/NamedArgumentsAndDefaultValues.kt index a6a4a3753af..718923b2f21 100644 --- a/compiler/testData/diagnostics/tests/NamedArgumentsAndDefaultValues.kt +++ b/compiler/testData/diagnostics/tests/NamedArgumentsAndDefaultValues.kt @@ -18,8 +18,10 @@ fun test() { bar("") bar(1, 1, "") bar(1, 1, "") - bar(1, z = "") - bar(1, zz = "", + bar(1, z = "") + bar(1, z = "", y = 2) + bar(z = "", 1) + bar(1, zz = "", zz.foo ) } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.kt b/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.kt index b5f67ee5ab8..a285a9e0f0c 100644 --- a/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.kt +++ b/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.kt @@ -18,7 +18,7 @@ fun test() { foo(i = 1, i = 1, s = 11) - foo("", s = 2) + foo("", s = 2) foo(i = "", s = 2, 33) diff --git a/compiler/testData/diagnostics/tests/checkArguments/kt1940.kt b/compiler/testData/diagnostics/tests/checkArguments/kt1940.kt index 9253288be94..8f4a4ce4193 100644 --- a/compiler/testData/diagnostics/tests/checkArguments/kt1940.kt +++ b/compiler/testData/diagnostics/tests/checkArguments/kt1940.kt @@ -4,6 +4,6 @@ package kt1940 fun foo(i: Int) {} fun test() { - foo(1, i = 2) //exception + foo(1, i = 2) //exception foo(i = 1, i = 2) //exception } \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index e1d4f744868..b91084927d8 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -16,16 +16,13 @@ package org.jetbrains.jet.codegen.generated; -import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestSuite; - -import java.io.File; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.TestMetadata; -import org.jetbrains.jet.codegen.generated.AbstractBlackBoxCodegenTest; +import java.io.File; /** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @@ -1345,6 +1342,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { blackBoxFileByFullPath("compiler/testData/codegen/box/defaultArguments/function/innerExtentionFunctionDoubleTwoArgs.kt"); } + @TestMetadata("mixingNamedAndPositioned.kt") + public void testMixingNamedAndPositioned() throws Exception { + blackBoxFileByFullPath("compiler/testData/codegen/box/defaultArguments/function/mixingNamedAndPositioned.kt"); + } + } public static Test innerSuite() {