diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java index a411917b5255..004599135fee 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java @@ -880,22 +880,22 @@ public class RefactoringUtil { LOG.assertTrue(newBody != null); newBody.add(declaration); - final PsiStatement lastBodyStatement; - if (LambdaUtil.getFunctionalInterfaceReturnType(lambdaExpression) == PsiType.VOID) { - lastBodyStatement = elementFactory.createStatementFromText("a;", lambdaExpression); - ((PsiExpressionStatement)lastBodyStatement).getExpression().replace(lambdaExpressionBody); - } - else { - lastBodyStatement = elementFactory.createStatementFromText("return a;", lambdaExpression); - final PsiExpression returnValue = ((PsiReturnStatement)lastBodyStatement).getReturnValue(); - LOG.assertTrue(returnValue != null); - returnValue.replace(lambdaExpressionBody); - } + PsiStatement lastBodyStatement = elementFactory.createStatementFromText("a;", lambdaExpression); + ((PsiExpressionStatement)lastBodyStatement).getExpression().replace(lambdaExpressionBody); newBody.add(lastBodyStatement); - final PsiLambdaExpression copy = (PsiLambdaExpression)lambdaExpression.replace(expressionFromText); + PsiLambdaExpression copy = (PsiLambdaExpression)lambdaExpression.replace(expressionFromText); newBody = (PsiCodeBlock)copy.getBody(); LOG.assertTrue(newBody != null); + + if (LambdaUtil.getFunctionalInterfaceReturnType(copy) != PsiType.VOID) { + PsiExpressionStatement lastStatement = (PsiExpressionStatement)newBody.getStatements()[1]; + PsiReturnStatement returnStatement = (PsiReturnStatement)elementFactory.createStatementFromText("return a;", copy); + final PsiExpression returnValue = returnStatement.getReturnValue(); + LOG.assertTrue(returnValue != null); + returnValue.replace(lastStatement.getExpression()); + lastStatement.replace(returnStatement); + } declaration = newBody.getStatements()[0]; declaration = (PsiStatement)JavaCodeStyleManager.getInstance(declaration.getProject()).shortenClassReferences(declaration); } diff --git a/java/java-tests/testData/refactoring/introduceVariable/PutInLambdaBody.after.java b/java/java-tests/testData/refactoring/introduceVariable/PutInLambdaBody.after.java new file mode 100644 index 000000000000..afdfb96db8e2 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/PutInLambdaBody.after.java @@ -0,0 +1,20 @@ +class Foo { + interface I { + T m(Object op); + } + + interface J { + int m(T o); + } + + + void f(J r) {} + void f(I r) {} + + { + f((Object a) -> { + int c = 1; + return c; + }); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceVariable/PutInLambdaBody.java b/java/java-tests/testData/refactoring/introduceVariable/PutInLambdaBody.java new file mode 100644 index 000000000000..3d54e3b88646 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/PutInLambdaBody.java @@ -0,0 +1,17 @@ +class Foo { + interface I { + T m(Object op); + } + + interface J { + int m(T o); + } + + + void f(J r) {} + void f(I r) {} + + { + f((Object a) -> 1); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java index 4e993aac90aa..29f792330bbf 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java @@ -437,6 +437,10 @@ public class IntroduceVariableTest extends LightCodeInsightTestCase { doTest(new MockIntroduceVariableHandler("c", false, false, false, "int")); } + public void testPutInLambdaBody() { + doTest(new MockIntroduceVariableHandler("c", false, false, false, "int")); + } + public void testNormalizeDeclarations() { doTest(new MockIntroduceVariableHandler("i3", false, false, false, "int")); }