From 8822f1e267fae513206e6ebcdffbc3af410a9c60 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Tue, 26 Apr 2016 19:46:11 +0200 Subject: [PATCH] inline method: don't ignore super expression conflict if containing class inherits target but the call is located inside static context (IDEA-152173) --- .../refactoring/inline/InlineMethodProcessor.java | 3 ++- .../InaccessibleSuperCallWhenQualifiedInline.java | 13 +++++++++++++ .../SuperCallWhenUnqualifiedInline.java | 13 +++++++++++++ .../SuperCallWhenUnqualifiedInline.java.after | 13 +++++++++++++ .../refactoring/inline/InlineMethodTest.java | 8 ++++++++ 5 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/inlineMethod/InaccessibleSuperCallWhenQualifiedInline.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/SuperCallWhenUnqualifiedInline.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/SuperCallWhenUnqualifiedInline.java.after 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 01cd203301b0..ee09678ff7c9 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -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); } } diff --git a/java/java-tests/testData/refactoring/inlineMethod/InaccessibleSuperCallWhenQualifiedInline.java b/java/java-tests/testData/refactoring/inlineMethod/InaccessibleSuperCallWhenQualifiedInline.java new file mode 100644 index 000000000000..402b898bfe2c --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/InaccessibleSuperCallWhenQualifiedInline.java @@ -0,0 +1,13 @@ +class A { + void bar() {} +} + +class B extends A { + void foo() { + super.bar(); + } + + static void err(B b) { + b.foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/SuperCallWhenUnqualifiedInline.java b/java/java-tests/testData/refactoring/inlineMethod/SuperCallWhenUnqualifiedInline.java new file mode 100644 index 000000000000..90b19419417f --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/SuperCallWhenUnqualifiedInline.java @@ -0,0 +1,13 @@ +class A { + void bar() {} +} + +class B extends A { + void foo() { + super.bar(); + } + + void err() { + foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/SuperCallWhenUnqualifiedInline.java.after b/java/java-tests/testData/refactoring/inlineMethod/SuperCallWhenUnqualifiedInline.java.after new file mode 100644 index 000000000000..a0374627160c --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/SuperCallWhenUnqualifiedInline.java.after @@ -0,0 +1,13 @@ +class A { + void bar() {} +} + +class B extends A { + void foo() { + super.bar(); + } + + void err() { + super.bar(); + } +} \ No newline at end of file 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 ba6395fa993b..83180d7d423e 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java @@ -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"); + } + + public void testSuperCallWhenUnqualifiedInline() throws Exception { + doTestInlineThisOnly(); + } + private void doTestInlineThisOnly() { @NonNls String fileName = "/refactoring/inlineMethod/" + getTestName(false) + ".java"; configureByFile(fileName);