KT-2106 Mixed named and positional arguments should be allowed
#KT-2106 Fixed
This commit is contained in:
+8
-38
@@ -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
|
||||
}
|
||||
+6
-4
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user