From d3134b026b3ac37ef1caaee212e4151a64bd64b3 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Tue, 13 Dec 2016 17:39:17 +0100 Subject: [PATCH] extract method: don't skip variables used in left side of assignments (IDEA-165386) --- .../extractMethod/ControlFlowWrapper.java | 14 +++------- ...pVariablesUsedInLeftSideOfAssignments.java | 22 +++++++++++++++ ...blesUsedInLeftSideOfAssignments_after.java | 27 +++++++++++++++++++ .../refactoring/ExtractMethodTest.java | 4 +++ 4 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/DontSkipVariablesUsedInLeftSideOfAssignments.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/DontSkipVariablesUsedInLeftSideOfAssignments_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ControlFlowWrapper.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ControlFlowWrapper.java index 564b53aedcf0..63e6ee2946d4 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ControlFlowWrapper.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ControlFlowWrapper.java @@ -18,7 +18,6 @@ package com.intellij.refactoring.extractMethod; import com.intellij.codeInsight.PsiEquivalenceUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.controlFlow.*; import com.intellij.psi.search.LocalSearchScope; @@ -209,19 +208,12 @@ public class ControlFlowWrapper { for (PsiReference ref : ReferencesSearch.search(variable, scope)) { PsiElement element = ref.getElement(); int elementOffset = myControlFlow.getStartOffset(element); + if (elementOffset == -1) { + continue Variables; + } if (elementOffset >= myFlowStart && elementOffset <= myFlowEnd) { if (!isInExitStatements(element, myExitStatements)) continue Variables; } - if (elementOffset == -1) { //references in local/anonymous classes should not be skipped - final PsiClass psiClass = PsiTreeUtil.getParentOfType(element, PsiClass.class); - if (psiClass != null) { - final TextRange textRange = psiClass.getTextRange(); - if (myControlFlow.getElement(myFlowStart).getTextOffset() <= textRange.getStartOffset() && - textRange.getEndOffset() <= myControlFlow.getElement(myFlowEnd).getTextRange().getEndOffset()) { - continue Variables; - } - } - } } iterator.remove(); } diff --git a/java/java-tests/testData/refactoring/extractMethod/DontSkipVariablesUsedInLeftSideOfAssignments.java b/java/java-tests/testData/refactoring/extractMethod/DontSkipVariablesUsedInLeftSideOfAssignments.java new file mode 100644 index 000000000000..b88ace05d7a4 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/DontSkipVariablesUsedInLeftSideOfAssignments.java @@ -0,0 +1,22 @@ + +import java.util.List; + +class Test { + + boolean m(Object[] parsed, String[] parameters, List args) { + int i = 1; + String parameter = parameters[i]; + try { + parsed[i] = parseValue(args.get(i), parameter.getClass()); + } catch (Exception e) { + return false; + } + + return false; + } + + private static Object parseValue(String stringValue, Class type) { + return "1"; + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/DontSkipVariablesUsedInLeftSideOfAssignments_after.java b/java/java-tests/testData/refactoring/extractMethod/DontSkipVariablesUsedInLeftSideOfAssignments_after.java new file mode 100644 index 000000000000..5f584067383f --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/DontSkipVariablesUsedInLeftSideOfAssignments_after.java @@ -0,0 +1,27 @@ + +import java.util.List; + +class Test { + + boolean m(Object[] parsed, String[] parameters, List args) { + int i = 1; + if (newMethod(parsed, parameters[i], args.get(i), i)) return false; + + return false; + } + + private boolean newMethod(Object[] parsed, String parameter1, String stringValue, int i) { + String parameter = parameter1; + try { + parsed[i] = parseValue(stringValue, parameter.getClass()); + } catch (Exception e) { + return true; + } + return false; + } + + private static Object parseValue(String stringValue, Class type) { + return "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 12fb997047ad..1f174efff7be 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java @@ -426,6 +426,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { doTest(); } + public void testDontSkipVariablesUsedInLeftSideOfAssignments() throws Exception { + doTest(); + } + public void testIDEADEV11748() throws Exception { doTest(); }