From 746ed966f9f6c538a61e2eb43a18d41c6f2d6058 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 17 Dec 2012 20:09:36 +0100 Subject: [PATCH] extract method: do not suggest to replace duplicates if candidates intersects with extracted method --- .../util/duplicates/DuplicatesFinder.java | 4 +++- .../extractMethod/TwoFromThreeEqStatements.java | 8 ++++++++ .../TwoFromThreeEqStatements_after.java | 12 ++++++++++++ .../com/intellij/refactoring/ExtractMethodTest.java | 6 +++++- 4 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/TwoFromThreeEqStatements.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/TwoFromThreeEqStatements_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesFinder.java b/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesFinder.java index b3bc0e9a80e7..fbc83793b201 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesFinder.java +++ b/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesFinder.java @@ -164,7 +164,9 @@ public class DuplicatesFinder { @Nullable private Match isDuplicateFragment(PsiElement candidate, boolean ignoreParameterTypes) { - if (PsiTreeUtil.isAncestor(myPattern[0], candidate, false)) return null; + for (PsiElement pattern : myPattern) { + if (PsiTreeUtil.isAncestor(pattern, candidate, false)) return null; + } PsiElement sibling = candidate; ArrayList candidates = new ArrayList(); for (final PsiElement element : myPattern) { diff --git a/java/java-tests/testData/refactoring/extractMethod/TwoFromThreeEqStatements.java b/java/java-tests/testData/refactoring/extractMethod/TwoFromThreeEqStatements.java new file mode 100644 index 000000000000..1be735566224 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/TwoFromThreeEqStatements.java @@ -0,0 +1,8 @@ +class Test { + + public static void main(String[] args) { + System.out.println("hello"); + System.out.println("hello"); + System.out.println("hello"); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/TwoFromThreeEqStatements_after.java b/java/java-tests/testData/refactoring/extractMethod/TwoFromThreeEqStatements_after.java new file mode 100644 index 000000000000..0b1bc280440e --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/TwoFromThreeEqStatements_after.java @@ -0,0 +1,12 @@ +class Test { + + public static void main(String[] args) { + newMethod(); + System.out.println("hello"); + } + + private static void newMethod() { + System.out.println("hello"); + System.out.println("hello"); + } +} \ 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 9e31dafe53f6..2dbbc94f8095 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java @@ -561,7 +561,11 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { public void testFinalParams4LocalClasses() throws Exception { doTest(); } - + + public void testTwoFromThreeEqStatements() throws Exception { + doDuplicatesTest(); + } + private void doTestDisabledParam() throws PrepareFailedException { final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject()); settings.ELSE_ON_NEW_LINE = true;