From e09b0fca1ef35698b0417dac325901c1a3aee20f Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 11 Mar 2016 13:07:49 +0300 Subject: [PATCH] IDEA-152851 Extract Method Object: incompilable result in case of `this` and `super` and anonymous class creation --- .../ExtractMethodObjectProcessor.java | 1 + .../extractMethodObject/ThisAndSuperAnon.java | 12 ++++++++++++ .../ThisAndSuperAnon.java.after | 16 ++++++++++++++++ .../refactoring/ExtractMethodObjectTest.java | 4 ++++ 4 files changed, 33 insertions(+) create mode 100644 java/java-tests/testData/refactoring/extractMethodObject/ThisAndSuperAnon.java create mode 100644 java/java-tests/testData/refactoring/extractMethodObject/ThisAndSuperAnon.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java index c0ced7f5d7e3..d8fd2feb9efa 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java @@ -439,6 +439,7 @@ public class ExtractMethodObjectProcessor extends BaseRefactoringProcessor { final PsiCodeBlock methodBody = getMethod().getBody(); LOG.assertTrue(methodBody != null); + adjustTargetClassReferences(methodBody); return myElementFactory.createExpressionFromText("new Object(){ \n" + "private " + returnType.getPresentableText() + diff --git a/java/java-tests/testData/refactoring/extractMethodObject/ThisAndSuperAnon.java b/java/java-tests/testData/refactoring/extractMethodObject/ThisAndSuperAnon.java new file mode 100644 index 000000000000..19c9f5333c44 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject/ThisAndSuperAnon.java @@ -0,0 +1,12 @@ +public class XXX extends Base { + int x = 5; + + public void context() { + int a = this.x; + int b = super.y; + } +} + +class Base { + int y = 7; +} diff --git a/java/java-tests/testData/refactoring/extractMethodObject/ThisAndSuperAnon.java.after b/java/java-tests/testData/refactoring/extractMethodObject/ThisAndSuperAnon.java.after new file mode 100644 index 000000000000..ca43a224b768 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject/ThisAndSuperAnon.java.after @@ -0,0 +1,16 @@ +public class XXX extends Base { + int x = 5; + + public void context() { + new Object() { + private void InnerClass() { + int a = XXX.this.x; + int b = XXX.super.y; + } + }.InnerClass(); + } +} + +class Base { + int y = 7; +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObjectTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObjectTest.java index c42cc596baa3..deb8f12c3839 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObjectTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObjectTest.java @@ -138,6 +138,10 @@ public class ExtractMethodObjectTest extends LightRefactoringTestCase { doTest(); } + public void testThisAndSuperAnon() throws Exception { + doTest(false); + } + public void testWithPrivateMethodWhichCantBeMoved() throws Exception { doTest(); }