From a6f67cae1f09e5b9f4013ff3b3da41a6ffe80f3a Mon Sep 17 00:00:00 2001 From: Alexandr Suhinin Date: Fri, 8 Jan 2021 11:06:00 +0200 Subject: [PATCH] IDEA-259023 refactor this: suggest `Safe Delete` for declarations only GitOrigin-RevId: ad8a16589415a16ce8b4df2c8b16e2aed1fc6430 --- ...SafeDeleteIsFilteredOnClassReference.java} | 0 ...SafeDeleteIsFilteredOnMethodReference.java | 8 +++++++ ...feDeleteIsFilteredOnVariableReference.java | 7 ++++++ .../SafeDeleteOnClassDeclaration.java | 6 +++++ .../SafeDeleteOnMethodDeclaration.java | 6 +++++ .../SafeDeleteOnVariableDeclaration.java | 6 +++++ .../java/refactoring/RefactorThisTest.kt | 22 ++++++++++++++++++- .../refactoring/actions/SafeDeleteAction.java | 11 ++++++++-- 8 files changed, 63 insertions(+), 3 deletions(-) rename java/java-tests/testData/refactoring/refactorThis/{SafeDeleteIsFiltered.java => SafeDeleteIsFilteredOnClassReference.java} (100%) create mode 100644 java/java-tests/testData/refactoring/refactorThis/SafeDeleteIsFilteredOnMethodReference.java create mode 100644 java/java-tests/testData/refactoring/refactorThis/SafeDeleteIsFilteredOnVariableReference.java create mode 100644 java/java-tests/testData/refactoring/refactorThis/SafeDeleteOnClassDeclaration.java create mode 100644 java/java-tests/testData/refactoring/refactorThis/SafeDeleteOnMethodDeclaration.java create mode 100644 java/java-tests/testData/refactoring/refactorThis/SafeDeleteOnVariableDeclaration.java diff --git a/java/java-tests/testData/refactoring/refactorThis/SafeDeleteIsFiltered.java b/java/java-tests/testData/refactoring/refactorThis/SafeDeleteIsFilteredOnClassReference.java similarity index 100% rename from java/java-tests/testData/refactoring/refactorThis/SafeDeleteIsFiltered.java rename to java/java-tests/testData/refactoring/refactorThis/SafeDeleteIsFilteredOnClassReference.java diff --git a/java/java-tests/testData/refactoring/refactorThis/SafeDeleteIsFilteredOnMethodReference.java b/java/java-tests/testData/refactoring/refactorThis/SafeDeleteIsFilteredOnMethodReference.java new file mode 100644 index 000000000000..6c25e6ca20a5 --- /dev/null +++ b/java/java-tests/testData/refactoring/refactorThis/SafeDeleteIsFilteredOnMethodReference.java @@ -0,0 +1,8 @@ +public class Test { + + void test(){ + foo(); + } + + void foo(){ } +} diff --git a/java/java-tests/testData/refactoring/refactorThis/SafeDeleteIsFilteredOnVariableReference.java b/java/java-tests/testData/refactoring/refactorThis/SafeDeleteIsFilteredOnVariableReference.java new file mode 100644 index 000000000000..1802c985a805 --- /dev/null +++ b/java/java-tests/testData/refactoring/refactorThis/SafeDeleteIsFilteredOnVariableReference.java @@ -0,0 +1,7 @@ +public class Test { + + void test(){ + int x = 42; + System.out.println(x); + } +} diff --git a/java/java-tests/testData/refactoring/refactorThis/SafeDeleteOnClassDeclaration.java b/java/java-tests/testData/refactoring/refactorThis/SafeDeleteOnClassDeclaration.java new file mode 100644 index 000000000000..b7c4282b936e --- /dev/null +++ b/java/java-tests/testData/refactoring/refactorThis/SafeDeleteOnClassDeclaration.java @@ -0,0 +1,6 @@ +public class Test { + + void test(){ + System.out.println(); + } +} diff --git a/java/java-tests/testData/refactoring/refactorThis/SafeDeleteOnMethodDeclaration.java b/java/java-tests/testData/refactoring/refactorThis/SafeDeleteOnMethodDeclaration.java new file mode 100644 index 000000000000..7da95a07946a --- /dev/null +++ b/java/java-tests/testData/refactoring/refactorThis/SafeDeleteOnMethodDeclaration.java @@ -0,0 +1,6 @@ +public class Test { + + void test(){ + System.out.println(); + } +} diff --git a/java/java-tests/testData/refactoring/refactorThis/SafeDeleteOnVariableDeclaration.java b/java/java-tests/testData/refactoring/refactorThis/SafeDeleteOnVariableDeclaration.java new file mode 100644 index 000000000000..3f13b7ad01a0 --- /dev/null +++ b/java/java-tests/testData/refactoring/refactorThis/SafeDeleteOnVariableDeclaration.java @@ -0,0 +1,6 @@ +public class Test { + + void test(){ + int x = 42; + } +} 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 83144fd17f18..53dee1d91b9a 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/RefactorThisTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/RefactorThisTest.kt @@ -83,10 +83,30 @@ class RefactorThisTest: LightJavaCodeInsightTestCase() { assertFalse(doActionExists()) } - fun testSafeDeleteIsFiltered() { + fun testSafeDeleteIsFilteredOnClassReference() { assertFalse(doActionExists()) } + fun testSafeDeleteIsFilteredOnMethodReference() { + assertFalse(doActionExists()) + } + + fun testSafeDeleteIsFilteredOnVariableReference() { + assertFalse(doActionExists()) + } + + fun testSafeDeleteOnClassDeclaration() { + assertTrue(doActionExists()) + } + + fun testSafeDeleteOnMethodDeclaration() { + assertTrue(doActionExists()) + } + + fun testSafeDeleteOnVariableDeclaration() { + assertTrue(doActionExists()) + } + fun testMoveIsFilteredOnStatement() { assertFalse(doActionExists()) } diff --git a/platform/lang-impl/src/com/intellij/refactoring/actions/SafeDeleteAction.java b/platform/lang-impl/src/com/intellij/refactoring/actions/SafeDeleteAction.java index c47d56908505..70ae9ec298e4 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/actions/SafeDeleteAction.java +++ b/platform/lang-impl/src/com/intellij/refactoring/actions/SafeDeleteAction.java @@ -22,6 +22,7 @@ import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.safeDelete.SafeDeleteHandler; import com.intellij.refactoring.safeDelete.SafeDeleteProcessor; @@ -61,8 +62,14 @@ public class SafeDeleteAction extends BaseRefactoringAction { @NotNull PsiFile file, @NotNull DataContext context, @NotNull String place) { - if (place.equals(ActionPlaces.REFACTORING_QUICKLIST)) return false; - return isAvailableOnElementInEditorAndFile(element, editor, file, context); + PsiElement targetElement = element; + if (place.equals(ActionPlaces.REFACTORING_QUICKLIST)) { + PsiElement caretElement = BaseRefactoringAction.getElementAtCaret(editor, file); + if (! PsiTreeUtil.isAncestor(element, caretElement, false)) { + targetElement = caretElement; + } + } + return isAvailableOnElementInEditorAndFile(targetElement, editor, file, context); } @Override