KT-2106 Mixed named and positional arguments should be allowed

#KT-2106 Fixed
This commit is contained in:
Andrey Breslav
2013-01-30 21:03:36 +04:00
parent 8fd59feb21
commit 2d2c44ca9d
6 changed files with 36 additions and 46 deletions
@@ -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<? extends ValueArgument> arguments = call.getValueArguments();
for (int i = 0; i < arguments.size(); i++) {
ValueArgument valueArgument = arguments.get(i);
@@ -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"
}
@@ -18,8 +18,10 @@ fun test() {
bar(""<!NO_VALUE_FOR_PARAMETER!>)<!>
bar(1, 1, "")
bar(1, 1, "")
bar(1, <!MIXING_NAMED_AND_POSITIONED_ARGUMENTS!>z<!> = "")
bar(1, <!NAMED_PARAMETER_NOT_FOUND, MIXING_NAMED_AND_POSITIONED_ARGUMENTS!>zz<!> = "",
bar(1, z = "")
bar(1, z = "", y = 2)
bar(z = "", <!MIXING_NAMED_AND_POSITIONED_ARGUMENTS!>1<!>)
bar(1, <!NAMED_PARAMETER_NOT_FOUND!>zz<!> = "",
<!MIXING_NAMED_AND_POSITIONED_ARGUMENTS!><!UNRESOLVED_REFERENCE!>zz<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>foo<!><!>
<!NO_VALUE_FOR_PARAMETER!>)<!>
}
@@ -18,7 +18,7 @@ fun test() {
foo(i = 1, <!ARGUMENT_PASSED_TWICE!>i<!> = 1, s = <!ERROR_COMPILE_TIME_VALUE!>11<!>)
foo(<!TYPE_MISMATCH!>""<!>, <!MIXING_NAMED_AND_POSITIONED_ARGUMENTS!>s<!> = <!ERROR_COMPILE_TIME_VALUE!>2<!>)
foo(<!TYPE_MISMATCH!>""<!>, s = <!ERROR_COMPILE_TIME_VALUE!>2<!>)
foo(i = <!TYPE_MISMATCH!>""<!>, s = <!ERROR_COMPILE_TIME_VALUE!>2<!>, <!MIXING_NAMED_AND_POSITIONED_ARGUMENTS!>33<!>)
@@ -4,6 +4,6 @@ package kt1940
fun foo(<!UNUSED_PARAMETER!>i<!>: Int) {}
fun test() {
foo(1, <!ARGUMENT_PASSED_TWICE, MIXING_NAMED_AND_POSITIONED_ARGUMENTS!>i<!> = 2) //exception
foo(1, <!ARGUMENT_PASSED_TWICE!>i<!> = 2) //exception
foo(i = 1, <!ARGUMENT_PASSED_TWICE!>i<!> = 2) //exception
}
@@ -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() {