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