safe delete: more precise check for safe delete top level classes (IDEA-150276)

This commit is contained in:
Anna Kozlova
2016-01-13 16:54:58 +01:00
parent 1b3ce12a93
commit 84b6b19292
3 changed files with 23 additions and 3 deletions
@@ -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;
@@ -0,0 +1,5 @@
class Test {
public void method(Foo p) {}
static class F<caret>oo {}
}
@@ -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 <b><code>Test.Foo</code></b> 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);