IDEA-89344: create inner class: make a class static when needed

This commit is contained in:
anna
2012-07-30 18:45:59 +02:00
parent 03d6ee4544
commit 58ea14ba09
3 changed files with 35 additions and 4 deletions

View File

@@ -26,6 +26,7 @@ import com.intellij.openapi.ui.popup.PopupChooserBuilder;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.ui.components.JBList;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
@@ -79,18 +80,30 @@ public class CreateInnerClassFromUsageFix extends CreateClassFromUsageBaseFix {
while (contextMember != null) {
if (contextMember instanceof PsiClass && !(contextMember instanceof PsiTypeParameter)) {
result.add((PsiClass)contextMember);
if (!isUsedInExtends(run, (PsiClass)contextMember)) {
result.add((PsiClass)contextMember);
}
}
run = contextMember;
contextMember = PsiTreeUtil.getParentOfType(run, PsiMember.class);
if (contextMember != null && contextMember.hasModifierProperty(PsiModifier.STATIC)) {
break;
}
}
return result.isEmpty() ? PsiClass.EMPTY_ARRAY : result.toArray(new PsiClass[result.size()]);
}
private static boolean isUsedInExtends(PsiElement element, PsiClass psiClass) {
final PsiReferenceList extendsList = psiClass.getExtendsList();
final PsiReferenceList implementsList = psiClass.getImplementsList();
if (extendsList != null && PsiTreeUtil.isAncestor(extendsList, element, false)) {
return true;
}
if (implementsList != null && PsiTreeUtil.isAncestor(implementsList, element, false)) {
return true;
}
return false;
}
private void chooseTargetClass(PsiClass[] classes, final Editor editor, final String superClassName) {
final Project project = classes[0].getProject();
@@ -150,6 +163,9 @@ public class CreateInnerClassFromUsageFix extends CreateClassFromUsageBaseFix {
} else {
modifierList.setModifierProperty(PsiModifier.PRIVATE, true);
}
if (RefactoringUtil.isInStaticContext(ref, aClass)) {
modifierList.setModifierProperty(PsiModifier.STATIC, true);
}
if (superClassName != null) {
PsiJavaCodeReferenceElement superClass =
elementFactory.createReferenceElementByFQClassName(superClassName, created.getResolveScope());

View File

@@ -0,0 +1,9 @@
// "Create Inner Class 'Foo'" "true"
public class Test {
static class A extends Foo {
}
private static class Foo {
}
}

View File

@@ -0,0 +1,6 @@
// "Create Inner Class 'Foo'" "true"
public class Test {
static class A extends F<caret>oo {
}
}