inline method: don't ignore super expression conflict if containing class inherits target but the call is located inside static context (IDEA-152173)

This commit is contained in:
Anna.Kozlova
2016-04-26 19:46:11 +02:00
parent 0936ad00fd
commit 8822f1e267
5 changed files with 49 additions and 1 deletions

View File

@@ -302,7 +302,8 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor {
final PsiElement element = info.getElement();
if (element != null) {
final PsiClass targetContainingClass = PsiTreeUtil.getParentOfType(element, PsiClass.class);
if (targetContainingClass != null && !InheritanceUtil.isInheritorOrSelf(targetContainingClass, superClass, true)) {
if (targetContainingClass != null &&
(!InheritanceUtil.isInheritorOrSelf(targetContainingClass, superClass, true) || PsiUtil.getEnclosingStaticElement(element, targetContainingClass) != null)) {
targetContainingClasses.add(targetContainingClass);
}
}

View File

@@ -0,0 +1,13 @@
class A {
void bar() {}
}
class B extends A {
void foo() {
super.bar();
}
static void err(B b) {
b.fo<caret>o();
}
}

View File

@@ -0,0 +1,13 @@
class A {
void bar() {}
}
class B extends A {
void foo() {
super.bar();
}
void err() {
fo<caret>o();
}
}

View File

@@ -0,0 +1,13 @@
class A {
void bar() {}
}
class B extends A {
void foo() {
super.bar();
}
void err() {
super.bar();
}
}

View File

@@ -304,6 +304,14 @@ public class InlineMethodTest extends LightRefactoringTestCase {
doTestConflict("Inlined method is used in method reference with side effects in qualifier");
}
public void testInaccessibleSuperCallWhenQualifiedInline() throws Exception {
doTestConflict("Inlined method calls super.bar() which won't be accessed in class <b><code>B</code></b>");
}
public void testSuperCallWhenUnqualifiedInline() throws Exception {
doTestInlineThisOnly();
}
private void doTestInlineThisOnly() {
@NonNls String fileName = "/refactoring/inlineMethod/" + getTestName(false) + ".java";
configureByFile(fileName);