From ee2a5d061508a841b1e9c50bbc8ed501ce8213c9 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 23 Apr 2014 22:02:10 +0200 Subject: [PATCH] introduce: process chained method calls during same occurrences processing (IDEA-124349) --- .../AbstractJavaInplaceIntroducer.java | 6 +++-- .../chainMethodCall.java | 23 +++++++++++++++++++ .../chainMethodCall_after.java | 23 +++++++++++++++++++ .../InplaceIntroduceParameterTest.java | 10 ++++++++ .../GrAbstractInplaceIntroducer.java | 6 +++-- 5 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceParameter/chainMethodCall.java create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceParameter/chainMethodCall_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java index 85d7a9d8d748..5e610f52e40f 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java @@ -153,7 +153,7 @@ public abstract class AbstractJavaInplaceIntroducer extends AbstractInplaceIntro if (expression == null) { expression = PsiTreeUtil.getParentOfType(refVariableElement, PsiExpression.class); } - while (expression instanceof PsiReferenceExpression) { + while (expression instanceof PsiReferenceExpression || expression instanceof PsiMethodCallExpression) { final PsiElement parent = expression.getParent(); if (parent instanceof PsiMethodCallExpression) { if (parent.getText().equals(exprText)) return (PsiExpression)parent; @@ -163,8 +163,10 @@ public abstract class AbstractJavaInplaceIntroducer extends AbstractInplaceIntro if (expression.getText().equals(exprText)) { return expression; } - } else { + } else if (expression instanceof PsiReferenceExpression) { return null; + } else { + break; } } if (expression != null && expression.isValid() && expression.getText().equals(exprText)) { diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceParameter/chainMethodCall.java b/java/java-tests/testData/refactoring/inplaceIntroduceParameter/chainMethodCall.java new file mode 100644 index 000000000000..4dfe8c31affb --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceParameter/chainMethodCall.java @@ -0,0 +1,23 @@ +class Test { + + private void test() { + TestSubject subject = new TestSubject(); + boolean flag = false; + + if (subject.getSubject2().getVal() != flag) { + System.out.println(subject.getSubject2().getVal()); + } + } + + public static class TestSubject { + public TestSubject2 getSubject2() { + return new TestSubject2(); + } + } + + public static class TestSubject2 { + public boolean getVal() { + return true; + } + } +} diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceParameter/chainMethodCall_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceParameter/chainMethodCall_after.java new file mode 100644 index 000000000000..d4c5260001ee --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceParameter/chainMethodCall_after.java @@ -0,0 +1,23 @@ +class Test { + + private void test(boolean val) { + TestSubject subject = new TestSubject(); + boolean flag = false; + + if (val != flag) { + System.out.println(val); + } + } + + public static class TestSubject { + public TestSubject2 getSubject2() { + return new TestSubject2(); + } + } + + public static class TestSubject2 { + public boolean getVal() { + return true; + } + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceParameterTest.java b/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceParameterTest.java index 841a67ea001d..d4bda12f1bb9 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceParameterTest.java @@ -41,6 +41,16 @@ public class InplaceIntroduceParameterTest extends AbstractJavaInplaceIntroduceT }); } + public void testChainMethodCall() throws Exception { + doTest(new Pass() { + @Override + public void pass(AbstractInplaceIntroducer inplaceIntroduceFieldPopup) { + inplaceIntroduceFieldPopup.setReplaceAllOccurrences(true); + } + }); + } + + public void testReplaceAll1() throws Exception { doTest(new Pass() { @Override diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java index 1a81798fcf5a..759e95601608 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java @@ -96,7 +96,7 @@ public abstract class GrAbstractInplaceIntroducer