[FIR] Fix false positive RETURN_TYPE_MISMATCH in intellij ultimate

This commit is contained in:
Ivan Kochurkin
2022-04-07 16:07:11 +03:00
parent 04da0ba55d
commit 81b1ed9ad4
9 changed files with 14 additions and 11 deletions
@@ -37,7 +37,7 @@ fun errorWithLambda(): String {
return@foo
} foo {
bar()
return@foo <!RETURN_TYPE_MISMATCH!>10<!>
return@foo 10
}
return ""
@@ -25,9 +25,7 @@ object FirFunctionReturnTypeMismatchChecker : FirReturnExpressionChecker() {
override fun check(expression: FirReturnExpression, context: CheckerContext, reporter: DiagnosticReporter) {
if (expression.source == null) return
val targetElement = expression.target.labeledElement
if (targetElement is FirErrorFunction ||
targetElement is FirAnonymousFunction && targetElement.isLambda && expression.target.labelName == null
) {
if (targetElement is FirErrorFunction || targetElement is FirAnonymousFunction && targetElement.isLambda) {
return
}
val resultExpression = expression.result
@@ -5,7 +5,7 @@ val a: () -> Int = <!INITIALIZER_TYPE_MISMATCH!>l@ {
}<!>
val b: () -> Unit = l@ {
if (flag) return@l <!RETURN_TYPE_MISMATCH!>4<!>
if (flag) return@l 4
}
val c: () -> Any = l@ {
@@ -0,0 +1,6 @@
val flag = true
val a = b@ {
if (flag) return@b 4
return@b
}
@@ -1,7 +1,6 @@
// FIR_IDENTICAL
val flag = true
val a = b@ {
if (flag) return@b <!RETURN_TYPE_MISMATCH!>4<!>
return@b
}
}
@@ -1,6 +1,6 @@
fun test(a: Int) {
run<Int>f@{
if (a > 0) return@f <!ARGUMENT_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>""<!>
if (a > 0) return@f <!ARGUMENT_TYPE_MISMATCH!>""<!>
return@f 1
}
@@ -20,7 +20,7 @@ fun test(a: A<out CharSequence>, z: Out<CharSequence>) {
a.bar { <!ARGUMENT_TYPE_MISMATCH, TYPE_MISMATCH!>z.id()<!> }
a.foo {
z.foobar(if (1 > 2) return@foo <!ARGUMENT_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>""<!> else "")
z.foobar(if (1 > 2) return@foo <!ARGUMENT_TYPE_MISMATCH!>""<!> else "")
<!ARGUMENT_TYPE_MISMATCH!>""<!>
}
}
@@ -12,7 +12,7 @@ val a: () -> Unit = l@{
val b: () -> Unit = l@{
// Error, coercion can't be applied at this position!
if (true) return@l <!RETURN_TYPE_MISMATCH!>"hello"<!>
if (true) return@l "hello"
// However, this is OK, because here coercion is applied
"hello"
@@ -103,7 +103,7 @@ fun main() {
select(
id { x, y -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>x<!>.inv() + <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number")!>y<!>.toByte() },
id<(Int, Number) -> Int> { x, y -> x.inv() },
<!RETURN_TYPE_MISMATCH!>{}<!> as (Number, Number) -> Int
{} as (Number, Number) -> Int
)
// Inferring lambda parameter types by a few expected types (a few upper constraints)