[NI] Fix issue with returning non-deparenthesized lambdas from labmdas

#KT-36080 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2020-01-22 20:25:33 +03:00
parent 6b07ef42dd
commit f1d9177112
9 changed files with 91 additions and 7 deletions
@@ -10076,6 +10076,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte
runTest("compiler/testData/diagnostics/tests/inference/kt619.kt");
}
@TestMetadata("lambdaArgumentWithLabel.kt")
public void testLambdaArgumentWithLabel() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.kt");
}
@TestMetadata("lambdaInValInitializerWithAnonymousFunctions.kt")
public void testLambdaInValInitializerWithAnonymousFunctions() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/lambdaInValInitializerWithAnonymousFunctions.kt");
@@ -896,7 +896,10 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
if (returnedExpression != null) {
if (newInferenceLambdaInfo != null) {
LambdaContextInfo contextInfo;
if (returnedExpression instanceof KtLambdaExpression || returnedExpression instanceof KtCallableReferenceExpression) {
KtExpression deparenthesizedReturnExpression = KtPsiUtil.deparenthesize(returnedExpression);
if (deparenthesizedReturnExpression instanceof KtLambdaExpression ||
deparenthesizedReturnExpression instanceof KtCallableReferenceExpression
) {
contextInfo = new LambdaContextInfo(
new KotlinTypeInfo(DONT_CARE, context.dataFlowInfo),
null,
@@ -385,7 +385,7 @@ public class ExpressionTypingServices {
return blockLevelVisitor.getTypeInfo(statementExpression, context.replaceExpectedType(expectedType), true);
}
if (statementExpression instanceof KtLambdaExpression) {
if (KtPsiUtil.deparenthesize(statementExpression) instanceof KtLambdaExpression) {
KotlinTypeInfo typeInfo = createDontCareTypeInfoForNILambda(statementExpression, context);
if (typeInfo != null) return typeInfo;
}
@@ -0,0 +1,29 @@
// !LANGUAGE: +NewInference
// !DIAGNOSTICS: -UNUSED_PARAMETER
val x1: (String) -> Unit = run {
lambda@{ foo ->
bar(foo)
}
}
val x2: (String) -> Unit = run {
({ foo ->
bar(foo)
})
}
val x3: (String) -> Unit = run {
(lambda@{ foo ->
bar(foo)
})
}
val x4: (String) -> Unit = run {
return@run (lambda@{ foo ->
bar(foo)
})
}
fun bar(s: String) {}
fun <R> run(block: () -> R): R = block()
@@ -0,0 +1,29 @@
// !LANGUAGE: +NewInference
// !DIAGNOSTICS: -UNUSED_PARAMETER
val x1: (String) -> Unit = run {
lambda@{ foo ->
bar(foo)
}
}
val x2: (String) -> Unit = run {
({ foo ->
bar(foo)
})
}
val x3: (String) -> Unit = run {
(lambda@{ foo ->
bar(foo)
})
}
val x4: (String) -> Unit = run {
return@run (lambda@{ foo ->
bar(foo)
})
}
fun bar(s: String) {}
fun <R> run(block: () -> R): R = block()
@@ -0,0 +1,8 @@
package
public val x1: (kotlin.String) -> kotlin.Unit
public val x2: (kotlin.String) -> kotlin.Unit
public val x3: (kotlin.String) -> kotlin.Unit
public val x4: (kotlin.String) -> kotlin.Unit
public fun bar(/*0*/ s: kotlin.String): kotlin.Unit
public fun </*0*/ R> run(/*0*/ block: () -> R): R
@@ -10083,6 +10083,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
runTest("compiler/testData/diagnostics/tests/inference/kt619.kt");
}
@TestMetadata("lambdaArgumentWithLabel.kt")
public void testLambdaArgumentWithLabel() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.kt");
}
@TestMetadata("lambdaInValInitializerWithAnonymousFunctions.kt")
public void testLambdaInValInitializerWithAnonymousFunctions() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/lambdaInValInitializerWithAnonymousFunctions.kt");
@@ -10078,6 +10078,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
runTest("compiler/testData/diagnostics/tests/inference/kt619.kt");
}
@TestMetadata("lambdaArgumentWithLabel.kt")
public void testLambdaArgumentWithLabel() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.kt");
}
@TestMetadata("lambdaInValInitializerWithAnonymousFunctions.kt")
public void testLambdaInValInitializerWithAnonymousFunctions() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/lambdaInValInitializerWithAnonymousFunctions.kt");
@@ -14720,11 +14720,6 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class NotNullAssertions extends AbstractLightAnalysisModeTest {
@TestMetadata("paramAssertionMessage.kt")
public void ignoreParamAssertionMessage() throws Exception {
runTest("compiler/testData/codegen/box/javaInterop/notNullAssertions/paramAssertionMessage.kt");
}
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
}
@@ -14813,6 +14808,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/javaInterop/notNullAssertions/nullableTypeParameter.kt");
}
@TestMetadata("paramAssertionMessage.kt")
public void testParamAssertionMessage() throws Exception {
runTest("compiler/testData/codegen/box/javaInterop/notNullAssertions/paramAssertionMessage.kt");
}
@TestMetadata("staticCallErrorMessage.kt")
public void testStaticCallErrorMessage() throws Exception {
runTest("compiler/testData/codegen/box/javaInterop/notNullAssertions/staticCallErrorMessage.kt");