Correct report of NO_VALUE_FOR_PARAMETER when function call contains no brackets and lambda at the end #KT-7813 Fixed

This commit is contained in:
Mikhail Glukhikh
2016-02-01 14:34:05 +03:00
parent 84100abd9e
commit d194af5c4e
4 changed files with 33 additions and 1 deletions
@@ -90,7 +90,13 @@ fun Call.getValueArgumentsInParentheses(): List<ValueArgument> = valueArguments.
fun KtCallElement.getValueArgumentsInParentheses(): List<ValueArgument> = valueArguments.filterArgsInParentheses()
fun Call.getValueArgumentListOrElement(): KtElement = valueArgumentList ?: calleeExpression ?: callElement
fun Call.getValueArgumentListOrElement(): KtElement =
if (this is CallTransformer.CallForImplicitInvoke) {
outerCall.getValueArgumentListOrElement()
}
else {
valueArgumentList ?: calleeExpression ?: callElement
}
@Suppress("UNCHECKED_CAST")
private fun List<ValueArgument?>.filterArgsInParentheses() = filter { it !is KtLambdaArgument } as List<ValueArgument>
@@ -0,0 +1,16 @@
// See KT-7813: Call to functional parameter with missing argument: no error detected but compiler crashes
fun foo(p: (Int, () -> Int) -> Unit) {
// Errors except last call
<!NO_VALUE_FOR_PARAMETER!>p<!> { 1 }
p(<!NO_VALUE_FOR_PARAMETER!>)<!> { 2 }
p(3) { 4 }
}
fun bar(p: (String, Any, () -> String) -> Unit) {
// Errors except last call
<!NO_VALUE_FOR_PARAMETER, NO_VALUE_FOR_PARAMETER!>p<!> { "" }
p(<!NO_VALUE_FOR_PARAMETER, NO_VALUE_FOR_PARAMETER!>)<!> { "x" }
p("y"<!NO_VALUE_FOR_PARAMETER!>)<!> { "z" }
p("v", Any()) { "w" }
}
@@ -0,0 +1,4 @@
package
public fun bar(/*0*/ p: (kotlin.String, kotlin.Any, () -> kotlin.String) -> kotlin.Unit): kotlin.Unit
public fun foo(/*0*/ p: (kotlin.Int, () -> kotlin.Int) -> kotlin.Unit): kotlin.Unit
@@ -6573,6 +6573,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
doTest(fileName);
}
@TestMetadata("higherOrderCallMissingParameters.kt")
public void testHigherOrderCallMissingParameters() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/functionLiterals/higherOrderCallMissingParameters.kt");
doTest(fileName);
}
@TestMetadata("kt2906.kt")
public void testKt2906() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/functionLiterals/kt2906.kt");