Update diagnostics for trailing lambdas, add quickfix
Alternative message for errors, caused by unexpected lambda expression arguments on a new line. Both diagnostic are reported, if multiple lambda expressions were passed to the call. For other errors trailing lambda diagnostic overrides the original one. Quickfix for erroneous trailing lambdas on a new line after call. Fix separates lambda expression from previous call with semicolon. All trailing lambda arguments become standalone lambda expressions.
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
// !WITH_NEW_INFERENCE
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
fun noArgs() {}
|
||||
fun oneLambdaArg(fn: () -> Unit) {}
|
||||
fun twoLambdaArgs(f1: () -> Unit, f2: () -> Unit) {}
|
||||
fun varargFn(vararg args: Int) {}
|
||||
|
||||
fun testNoArgs() {
|
||||
noArgs()
|
||||
noArgs <!TOO_MANY_ARGUMENTS!>{}<!>
|
||||
noArgs() <!TOO_MANY_ARGUMENTS!>{}<!>
|
||||
noArgs() // {}
|
||||
noArgs() /* */ <!TOO_MANY_ARGUMENTS!>{}<!>
|
||||
noArgs() /*
|
||||
block comment, no new line
|
||||
*/ <!TOO_MANY_ARGUMENTS!>{}<!>
|
||||
noArgs()
|
||||
/*
|
||||
block comment with new line
|
||||
*/
|
||||
<!UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{}<!>
|
||||
noArgs() // comment
|
||||
// comment
|
||||
<!UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{}<!>
|
||||
noArgs() <!TOO_MANY_ARGUMENTS!>{}<!> <!MANY_LAMBDA_EXPRESSION_ARGUMENTS!>{}<!>
|
||||
noArgs() <!TOO_MANY_ARGUMENTS!>{}<!>
|
||||
<!MANY_LAMBDA_EXPRESSION_ARGUMENTS, UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{}<!>
|
||||
}
|
||||
|
||||
fun testLambdaArg() {
|
||||
oneLambdaArg(<!NO_VALUE_FOR_PARAMETER!>)<!>
|
||||
oneLambdaArg {}
|
||||
oneLambdaArg()
|
||||
{}
|
||||
oneLambdaArg()
|
||||
{}
|
||||
<!MANY_LAMBDA_EXPRESSION_ARGUMENTS, UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{}<!>
|
||||
oneLambdaArg(
|
||||
{},
|
||||
<!TOO_MANY_ARGUMENTS!>{}<!>
|
||||
)
|
||||
oneLambdaArg() {}
|
||||
oneLambdaArg(<!NO_VALUE_FOR_PARAMETER!>)<!> // {}
|
||||
oneLambdaArg() /* */ {}
|
||||
oneLambdaArg() /*
|
||||
block
|
||||
comment
|
||||
*/ {}
|
||||
oneLambdaArg() // comment
|
||||
// comment
|
||||
{}
|
||||
oneLambdaArg() {}/*
|
||||
block comment, no new line
|
||||
*/ <!MANY_LAMBDA_EXPRESSION_ARGUMENTS!>{}<!>
|
||||
oneLambdaArg() {}/*
|
||||
block comment with new line
|
||||
*/
|
||||
<!MANY_LAMBDA_EXPRESSION_ARGUMENTS, UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{}<!>
|
||||
oneLambdaArg() {}// comment
|
||||
// comment
|
||||
<!MANY_LAMBDA_EXPRESSION_ARGUMENTS, UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{}<!>
|
||||
oneLambdaArg() {} <!MANY_LAMBDA_EXPRESSION_ARGUMENTS!>{}<!>
|
||||
oneLambdaArg() {}
|
||||
<!MANY_LAMBDA_EXPRESSION_ARGUMENTS, UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{}<!>
|
||||
oneLambdaArg() {} // comment
|
||||
<!MANY_LAMBDA_EXPRESSION_ARGUMENTS, UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{}<!>
|
||||
}
|
||||
|
||||
fun testVararg() {
|
||||
varargFn(1,2,3)
|
||||
varargFn <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
|
||||
varargFn(1,2,3) <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
|
||||
varargFn(1,2,3) // {}
|
||||
varargFn(1,2,3) /* */ <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
|
||||
varargFn(1,2,3) /*
|
||||
block comment, no new line
|
||||
*/ <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
|
||||
varargFn(1,2,3)
|
||||
/*
|
||||
block comment with new line
|
||||
*/ <!UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{}<!>
|
||||
varargFn(1,2,3) // comment
|
||||
// comment
|
||||
<!UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{}<!>
|
||||
varargFn(1,2,3) <!VARARG_OUTSIDE_PARENTHESES!>{}<!> <!MANY_LAMBDA_EXPRESSION_ARGUMENTS!>{}<!>
|
||||
varargFn(1,2,3) <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
|
||||
<!MANY_LAMBDA_EXPRESSION_ARGUMENTS, UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{}<!>
|
||||
}
|
||||
|
||||
fun testTwoLambdas() {
|
||||
twoLambdaArgs(
|
||||
f1 = {},
|
||||
f2 =
|
||||
{}
|
||||
)
|
||||
|
||||
fun bar(): () -> Unit {
|
||||
twoLambdaArgs(<!NO_VALUE_FOR_PARAMETER!>)<!>
|
||||
{}
|
||||
<!MANY_LAMBDA_EXPRESSION_ARGUMENTS, UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{}<!>
|
||||
|
||||
return <!NI;TYPE_MISMATCH, NI;TYPE_MISMATCH!>if (true) {
|
||||
<!OI;TYPE_MISMATCH!>twoLambdaArgs({})
|
||||
{}
|
||||
<!MANY_LAMBDA_EXPRESSION_ARGUMENTS, UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{}<!><!>
|
||||
} else <!NI;TYPE_MISMATCH!>{
|
||||
{}
|
||||
}<!><!>
|
||||
}
|
||||
}
|
||||
|
||||
fun f1(): (() -> Unit) -> (() -> Unit) -> Unit {
|
||||
return { l1 ->
|
||||
<!NI;TYPE_MISMATCH, TYPE_MISMATCH!>l1()
|
||||
<!UNEXPECTED_TRAILING_LAMBDA_ON_A_NEW_LINE!>{ <!OI;CANNOT_INFER_PARAMETER_TYPE!>l2<!> -> <!OI;DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!><!NI;FUNCTION_EXPECTED!>l2<!>()<!> }<!><!>
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package
|
||||
|
||||
public fun f1(): (() -> kotlin.Unit) -> (() -> kotlin.Unit) -> kotlin.Unit
|
||||
public fun noArgs(): kotlin.Unit
|
||||
public fun oneLambdaArg(/*0*/ fn: () -> kotlin.Unit): kotlin.Unit
|
||||
public fun testLambdaArg(): kotlin.Unit
|
||||
public fun testNoArgs(): kotlin.Unit
|
||||
public fun testTwoLambdas(): kotlin.Unit
|
||||
public fun testVararg(): kotlin.Unit
|
||||
public fun twoLambdaArgs(/*0*/ f1: () -> kotlin.Unit, /*1*/ f2: () -> kotlin.Unit): kotlin.Unit
|
||||
public fun varargFn(/*0*/ vararg args: kotlin.Int /*kotlin.IntArray*/): kotlin.Unit
|
||||
Reference in New Issue
Block a user