From 69233974664d48b6afdb1ecf90462e24fe263a2a Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Fri, 14 Dec 2018 17:40:27 +0300 Subject: [PATCH] Java: Ignore bare method expression (without parentheses) when matching potential parameters of extracted method (IDEA-194264) --- .../refactoring/util/duplicates/Match.java | 2 ++ .../extractMethod/OneVariableExpression.java | 12 ++++++++++++ .../OneVariableExpression_after.java | 16 ++++++++++++++++ .../CodeDuplicatesWithMultOccurences_after.java | 2 +- .../java/refactoring/ExtractMethodTest.java | 4 ++++ 5 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/OneVariableExpression.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/OneVariableExpression_after.java diff --git a/java/java-analysis-impl/src/com/intellij/refactoring/util/duplicates/Match.java b/java/java-analysis-impl/src/com/intellij/refactoring/util/duplicates/Match.java index 85a84a13c028..e23333248221 100644 --- a/java/java-analysis-impl/src/com/intellij/refactoring/util/duplicates/Match.java +++ b/java/java-analysis-impl/src/com/intellij/refactoring/util/duplicates/Match.java @@ -126,6 +126,8 @@ public final class Match { final List currentValue = myParameterValues.get(psiVariable); final boolean isVararg = psiVariable instanceof PsiParameter && ((PsiParameter)psiVariable).isVarArgs(); if (!(value instanceof PsiExpression)) return false; + final PsiElement parent = value.getParent(); + if (parent instanceof PsiMethodCallExpression && value == ((PsiMethodCallExpression)parent).getMethodExpression()) return false; final PsiType type = ((PsiExpression)value).getType(); final PsiType parameterType = parameter.getType(); if (type == null) return false; diff --git a/java/java-tests/testData/refactoring/extractMethod/OneVariableExpression.java b/java/java-tests/testData/refactoring/extractMethod/OneVariableExpression.java new file mode 100644 index 000000000000..a2cefaaa50be --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/OneVariableExpression.java @@ -0,0 +1,12 @@ +import java.util.List; + +class C { + void m(List list) { + int i = 0; + System.out.println(i); + + if (list.size() > 0) { + System.out.println(list.size()); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/OneVariableExpression_after.java b/java/java-tests/testData/refactoring/extractMethod/OneVariableExpression_after.java new file mode 100644 index 000000000000..01349d8f84b2 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/OneVariableExpression_after.java @@ -0,0 +1,16 @@ +import java.util.List; + +class C { + void m(List list) { + int i = 0; + System.out.println(newMethod(i)); + + if (list.size() > 0) { + System.out.println(list.size()); + } + } + + private int newMethod(int i) { + return i; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod15/CodeDuplicatesWithMultOccurences_after.java b/java/java-tests/testData/refactoring/extractMethod15/CodeDuplicatesWithMultOccurences_after.java index 06cc36908eb3..a2ab95c25299 100644 --- a/java/java-tests/testData/refactoring/extractMethod15/CodeDuplicatesWithMultOccurences_after.java +++ b/java/java-tests/testData/refactoring/extractMethod15/CodeDuplicatesWithMultOccurences_after.java @@ -1,7 +1,7 @@ class Test { void t(java.util.Map m) { String f = ""; - System.out.println("f = " + newMethod(f) + ", " + newMethod(newMethod(f))); + System.out.println("f = " + newMethod(f) + ", " + m.get(newMethod(f))); } private String newMethod(String f) { 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 c4b260b86973..6f0aeabf7ba7 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java @@ -1321,6 +1321,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { doDuplicatesTest(); } + public void testOneVariableExpression() throws Exception { + doDuplicatesTest(); + } + public void testInterfaceMethodVisibility() throws Exception { final String doesNotExist = "foo.bar.baz.DoesNotExist"; final NullableNotNullManager nullManager = NullableNotNullManager.getInstance(getProject());