From 9cdcca333b794b4d46a04ea14c7c742e89a3128a Mon Sep 17 00:00:00 2001 From: Alexandr Suhinin Date: Wed, 17 Feb 2021 23:15:57 +0200 Subject: [PATCH] IDEA-262337 refactor this: suggest `push members down` when there are inheritors only GitOrigin-RevId: b214655cfcb043081116cbb28c47dccc053a5560 --- .../memberPushDown/JavaPushDownHandler.java | 7 ++++++- .../refactoring/refactorThis/PushDownFiltered.java | 7 +++++++ .../refactoring/refactorThis/PushDownOnClass.java | 7 +++++++ .../refactoring/refactorThis/PushDownOnMethod.java | 7 +++++++ .../intellij/java/refactoring/RefactorThisTest.kt | 12 ++++++++++++ 5 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/refactorThis/PushDownFiltered.java create mode 100644 java/java-tests/testData/refactoring/refactorThis/PushDownOnClass.java create mode 100644 java/java-tests/testData/refactoring/refactorThis/PushDownOnMethod.java diff --git a/java/java-impl/src/com/intellij/refactoring/memberPushDown/JavaPushDownHandler.java b/java/java-impl/src/com/intellij/refactoring/memberPushDown/JavaPushDownHandler.java index 9c05be981b3c..27f4daec40fd 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPushDown/JavaPushDownHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPushDown/JavaPushDownHandler.java @@ -27,6 +27,7 @@ import com.intellij.openapi.util.NlsContexts; import com.intellij.openapi.util.Ref; import com.intellij.psi.*; import com.intellij.psi.impl.source.jsp.jspJava.JspClass; +import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.RefactoringActionHandler; @@ -54,7 +55,11 @@ public class JavaPushDownHandler implements RefactoringActionHandler, ElementsHa @Override public boolean isAvailableForQuickList(@NotNull Editor editor, @NotNull PsiFile file, @NotNull DataContext dataContext) { - return !getElements(editor, file, Ref.create(), true).isEmpty(); + final List elements = getElements(editor, file, Ref.create(), true); + if (elements.isEmpty()) return false; + PsiClass psiClass = PsiTreeUtil.getParentOfType(elements.get(0), PsiClass.class, false); + if (psiClass == null) return false; + return ClassInheritorsSearch.search(psiClass).iterator().hasNext(); } @Override diff --git a/java/java-tests/testData/refactoring/refactorThis/PushDownFiltered.java b/java/java-tests/testData/refactoring/refactorThis/PushDownFiltered.java new file mode 100644 index 000000000000..6f7bfe915bde --- /dev/null +++ b/java/java-tests/testData/refactoring/refactorThis/PushDownFiltered.java @@ -0,0 +1,7 @@ +class Parent { + void test(){} +} + +class Child extends Parent { + void foo(){} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/refactorThis/PushDownOnClass.java b/java/java-tests/testData/refactoring/refactorThis/PushDownOnClass.java new file mode 100644 index 000000000000..31a2eca29917 --- /dev/null +++ b/java/java-tests/testData/refactoring/refactorThis/PushDownOnClass.java @@ -0,0 +1,7 @@ +class Parent { + void test(){} +} + +class Child extends Parent { + void foo(){} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/refactorThis/PushDownOnMethod.java b/java/java-tests/testData/refactoring/refactorThis/PushDownOnMethod.java new file mode 100644 index 000000000000..a6b643860b2f --- /dev/null +++ b/java/java-tests/testData/refactoring/refactorThis/PushDownOnMethod.java @@ -0,0 +1,7 @@ +class Parent { + void test(){} +} + +class Child extends Parent { + void foo(){} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/RefactorThisTest.kt b/java/java-tests/testSrc/com/intellij/java/refactoring/RefactorThisTest.kt index bbd12f03b6f1..154da9334b57 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/RefactorThisTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/RefactorThisTest.kt @@ -160,6 +160,18 @@ class RefactorThisTest: LightJavaCodeInsightTestCase() { assertFalse(doActionExists()) } + fun testPushDownOnMethod() { + assertTrue(doActionExists()) + } + + fun testPushDownOnClass() { + assertTrue(doActionExists()) + } + + fun testPushDownFiltered() { + assertFalse(doActionExists()) + } + private inline fun doActionExists(): Boolean { configureByFile("$BASE_PATH/${getTestName(false)}.java") val actions = findAvailableActions()