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() {
|
// We saw only positioned arguments so far
|
||||||
|
|
||||||
@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);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private final ProcessorState positionedOnly = new ProcessorState() {
|
private final ProcessorState positionedOnly = new ProcessorState() {
|
||||||
@Override
|
@Override
|
||||||
public ProcessorState processNamedArgument(@NotNull ValueArgument argument) {
|
public ProcessorState processNamedArgument(@NotNull ValueArgument argument) {
|
||||||
return error.processNamedArgument(argument);
|
return positionedThenNamed.processNamedArgument(argument);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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
|
@Override
|
||||||
public ProcessorState processNamedArgument(@NotNull ValueArgument argument) {
|
public ProcessorState processNamedArgument(@NotNull ValueArgument argument) {
|
||||||
assert argument.isNamed();
|
assert argument.isNamed();
|
||||||
@@ -184,25 +171,7 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return namedOnly;
|
return positionedThenNamed;
|
||||||
}
|
|
||||||
|
|
||||||
@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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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()));
|
candidateCall.getTrace().report(MIXING_NAMED_AND_POSITIONED_ARGUMENTS.on(argument.asElement()));
|
||||||
setStatus(WEAK_ERROR);
|
setStatus(WEAK_ERROR);
|
||||||
return error;
|
|
||||||
|
return positionedThenNamed;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public void process() {
|
public void process() {
|
||||||
ProcessorState state = initial;
|
ProcessorState state = positionedOnly;
|
||||||
List<? extends ValueArgument> arguments = call.getValueArguments();
|
List<? extends ValueArgument> arguments = call.getValueArguments();
|
||||||
for (int i = 0; i < arguments.size(); i++) {
|
for (int i = 0; i < arguments.size(); i++) {
|
||||||
ValueArgument valueArgument = arguments.get(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(""<!NO_VALUE_FOR_PARAMETER!>)<!>
|
||||||
bar(1, 1, "")
|
bar(1, 1, "")
|
||||||
bar(1, 1, "")
|
bar(1, 1, "")
|
||||||
bar(1, <!MIXING_NAMED_AND_POSITIONED_ARGUMENTS!>z<!> = "")
|
bar(1, z = "")
|
||||||
bar(1, <!NAMED_PARAMETER_NOT_FOUND, MIXING_NAMED_AND_POSITIONED_ARGUMENTS!>zz<!> = "",
|
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<!><!>
|
<!MIXING_NAMED_AND_POSITIONED_ARGUMENTS!><!UNRESOLVED_REFERENCE!>zz<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>foo<!><!>
|
||||||
<!NO_VALUE_FOR_PARAMETER!>)<!>
|
<!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(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<!>)
|
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 foo(<!UNUSED_PARAMETER!>i<!>: Int) {}
|
||||||
|
|
||||||
fun test() {
|
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
|
foo(i = 1, <!ARGUMENT_PASSED_TWICE!>i<!> = 2) //exception
|
||||||
}
|
}
|
||||||
+6
-4
@@ -16,16 +16,13 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.codegen.generated;
|
package org.jetbrains.jet.codegen.generated;
|
||||||
|
|
||||||
import junit.framework.Assert;
|
|
||||||
import junit.framework.Test;
|
import junit.framework.Test;
|
||||||
import junit.framework.TestSuite;
|
import junit.framework.TestSuite;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import org.jetbrains.jet.JetTestUtils;
|
import org.jetbrains.jet.JetTestUtils;
|
||||||
import org.jetbrains.jet.test.InnerTestClasses;
|
import org.jetbrains.jet.test.InnerTestClasses;
|
||||||
import org.jetbrains.jet.test.TestMetadata;
|
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 */
|
/** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */
|
||||||
@SuppressWarnings("all")
|
@SuppressWarnings("all")
|
||||||
@@ -1345,6 +1342,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
blackBoxFileByFullPath("compiler/testData/codegen/box/defaultArguments/function/innerExtentionFunctionDoubleTwoArgs.kt");
|
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() {
|
public static Test innerSuite() {
|
||||||
|
|||||||
Reference in New Issue
Block a user