From b3dcbeb29a6aaa4e5fe0b1462a760ffd532ab365 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 26 Aug 2016 20:43:48 +0300 Subject: [PATCH] move instance method when ref was inside anonymous inheritor (EA-87325 - IOE: PsiJavaParserFacadeImpl.createExpressionFromText) --- .../MoveInstanceMethodDialog.java | 3 ++- .../MoveInstanceMethodProcessor.java | 8 ++++++- .../UsageInAnonymousClass.java | 20 ++++++++++++++++++ .../UsageInAnonymousClass.java.after | 21 +++++++++++++++++++ .../moveMethod/MoveInstanceMethodTest.java | 4 ++++ 5 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/moveInstanceMethod/UsageInAnonymousClass.java create mode 100644 java/java-tests/testData/refactoring/moveInstanceMethod/UsageInAnonymousClass.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodDialog.java b/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodDialog.java index 52f917b407c4..0646d43fde71 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodDialog.java @@ -26,6 +26,7 @@ import com.intellij.refactoring.move.MoveInstanceMembersUtil; import com.intellij.ui.EditorTextField; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.TitledSeparator; +import com.intellij.util.ObjectUtils; import com.intellij.util.containers.HashMap; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; @@ -123,7 +124,7 @@ public class MoveInstanceMethodDialog extends MoveInstanceMethodDialogBase { if (myThisClassesMap.size() == 0) return null; JPanel panel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP, 0, 0, true, true)); for (PsiClass aClass : myThisClassesMap.keySet()) { - final String text = RefactoringBundle.message("move.method.this.parameter.label", aClass.getName()); + final String text = RefactoringBundle.message("move.method.this.parameter.label", ObjectUtils.notNull(aClass.getName(), "")); panel.add(new TitledSeparator(text, null)); String suggestedName = MoveInstanceMethodHandler.suggestParameterNameForThisClass(aClass); diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java index 19abc7dcadb8..5584035f94fb 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java @@ -333,7 +333,13 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{ } } else { - thisArgumentText = classReferencedByThis.getName() + ".this"; + final String name = classReferencedByThis.getName(); + if (name != null) { + thisArgumentText = name + ".this"; + } + else { + thisArgumentText = "this"; + } } if (thisArgumentText != null) { diff --git a/java/java-tests/testData/refactoring/moveInstanceMethod/UsageInAnonymousClass.java b/java/java-tests/testData/refactoring/moveInstanceMethod/UsageInAnonymousClass.java new file mode 100644 index 000000000000..ea024a242bbd --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInstanceMethod/UsageInAnonymousClass.java @@ -0,0 +1,20 @@ + +class A { + class B { + private String foo; + + public void run() { + new B() { + @Override + public void run() { + moo(A.this); + } + }; + } + + void moo(A a) { + System.out.println(foo); + } + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveInstanceMethod/UsageInAnonymousClass.java.after b/java/java-tests/testData/refactoring/moveInstanceMethod/UsageInAnonymousClass.java.after new file mode 100644 index 000000000000..07e9b4a3208d --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInstanceMethod/UsageInAnonymousClass.java.after @@ -0,0 +1,21 @@ + +class A { + void moo(B b) { + System.out.println(b.foo); + } + + class B { + private String foo; + + public void run() { + new B() { + @Override + public void run() { + A.this.moo(this); + } + }; + } + + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/moveMethod/MoveInstanceMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/moveMethod/MoveInstanceMethodTest.java index 406d174934b4..4dc98f3c2a61 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/moveMethod/MoveInstanceMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/moveMethod/MoveInstanceMethodTest.java @@ -85,6 +85,10 @@ public class MoveInstanceMethodTest extends LightRefactoringTestCase { doTest(false, 0); } + public void testUsageInAnonymousClass() throws Exception { + doTest(true, 0); + } + public void testMethodReference() throws Exception { try { doTest(true, 0);