diff --git a/java/java-impl/src/com/intellij/codeInspection/redundantCast/RedundantCastInspection.java b/java/java-impl/src/com/intellij/codeInspection/redundantCast/RedundantCastInspection.java
index 7ed4a29690f6..6ec1a346bbe0 100644
--- a/java/java-impl/src/com/intellij/codeInspection/redundantCast/RedundantCastInspection.java
+++ b/java/java-impl/src/com/intellij/codeInspection/redundantCast/RedundantCastInspection.java
@@ -28,7 +28,6 @@ import com.intellij.openapi.util.WriteExternalException;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.RedundantCastUtil;
-import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.IntArrayList;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
@@ -139,7 +138,7 @@ public class RedundantCastInspection extends GenericsInspectionToolBase {
PsiElement castTypeElement = descriptor.getPsiElement();
PsiTypeCastExpression cast = castTypeElement == null ? null : (PsiTypeCastExpression)castTypeElement.getParent();
if (cast != null) {
- removeCast(cast);
+ RedundantCastUtil.removeCast(cast);
}
}
@@ -163,29 +162,4 @@ public class RedundantCastInspection extends GenericsInspectionToolBase {
public String getShortName() {
return SHORT_NAME;
}
-
- private static void removeCast(PsiTypeCastExpression castExpression) {
- if (castExpression == null) return;
- PsiExpression operand = castExpression.getOperand();
- if (operand instanceof PsiParenthesizedExpression) {
- final PsiParenthesizedExpression parExpr = (PsiParenthesizedExpression)operand;
- operand = parExpr.getExpression();
- }
- if (operand == null) return;
-
- PsiElement toBeReplaced = castExpression;
-
- PsiElement parent = castExpression.getParent();
- while (parent instanceof PsiParenthesizedExpression) {
- toBeReplaced = parent;
- parent = parent.getParent();
- }
-
- try {
- toBeReplaced.replace(operand);
- }
- catch (IncorrectOperationException e) {
- LOG.error(e);
- }
- }
}
diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java
index a9c46f8bb322..f1a0966c1dc6 100644
--- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java
+++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java
@@ -758,6 +758,23 @@ public class ExtractMethodProcessor implements MatchProvider {
adjustFinalParameters(newMethod);
+ for (int i = 0, length = myVariableDatum.length; i < length; i++) {
+ ParameterTablePanel.VariableData data = myVariableDatum[i];
+ final PsiVariable variable = data.variable;
+ final PsiParameter psiParameter = newMethod.getParameterList().getParameters()[i];
+ if (!TypeConversionUtil.isAssignable(variable.getType(), psiParameter.getType())) {
+ for (PsiReference reference : ReferencesSearch.search(psiParameter, new LocalSearchScope(body))){
+ final PsiElement element = reference.getElement();
+ if (element != null) {
+ final PsiElement parent = element.getParent();
+ if (parent instanceof PsiTypeCastExpression) {
+ RedundantCastUtil.removeCast((PsiTypeCastExpression)parent);
+ }
+ }
+ }
+ }
+ }
+
myExtractedMethod = (PsiMethod)myTargetClass.addAfter(newMethod, myAnchor);
if (isNeedToChangeCallContext() && myNeedChangeContext) {
ChangeContextUtil.decodeContextInfo(myExtractedMethod, myTargetClass, RefactoringUtil.createThisExpression(myManager, null));
diff --git a/java/java-tests/testData/refactoring/extractMethod/RedundantCast.java b/java/java-tests/testData/refactoring/extractMethod/RedundantCast.java
new file mode 100644
index 000000000000..b2f77df6b46b
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethod/RedundantCast.java
@@ -0,0 +1,6 @@
+class Test {
+ void foo () {
+ int a = 1;
+ System.out.println("" + (Object)a);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethod/RedundantCast_after.java b/java/java-tests/testData/refactoring/extractMethod/RedundantCast_after.java
new file mode 100644
index 000000000000..473819a56792
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethod/RedundantCast_after.java
@@ -0,0 +1,10 @@
+class Test {
+ void foo () {
+ int a = 1;
+ newMethod(a);
+ }
+
+ private void newMethod(Object a) {
+ System.out.println("" + a);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java
index 27478f6f787c..cf4e75003a50 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java
@@ -497,6 +497,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase {
doTest();
}
+ public void testRedundantCast() throws Exception {
+ doTest();
+ }
+
private void doPrepareErrorTest(final String expectedMessage) throws Exception {
String expectedError = null;
try {
diff --git a/java/openapi/src/com/intellij/psi/util/RedundantCastUtil.java b/java/openapi/src/com/intellij/psi/util/RedundantCastUtil.java
index 6ead55d1a05b..71e45859578c 100644
--- a/java/openapi/src/com/intellij/psi/util/RedundantCastUtil.java
+++ b/java/openapi/src/com/intellij/psi/util/RedundantCastUtil.java
@@ -27,7 +27,10 @@ import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
/**
* @author max
@@ -65,6 +68,31 @@ public class RedundantCastUtil {
return arg;
}
+ public static void removeCast(PsiTypeCastExpression castExpression) {
+ if (castExpression == null) return;
+ PsiExpression operand = castExpression.getOperand();
+ if (operand instanceof PsiParenthesizedExpression) {
+ final PsiParenthesizedExpression parExpr = (PsiParenthesizedExpression)operand;
+ operand = parExpr.getExpression();
+ }
+ if (operand == null) return;
+
+ PsiElement toBeReplaced = castExpression;
+
+ PsiElement parent = castExpression.getParent();
+ while (parent instanceof PsiParenthesizedExpression) {
+ toBeReplaced = parent;
+ parent = parent.getParent();
+ }
+
+ try {
+ toBeReplaced.replace(operand);
+ }
+ catch (IncorrectOperationException e) {
+ LOG.error(e);
+ }
+ }
+
private static class MyCollectingVisitor extends MyIsRedundantVisitor {
private final Set myFoundCasts = new HashSet();