diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java index e7374961d506..3773594dc847 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -725,18 +725,31 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { parent = parent.getParent(); } if (parent instanceof PsiClass) { - final PsiClass parentClass = (PsiClass)parent; + PsiClass parentClass = (PsiClass)parent; final PsiClass containingClass = myMethod.getContainingClass(); if (InheritanceUtil.isInheritorOrSelf(parentClass, containingClass, true)) { qualifier = myFactory.createExpressionFromText("this", null); } else { - String name = containingClass.getName(); - if (name != null) { - qualifier = myFactory.createExpressionFromText(name + ".this", null); - } - else { //? - qualifier = myFactory.createExpressionFromText("this", null); + if (PsiTreeUtil.isAncestor(containingClass, parent, false)) { + String name = containingClass.getName(); + if (name != null) { + qualifier = myFactory.createExpressionFromText(name + ".this", null); + } + else { //? + qualifier = myFactory.createExpressionFromText("this", null); + } + } else { // we are inside the inheritor + do { + parentClass = PsiTreeUtil.getParentOfType(parentClass, PsiClass.class, true); + if (InheritanceUtil.isInheritorOrSelf(parentClass, containingClass, true)) { + LOG.assertTrue(parentClass != null); + final String childClassName = parentClass.getName(); + qualifier = myFactory.createExpressionFromText(childClassName != null ? childClassName + ".this" : "this", null); + break; + } + } + while (parentClass != null); } } } @@ -1103,7 +1116,7 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { PsiClassInitializer classInitializer = myFactory.createClassInitializer(); final PsiClass containingClass = field.getContainingClass(); classInitializer = (PsiClassInitializer)containingClass.addAfter(classInitializer, field); - containingClass.addAfter(CodeEditUtil.createLineFeed(field.getManager()), field); + containingClass.addAfter(CodeEditUtil.createLineFeed(field.getManager()), field); final PsiCodeBlock body = classInitializer.getBody(); PsiExpressionStatement statement = (PsiExpressionStatement)myFactory.createStatementFromText(field.getName() + " = 0;", body); statement = (PsiExpressionStatement)body.add(statement); diff --git a/java/java-tests/testData/refactoring/inlineMethod/MethodCallInOtherAnonymousOrInner.java b/java/java-tests/testData/refactoring/inlineMethod/MethodCallInOtherAnonymousOrInner.java new file mode 100644 index 000000000000..a38a62db314e --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/MethodCallInOtherAnonymousOrInner.java @@ -0,0 +1,23 @@ +public class Parent { + void execute(){} + void fooexecute(){ + execute(); + } +} + +class Child extends Parent { + void foo() { + fooexecute(); + new Runnable() { + public void run() { + fooexecute(); + } + }.run(); + } + + class InnerChild { + void bar() { + Child.this.fooexecute(); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/MethodCallInOtherAnonymousOrInner.java.after b/java/java-tests/testData/refactoring/inlineMethod/MethodCallInOtherAnonymousOrInner.java.after new file mode 100644 index 000000000000..b71aca17d4ff --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/MethodCallInOtherAnonymousOrInner.java.after @@ -0,0 +1,20 @@ +public class Parent { + void execute(){} +} + +class Child extends Parent { + void foo() { + execute(); + new Runnable() { + public void run() { + execute(); + } + }.run(); + } + + class InnerChild { + void bar() { + execute(); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java index abbdbd45622b..b65eb3fa8b3d 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java @@ -11,6 +11,7 @@ import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.testFramework.LightCodeInsightTestCase; import com.intellij.JavaTestUtil; +import com.intellij.usageView.UsageInfo; import com.intellij.util.containers.MultiMap; import java.util.ArrayList; @@ -54,7 +55,7 @@ public class PushDownTest extends LightCodeInsightTestCase { new PushDownProcessor(getProject(), membersToMove.toArray(new MemberInfo[membersToMove.size()]), currentClass, new DocCommentPolicy(DocCommentPolicy.ASIS)){ @Override - protected boolean showConflicts(MultiMap conflicts) { + protected boolean showConflicts(MultiMap conflicts, UsageInfo[] usages) { if (failure ? conflicts.isEmpty() : !conflicts.isEmpty()) { fail(failure ? "Conflict was not detected" : "False conflict was detected"); } diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java index 09ec7a5c58b8..650c7a70b987 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java @@ -68,6 +68,8 @@ public class InlineMethodTest extends LightCodeInsightTestCase { public void testFieldInitializer() throws Exception { doTest(); } + public void testMethodCallInOtherAnonymousOrInner() throws Exception { doTest(); } + public void testStaticFieldInitializer() throws Exception { doTest(); } public void testSCR22644() throws Exception { doTest(); }