From 7228521cd171ca76cc24ecc4cb1c9d9529e12fd2 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Jan 2013 12:40:44 +0100 Subject: [PATCH] extract method: insert cast when duplicate with changed type processed (IDEA-98396) --- .../extractMethod/ExtractMethodProcessor.java | 10 ++++++++++ .../refactoring/util/ParameterTablePanel.java | 2 +- .../extractMethod/CastWhenDuplicateReplacement.java | 7 +++++++ .../CastWhenDuplicateReplacement_after.java | 11 +++++++++++ .../com/intellij/refactoring/ExtractMethodTest.java | 4 ++++ 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/CastWhenDuplicateReplacement.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/CastWhenDuplicateReplacement_after.java 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 0b0521d38811..b6d33951f609 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -938,10 +938,20 @@ public class ExtractMethodProcessor implements MatchProvider { datas.add(variableData); } } + final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(myProject); for (ParameterTablePanel.VariableData data : datas) { final List parameterValue = match.getParameterValues(data.variable); if (parameterValue != null) { for (PsiElement val : parameterValue) { + if (val instanceof PsiExpression) { + final PsiType exprType = ((PsiExpression)val).getType(); + if (exprType != null && !TypeConversionUtil.isAssignable(data.type, exprType)) { + final PsiTypeCastExpression cast = (PsiTypeCastExpression)elementFactory.createExpressionFromText("(A)a", val); + cast.getCastType().replace(elementFactory.createTypeElement(data.type)); + cast.getOperand().replace(val.copy()); + val = cast; + } + } methodCallExpression.getArgumentList().add(val); } } diff --git a/java/java-impl/src/com/intellij/refactoring/util/ParameterTablePanel.java b/java/java-impl/src/com/intellij/refactoring/util/ParameterTablePanel.java index 44c3def6e0c3..218607a09a57 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/ParameterTablePanel.java +++ b/java/java-impl/src/com/intellij/refactoring/util/ParameterTablePanel.java @@ -72,7 +72,7 @@ public abstract class ParameterTablePanel extends JPanel { public VariableData(PsiVariable var, PsiType type) { variable = var; - this.type = type; + this.type = SmartTypePointerManager.getInstance(var.getProject()).createSmartTypePointer(type).getType(); } } diff --git a/java/java-tests/testData/refactoring/extractMethod/CastWhenDuplicateReplacement.java b/java/java-tests/testData/refactoring/extractMethod/CastWhenDuplicateReplacement.java new file mode 100644 index 000000000000..68a91fd51b8f --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/CastWhenDuplicateReplacement.java @@ -0,0 +1,7 @@ +class Test { + + void foo(Object x) { + if (x instanceof String) x = ((String)x).substring(1); + if (x instanceof String) x = ((String)x).substring(1); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/CastWhenDuplicateReplacement_after.java b/java/java-tests/testData/refactoring/extractMethod/CastWhenDuplicateReplacement_after.java new file mode 100644 index 000000000000..e0a14ee47dde --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/CastWhenDuplicateReplacement_after.java @@ -0,0 +1,11 @@ +class Test { + + void foo(Object x) { + if (x instanceof String) x = newMethod((String) x); + if (x instanceof String) x = newMethod((String) x); + } + + private String newMethod(String x) { + return ((String)x).substring(1); + } +} \ 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 3102c04fd29f..50749ed76329 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java @@ -571,6 +571,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { doDuplicatesTest(); } + public void testCastWhenDuplicateReplacement() throws Exception { + doDuplicatesTest(); + } + private void doTestDisabledParam() throws PrepareFailedException { final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject()); settings.ELSE_ON_NEW_LINE = true;