From 6ed13ef1b643a44f746d876efda35eebfee894d8 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Tue, 18 Aug 2020 10:52:45 +0300 Subject: [PATCH] Fix unresolved reference to catch parameter from lambda expression #KT-41140 Fixed --- .../codegen/ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../kotlin/resolve/calls/tower/PSICallResolver.kt | 5 ++++- .../referenceToCatchParameterFromLambdaExpression.kt | 12 ++++++++++++ .../kotlin/codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../codegen/ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../semantics/IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../ir/semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../js/test/semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 9 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 5ef41ffb6b0..b3565308c01 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -12637,6 +12637,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") + public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { + runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt index ba0b230f2ee..6da2881ebd7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt @@ -728,6 +728,9 @@ class PSICallResolver( val argumentName = valueArgument.getArgumentName()?.asName + @Suppress("NAME_SHADOWING") + val outerCallContext = outerCallContext.expandContextForCatchClause(ktExpression) + processFunctionalExpression( outerCallContext, argumentExpression, startDataFlowInfo, valueArgument, argumentName, builtIns, typeResolver @@ -743,7 +746,7 @@ class PSICallResolver( val context = outerCallContext.replaceContextDependency(ContextDependency.DEPENDENT) .replaceDataFlowInfo(startDataFlowInfo) - .expandContextForCatchClause(ktExpression).let { + .let { if (isSpecialFunction && argumentExpression is KtBlockExpression && ArgumentTypeResolver.getCallableReferenceExpressionIfAny(argumentExpression, it) != null diff --git a/compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt b/compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt new file mode 100644 index 00000000000..88c088c7f6b --- /dev/null +++ b/compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt @@ -0,0 +1,12 @@ +fun test(): () -> Throwable { + return try { + TODO() + } catch (e: Throwable) { + { -> e } + } +} + +fun box(): String { + val exception = test()() + return if (exception is NotImplementedError) "OK" else "fail: $exception" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 26ed564e7ce..9cc3515d4d8 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -13862,6 +13862,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") + public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { + runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index c5f8dedc0ef..df95e39baef 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -13862,6 +13862,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") + public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { + runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 182d9aa3315..1fcbcc04e87 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -12637,6 +12637,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") + public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { + runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index a7858b36131..18dae5e35f9 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -10812,6 +10812,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") + public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { + runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 55dc09c4d75..3519e89bc8c 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -10812,6 +10812,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") + public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { + runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 9f5135cec9d..c78f613c572 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -10877,6 +10877,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") + public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { + runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");