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 6752d6e8b45d..385f9345b30f 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -951,7 +951,10 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { if (parent instanceof PsiClass) { PsiClass parentClass = (PsiClass)parent; final PsiClass containingClass = myMethod.getContainingClass(); - if (InheritanceUtil.isInheritorOrSelf(parentClass, containingClass, true)) { + if (containingClass != null && parentClass.isInheritor(containingClass, true)) { + qualifier = myFactory.createExpressionFromText(parentClass.getName() + ".this", null); + } + else if (containingClass != null && parentClass.equals(containingClass)) { qualifier = myFactory.createExpressionFromText("this", null); } else { diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/ChangeContextUtil.java b/java/java-psi-impl/src/com/intellij/codeInsight/ChangeContextUtil.java index 546cb2d76df8..545030fbebe6 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/ChangeContextUtil.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/ChangeContextUtil.java @@ -167,6 +167,13 @@ public class ChangeContextUtil { if (qualifier == null){ if (encodedQualifierClass != null && encodedQualifierClass.isValid()){ if (encodedQualifierClass.equals(thisClass) && thisAccessExpr != null && thisAccessExpr.isValid()){ + if (thisAccessExpr instanceof PsiThisExpression) { + PsiJavaCodeReferenceElement thisAccessQualifier = ((PsiThisExpression)thisAccessExpr).getQualifier(); + PsiElement resolve = thisAccessQualifier != null ? thisAccessQualifier.resolve() : null; + if (PsiTreeUtil.getParentOfType(thisExpr, PsiClass.class) == resolve) { + return thisExpr; + } + } return thisExpr.replace(thisAccessExpr); } } diff --git a/java/java-tests/testData/refactoring/inlineMethod/ChangeContextForThisInNestedClasses.java b/java/java-tests/testData/refactoring/inlineMethod/ChangeContextForThisInNestedClasses.java new file mode 100644 index 000000000000..d1208e9d045e --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/ChangeContextForThisInNestedClasses.java @@ -0,0 +1,18 @@ +abstract class Test { + void g() { + new Object() { + void foo() { + Test.this.foo(); + } + }; + } + + void foo() { + } +} +class Test2 extends Test { + + { + g(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/ChangeContextForThisInNestedClasses.java.after b/java/java-tests/testData/refactoring/inlineMethod/ChangeContextForThisInNestedClasses.java.after new file mode 100644 index 000000000000..bef2c92e49e8 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/ChangeContextForThisInNestedClasses.java.after @@ -0,0 +1,15 @@ +abstract class Test { + + void foo() { + } +} +class Test2 extends Test { + + { + new Object() { + void foo() { + Test2.this.foo(); + } + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/superConstructorWithFieldInitialization/after/Test.java b/java/java-tests/testData/refactoring/inlineSuperClass/superConstructorWithFieldInitialization/after/Test.java index a9952f3f94a8..262a25fbd2ff 100644 --- a/java/java-tests/testData/refactoring/inlineSuperClass/superConstructorWithFieldInitialization/after/Test.java +++ b/java/java-tests/testData/refactoring/inlineSuperClass/superConstructorWithFieldInitialization/after/Test.java @@ -2,6 +2,6 @@ class Test { private final String field; Test(){ - this.field = "text"; + Test.this.field = "text"; } } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/thisQualificationInsideAnonymous/after/Test.java b/java/java-tests/testData/refactoring/inlineSuperClass/thisQualificationInsideAnonymous/after/Test.java index 0be9b584d7d7..c7ed879111a6 100644 --- a/java/java-tests/testData/refactoring/inlineSuperClass/thisQualificationInsideAnonymous/after/Test.java +++ b/java/java-tests/testData/refactoring/inlineSuperClass/thisQualificationInsideAnonymous/after/Test.java @@ -3,8 +3,8 @@ class Test { protected final Object myBizz; public Test() { - this.myBar = new Object() { + Test.this.myBar = new Object() { }; - this.myBizz = null; + Test.this.myBizz = null; } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java index 7119f4483e05..60b77d0db7b9 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java @@ -95,6 +95,7 @@ public class InlineMethodTest extends LightRefactoringTestCase { public void testStaticFieldInitializer() { doTest(); } public void testSCR22644() { doTest(); } + public void testChangeContextForThisInNestedClasses() { doTest(); } public void testCallUnderIf() { doTest(); }