From 7d7828f9320bfc9bd706b1697414c7c015b344e7 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 20 Jul 2017 14:11:14 +0700 Subject: [PATCH] Lambda inlining: handle try-catches in lambda --- .../dataFlow/ControlFlowAnalyzer.java | 4 ++++ .../dataFlow/fixture/LambdaInlining.java | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 5d912f080a46..87945685f6db 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -1865,6 +1865,8 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { PsiLambdaExpression oldLambda = myAnalyzer.myLambdaExpression; myAnalyzer.myLambdaExpression = lambda; myAnalyzer.startElement(lambda); + // Transfer value is pushed to avoid emptying stack beyond this point + push(getFactory().controlTransfer(ReturnTransfer.INSTANCE, myAnalyzer.myTrapStack)); try { PsiElement body = lambda.getBody(); Objects.requireNonNull(body).accept(myAnalyzer); @@ -1876,6 +1878,8 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { } } finally { + // Pop transfer value (which is second value in stack now) + splice(2, 0); myAnalyzer.finishElement(lambda); myAnalyzer.myLambdaExpression = oldLambda; } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/LambdaInlining.java b/java/java-tests/testData/inspection/dataFlow/fixture/LambdaInlining.java index 44195d512a4a..4bc09bca8205 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/LambdaInlining.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/LambdaInlining.java @@ -12,4 +12,19 @@ public class LambdaInlining { System.out.println("oops"); } } + + void testLambdaTryCatch() { + int x = ((IntSupplier)(() -> { + try { + return Math.random() > 0.5 ? 2 : 3; + } + catch (Exception ex) { + + } + return 1; + })).getAsInt(); + if(x == 0) { + System.out.println("oops"); + } + } } \ No newline at end of file