From 0fe0c296c4ba5009319a0c0f0d34fc4839aeb5a8 Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Thu, 12 Oct 2017 16:01:39 +0300 Subject: [PATCH] Java: Extract method from similar expressions by introducing a parameter (IDEA-179924, IDEA-180107) --- .../util/duplicates/DuplicatesFinder.java | 3 +++ .../extractMethod/ExtractMethodProcessor.java | 4 +++- .../SuggestChangeSignatureTwoFieldInitializers.java | 4 ++++ ...estChangeSignatureTwoFieldInitializers_after.java | 12 ++++++++++++ .../intellij/java/refactoring/ExtractMethodTest.java | 4 ++++ 5 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureTwoFieldInitializers.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureTwoFieldInitializers_after.java diff --git a/java/java-analysis-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesFinder.java b/java/java-analysis-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesFinder.java index 449e1f4e754c..203f1d21efc1 100644 --- a/java/java-analysis-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesFinder.java +++ b/java/java-analysis-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesFinder.java @@ -573,6 +573,9 @@ public class DuplicatesFinder { if (!(pattern instanceof PsiExpression) || !(candidate instanceof PsiExpression) || withFolding && !myWithExtractedParameters) { return null; } + if (myPattern.length == 1 && myPattern[0] == pattern || candidates.size() == 1 && candidates.get(0) == candidate) { + return null; + } ComplexityHolder patternComplexity = null; if (withFolding) { 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 0ff5fba96ba8..a827c63aa40d 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -231,7 +231,9 @@ public class ExtractMethodProcessor implements MatchProvider { myCodeFragmentMember = codeFragment.getParent(); } if (myCodeFragmentMember == null) { - myCodeFragmentMember = ControlFlowUtil.findCodeFragment(codeFragment.getContext()).getParent(); + PsiElement context = codeFragment.getContext(); + LOG.assertTrue(context != null, "code fragment context is null"); + myCodeFragmentMember = ControlFlowUtil.findCodeFragment(context).getParent(); } myControlFlowWrapper = new ControlFlowWrapper(myProject, codeFragment, myElements); diff --git a/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureTwoFieldInitializers.java b/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureTwoFieldInitializers.java new file mode 100644 index 000000000000..16ac33bb4d3a --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureTwoFieldInitializers.java @@ -0,0 +1,4 @@ +public class C { + String f1 = "a" + "b"; + String f2 = "c" + "b"; +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureTwoFieldInitializers_after.java b/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureTwoFieldInitializers_after.java new file mode 100644 index 000000000000..4e8099d93c1e --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureTwoFieldInitializers_after.java @@ -0,0 +1,12 @@ +import org.jetbrains.annotations.NotNull; + +public class C { + String f1 = newMethod("a"); + + @NotNull + private String newMethod(String a) { + return a + "b"; + } + + String f2 = newMethod("c"); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java index fd2fc12f4c8b..3974c94802b4 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java @@ -839,6 +839,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { doDuplicatesTest(); } + public void testSuggestChangeSignatureTwoFieldInitializers() throws Exception { + doDuplicatesTest(); + } + public void testSuggestChangeSignatureWithChangedParameterName() throws Exception { configureByFile(BASE_PATH + getTestName(false) + ".java"); boolean success = performExtractMethod(true, true, getEditor(), getFile(), getProject(), false, null, false, "p");