From f1d9177112a9f47176104d591fb7e48a41f7017a Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Wed, 22 Jan 2020 20:25:33 +0300 Subject: [PATCH] [NI] Fix issue with returning non-deparenthesized lambdas from labmdas #KT-36080 Fixed --- ...irOldFrontendDiagnosticsTestGenerated.java | 5 ++++ .../ControlStructureTypingVisitor.java | 5 +++- .../expressions/ExpressionTypingServices.java | 2 +- .../inference/lambdaArgumentWithLabel.fir.kt | 29 +++++++++++++++++++ .../inference/lambdaArgumentWithLabel.kt | 29 +++++++++++++++++++ .../inference/lambdaArgumentWithLabel.txt | 8 +++++ .../checkers/DiagnosticsTestGenerated.java | 5 ++++ .../DiagnosticsUsingJavacTestGenerated.java | 5 ++++ .../LightAnalysisModeTestGenerated.java | 10 +++---- 9 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.fir.kt create mode 100644 compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.kt create mode 100644 compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.txt diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java index d4a8a41650d..a9bea3637e6 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java @@ -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"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java index 4e5b8bbf692..0939db13403 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java @@ -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, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java index 1d2e92af8bb..9da0262a750 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java @@ -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; } diff --git a/compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.fir.kt b/compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.fir.kt new file mode 100644 index 00000000000..09a3f783818 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.fir.kt @@ -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 run(block: () -> R): R = block() diff --git a/compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.kt b/compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.kt new file mode 100644 index 00000000000..09a3f783818 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.kt @@ -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 run(block: () -> R): R = block() diff --git a/compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.txt b/compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.txt new file mode 100644 index 00000000000..66de26209bf --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/lambdaArgumentWithLabel.txt @@ -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 run(/*0*/ block: () -> R): R diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 4d2329900b5..092f1046385 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -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"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 5a478bb0f81..a954d9b505f 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -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"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 5181d131eac..f0e3b645947 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -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");