[NI] Fix coercion to Unit for lambdas with empty labeled return
This commit is contained in:
+2
-2
@@ -178,10 +178,10 @@ class KotlinResolutionCallbacksImpl(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val lastExpressionArgument = getLastDeparentesizedExpression(psiCallArgument)?.let { lastExpression ->
|
val lastExpressionArgument = getLastDeparentesizedExpression(psiCallArgument)?.let { lastExpression ->
|
||||||
if (expectedReturnType?.isUnit() == true) return@let null // coercion to Unit
|
if (expectedReturnType?.isUnit() == true || hasReturnWithoutExpression) return@let null // coercion to Unit
|
||||||
|
|
||||||
// todo lastExpression can be if without else
|
// todo lastExpression can be if without else
|
||||||
val lastExpressionType = if (hasReturnWithoutExpression) null else trace.getType(lastExpression)
|
val lastExpressionType = trace.getType(lastExpression)
|
||||||
val contextInfo = lambdaInfo.lastExpressionInfo
|
val contextInfo = lambdaInfo.lastExpressionInfo
|
||||||
val lastExpressionTypeInfo = KotlinTypeInfo(lastExpressionType, contextInfo.dataFlowInfoAfter ?: functionTypeInfo.dataFlowInfo)
|
val lastExpressionTypeInfo = KotlinTypeInfo(lastExpressionType, contextInfo.dataFlowInfoAfter ?: functionTypeInfo.dataFlowInfo)
|
||||||
createCallArgument(lastExpression, lastExpressionTypeInfo, contextInfo.lexicalScope, contextInfo.trace)
|
createCallArgument(lastExpression, lastExpressionTypeInfo, contextInfo.lexicalScope, contextInfo.trace)
|
||||||
|
|||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
// !LANGUAGE: +NewInference
|
||||||
|
|
||||||
|
class Obj
|
||||||
|
|
||||||
|
fun foo(): String? {
|
||||||
|
run {
|
||||||
|
if (true) return@run
|
||||||
|
|
||||||
|
if (true) Obj()
|
||||||
|
}
|
||||||
|
|
||||||
|
run {
|
||||||
|
if (true) return@run
|
||||||
|
|
||||||
|
if (true) return <!TYPE_MISMATCH, TYPE_MISMATCH!>Obj()<!> // correct error, type check against return type of function "foo"
|
||||||
|
}
|
||||||
|
|
||||||
|
run {
|
||||||
|
if (true)
|
||||||
|
return@run
|
||||||
|
else
|
||||||
|
if (true) <!UNUSED_EXPRESSION!>42<!>
|
||||||
|
}
|
||||||
|
|
||||||
|
run {
|
||||||
|
if (true)
|
||||||
|
42
|
||||||
|
else
|
||||||
|
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) 42
|
||||||
|
}
|
||||||
|
|
||||||
|
run {
|
||||||
|
if (true) return@run
|
||||||
|
|
||||||
|
if (true) {
|
||||||
|
Obj()
|
||||||
|
} else
|
||||||
|
if (true) return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun foo(): kotlin.String?
|
||||||
|
|
||||||
|
public final class Obj {
|
||||||
|
public constructor Obj()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
// !LANGUAGE: +NewInference
|
||||||
|
|
||||||
|
class Obj
|
||||||
|
|
||||||
|
fun foo(): String? {
|
||||||
|
run {
|
||||||
|
if (true) return@run
|
||||||
|
|
||||||
|
run {
|
||||||
|
if (true) {
|
||||||
|
Obj()
|
||||||
|
} else
|
||||||
|
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) return null // Error, coercion to Unit doesn't propagate inside nested lambdas
|
||||||
|
}
|
||||||
|
|
||||||
|
if (true) {
|
||||||
|
Obj()
|
||||||
|
} else
|
||||||
|
if (true) return null // OK, no error
|
||||||
|
}
|
||||||
|
|
||||||
|
run {
|
||||||
|
if (true) return@run
|
||||||
|
|
||||||
|
run {
|
||||||
|
if (true) {
|
||||||
|
Obj()
|
||||||
|
} else
|
||||||
|
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) return null // Error, coercion to Unit doesn't propagate inside nested lambdas
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
run {
|
||||||
|
if (true) return@run
|
||||||
|
|
||||||
|
run nestedRun@{
|
||||||
|
if (true) return@nestedRun
|
||||||
|
|
||||||
|
if (true) {
|
||||||
|
Obj()
|
||||||
|
} else
|
||||||
|
if (true) return null // OK, additional empty labeled return helps
|
||||||
|
}
|
||||||
|
|
||||||
|
if (true) {
|
||||||
|
Obj()
|
||||||
|
} else
|
||||||
|
if (true) return null // OK, no error
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun foo(): kotlin.String?
|
||||||
|
|
||||||
|
public final class Obj {
|
||||||
|
public constructor Obj()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
@@ -9710,6 +9710,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/coercionToUnit"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/coercionToUnit"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("coercionToUnitForIfAsLastExpressionInLambda.kt")
|
||||||
|
public void testCoercionToUnitForIfAsLastExpressionInLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionToUnitForIfAsLastExpressionInLambda.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("coercionWithExpectedType.kt")
|
@TestMetadata("coercionWithExpectedType.kt")
|
||||||
public void testCoercionWithExpectedType() throws Exception {
|
public void testCoercionWithExpectedType() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionWithExpectedType.kt");
|
runTest("compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionWithExpectedType.kt");
|
||||||
@@ -9739,6 +9744,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
public void testNoCoercion() throws Exception {
|
public void testNoCoercion() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/inference/coercionToUnit/noCoercion.kt");
|
runTest("compiler/testData/diagnostics/tests/inference/coercionToUnit/noCoercion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("nonPropagationOfCoercionToUnitInsideNestedLambda.kt")
|
||||||
|
public void testNonPropagationOfCoercionToUnitInsideNestedLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/inference/coercionToUnit/nonPropagationOfCoercionToUnitInsideNestedLambda.kt");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/diagnostics/tests/inference/commonSystem")
|
@TestMetadata("compiler/testData/diagnostics/tests/inference/commonSystem")
|
||||||
|
|||||||
Generated
+10
@@ -9710,6 +9710,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/coercionToUnit"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/coercionToUnit"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("coercionToUnitForIfAsLastExpressionInLambda.kt")
|
||||||
|
public void testCoercionToUnitForIfAsLastExpressionInLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionToUnitForIfAsLastExpressionInLambda.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("coercionWithExpectedType.kt")
|
@TestMetadata("coercionWithExpectedType.kt")
|
||||||
public void testCoercionWithExpectedType() throws Exception {
|
public void testCoercionWithExpectedType() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionWithExpectedType.kt");
|
runTest("compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionWithExpectedType.kt");
|
||||||
@@ -9739,6 +9744,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
|
|||||||
public void testNoCoercion() throws Exception {
|
public void testNoCoercion() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/inference/coercionToUnit/noCoercion.kt");
|
runTest("compiler/testData/diagnostics/tests/inference/coercionToUnit/noCoercion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("nonPropagationOfCoercionToUnitInsideNestedLambda.kt")
|
||||||
|
public void testNonPropagationOfCoercionToUnitInsideNestedLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/inference/coercionToUnit/nonPropagationOfCoercionToUnitInsideNestedLambda.kt");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/diagnostics/tests/inference/commonSystem")
|
@TestMetadata("compiler/testData/diagnostics/tests/inference/commonSystem")
|
||||||
|
|||||||
Reference in New Issue
Block a user