diff --git a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java index 8b9aaa59dd8b..c8013ff40d3a 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java @@ -150,7 +150,8 @@ public class InlineUtil { } private static PsiExpression surroundWithCast(PsiVariable variable, PsiExpression expr, PsiExpression expression) { - if (expression.getParent() instanceof PsiReferenceExpression) { + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiReferenceExpression || parent instanceof PsiExpressionList) { PsiTypeCastExpression cast = (PsiTypeCastExpression)JavaPsiFacade.getElementFactory(expr.getProject()).createExpressionFromText("(t)a", null); PsiTypeElement castTypeElement = cast.getCastType(); assert castTypeElement != null; @@ -159,6 +160,9 @@ public class InlineUtil { assert operand != null; operand.replace(expr); expr = (PsiTypeCastExpression)expr.replace(cast); + if (RedundantCastUtil.isCastRedundant((PsiTypeCastExpression)expr)) { + expr = (PsiExpression)expr.replace(((PsiTypeCastExpression)expr).getOperand()); + } } return expr; } diff --git a/java/java-tests/testData/refactoring/inlineLocal/CastAroundLambda.java b/java/java-tests/testData/refactoring/inlineLocal/CastAroundLambda.java new file mode 100644 index 000000000000..03de90ced40a --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/CastAroundLambda.java @@ -0,0 +1,12 @@ +class Test { + void test() { + I b1 = System::exit; + a(b1); + } + + void a(Object b) {} + + interface I { + void i(int i); + } +} diff --git a/java/java-tests/testData/refactoring/inlineLocal/CastAroundLambda.java.after b/java/java-tests/testData/refactoring/inlineLocal/CastAroundLambda.java.after new file mode 100644 index 000000000000..3a08c908a39e --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/CastAroundLambda.java.after @@ -0,0 +1,11 @@ +class Test { + void test() { + a((I) System::exit); + } + + void a(Object b) {} + + interface I { + void i(int i); + } +} diff --git a/java/java-tests/testData/refactoring/inlineLocal/NoCastAroundLambda.java b/java/java-tests/testData/refactoring/inlineLocal/NoCastAroundLambda.java new file mode 100644 index 000000000000..62f440a0b191 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/NoCastAroundLambda.java @@ -0,0 +1,12 @@ +class Test { + void test() { + I b1 = System::exit; + a(b1); + } + + void a(I b) {} + + interface I { + void i(int i); + } +} diff --git a/java/java-tests/testData/refactoring/inlineLocal/NoCastAroundLambda.java.after b/java/java-tests/testData/refactoring/inlineLocal/NoCastAroundLambda.java.after new file mode 100644 index 000000000000..e8dea47092d7 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/NoCastAroundLambda.java.after @@ -0,0 +1,11 @@ +class Test { + void test() { + a(System::exit); + } + + void a(I b) {} + + interface I { + void i(int i); + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java index 7c4558026a0b..b44070e1aa91 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java @@ -184,6 +184,14 @@ public class InlineLocalTest extends LightCodeInsightTestCase { doTest(true); } + public void testCastAroundLambda() throws Exception { + doTest(true); + } + + public void testNoCastAroundLambda() throws Exception { + doTest(true); + } + public void testLocalVarInsideLambdaBodyWriteUsage() throws Exception { doTest(true, "Cannot perform refactoring.\n" + "Variable 'hello' is accessed for writing.");