From 84b6b19292029bfde29699e99304d4c9babe84d6 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 13 Jan 2016 12:37:26 +0100 Subject: [PATCH] safe delete: more precise check for safe delete top level classes (IDEA-150276) --- .../safeDelete/JavaSafeDeleteProcessor.java | 10 +++++++--- .../safeDelete/InnerClassUsedInTheSameFile.java | 5 +++++ .../com/intellij/refactoring/SafeDeleteTest.java | 11 +++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/safeDelete/InnerClassUsedInTheSameFile.java diff --git a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java index a3fd53d37421..b7bd9384442a 100644 --- a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java @@ -519,9 +519,13 @@ public class JavaSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase { } LOG.assertTrue(element.getTextRange() != null); final PsiFile containingFile = psiClass.getContainingFile(); - final boolean sameFileWithSingleClass = containingFile instanceof PsiClassOwner && - ((PsiClassOwner)containingFile).getClasses().length == 1 && - element.getContainingFile() == containingFile; + boolean sameFileWithSingleClass = false; + if (containingFile instanceof PsiClassOwner) { + final PsiClass[] classes = ((PsiClassOwner)containingFile).getClasses(); + sameFileWithSingleClass = classes.length == 1 && + classes[0] == psiClass && + element.getContainingFile() == containingFile; + } usages.add(new SafeDeleteReferenceJavaDeleteUsageInfo(element, psiClass, sameFileWithSingleClass || isInNonStaticImport(element))); } return true; diff --git a/java/java-tests/testData/refactoring/safeDelete/InnerClassUsedInTheSameFile.java b/java/java-tests/testData/refactoring/safeDelete/InnerClassUsedInTheSameFile.java new file mode 100644 index 000000000000..fdfab00afc52 --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/InnerClassUsedInTheSameFile.java @@ -0,0 +1,5 @@ +class Test { + public void method(Foo p) {} + + static class Foo {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java index 719a074891ef..6dbea8657cf8 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java @@ -289,6 +289,17 @@ public class SafeDeleteTest extends MultiFileTestCase { doTest("ClassWithInnerStaticImport"); } + public void testInnerClassUsedInTheSameFile() throws Exception { + try { + doSingleFileTest(); + fail("Side effect was ignored"); + } + catch (BaseRefactoringProcessor.ConflictsInTestsException e) { + String message = e.getMessage(); + assertEquals("class Test.Foo has 1 usage that is not safe to delete.", message); + } + } + private void doTest(@NonNls final String qClassName) throws Exception { doTest((rootDir, rootAfter) -> { SafeDeleteTest.this.performAction(qClassName);