From e8135c030ddb0deb0d0c065db7f0c3b0ed92ecef Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Fri, 20 May 2016 20:57:20 +0200 Subject: [PATCH] lambda -> anonymous: remove redundant cast when no more needed --- .../ReplaceLambdaWithAnonymousIntention.java | 14 +++++++++++++- .../lambda2anonymous/RemoveRedundantCast.java | 12 ++++++++++++ .../RemoveRedundantCast_after.java | 16 ++++++++++++++++ .../ReplaceLambdaWithAnonymousIntentionTest.java | 4 ++++ .../lang/xpath/xslt/impl/XsltIncludeIndex.java | 1 + 5 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/types/lambda2anonymous/RemoveRedundantCast.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/types/lambda2anonymous/RemoveRedundantCast_after.java diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceLambdaWithAnonymousIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceLambdaWithAnonymousIntention.java index d2f8f916f63a..83676baffb52 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceLambdaWithAnonymousIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceLambdaWithAnonymousIntention.java @@ -26,6 +26,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTypesUtil; import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.RedundantCastUtil; import com.intellij.refactoring.util.RefactoringChangeUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashMap; @@ -74,7 +75,7 @@ public class ReplaceLambdaWithAnonymousIntention extends Intention { LOG.assertTrue(anonymousClass != null); final List> infos = OverrideImplementUtil.overrideOrImplement(anonymousClass, method); if (infos != null && infos.size() == 1) { - final PsiMethod member = infos.get(0).getPsiMember(); + PsiMethod member = infos.get(0).getPsiMember(); final PsiParameter[] parameters = member.getParameterList().getParameters(); if (parameters.length == paramListCopy.length) { for (int i = 0; i < parameters.length; i++) { @@ -89,6 +90,17 @@ public class ReplaceLambdaWithAnonymousIntention extends Intention { LOG.assertTrue(codeBlock != null); codeBlock = (PsiCodeBlock)codeBlock.replace(blockFromText); + + final PsiElement parent = anonymousClass.getParent().getParent(); + if (parent instanceof PsiTypeCastExpression && RedundantCastUtil.isCastRedundant((PsiTypeCastExpression)parent)) { + final PsiExpression operand = ((PsiTypeCastExpression)parent).getOperand(); + LOG.assertTrue(operand != null); + PsiNewExpression expression = (PsiNewExpression)parent.replace(operand); + final PsiAnonymousClass simplifiedClass = expression.getAnonymousClass(); + LOG.assertTrue(simplifiedClass != null); + member = simplifiedClass.getMethods()[0]; + } + GenerateMembersUtil.positionCaret(editor, member, true); } } diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/lambda2anonymous/RemoveRedundantCast.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/lambda2anonymous/RemoveRedundantCast.java new file mode 100644 index 000000000000..24fc09c3e05d --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/lambda2anonymous/RemoveRedundantCast.java @@ -0,0 +1,12 @@ +interface I { + void m(); +} +interface J extends I {} + +class Test { + void foo(I i) {} + + { + foo((J) () -> {}); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/lambda2anonymous/RemoveRedundantCast_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/lambda2anonymous/RemoveRedundantCast_after.java new file mode 100644 index 000000000000..6aa4ecb6d2a2 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/lambda2anonymous/RemoveRedundantCast_after.java @@ -0,0 +1,16 @@ +interface I { + void m(); +} +interface J extends I {} + +class Test { + void foo(I i) {} + + { + foo(new J() { + @Override + public void m() { + } + }); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/types/ReplaceLambdaWithAnonymousIntentionTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/types/ReplaceLambdaWithAnonymousIntentionTest.java index 690b2aa3d4b1..aac001311c1d 100644 --- a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/types/ReplaceLambdaWithAnonymousIntentionTest.java +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/types/ReplaceLambdaWithAnonymousIntentionTest.java @@ -91,6 +91,10 @@ public class ReplaceLambdaWithAnonymousIntentionTest extends IPPTestCase { assertIntentionNotAvailable(); } + public void testRemoveRedundantCast() throws Exception { + doTest(); + } + @Override protected String getIntentionName() { return IntentionPowerPackBundle.message("replace.lambda.with.anonymous.intention.name"); diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/impl/XsltIncludeIndex.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/impl/XsltIncludeIndex.java index f183f8a23555..5dd2896b4af9 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/impl/XsltIncludeIndex.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/impl/XsltIncludeIndex.java @@ -28,6 +28,7 @@ import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; import org.intellij.lang.xpath.xslt.XsltSupport; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /* * Created by IntelliJ IDEA.