extract class: visibility settings added (IDEA-21778)

This commit is contained in:
anna
2009-10-27 12:23:57 +03:00
parent 6383243722
commit 67c770a3a3
3 changed files with 47 additions and 14 deletions
@@ -28,10 +28,7 @@ import com.intellij.refactoring.classMembers.DelegatingMemberInfoModel;
import com.intellij.refactoring.classMembers.MemberInfoBase;
import com.intellij.refactoring.classMembers.MemberInfoChange;
import com.intellij.refactoring.classMembers.MemberInfoChangeListener;
import com.intellij.refactoring.ui.MemberSelectionPanel;
import com.intellij.refactoring.ui.MemberSelectionTable;
import com.intellij.refactoring.ui.PackageNameReferenceEditorCombo;
import com.intellij.refactoring.ui.RefactoringDialog;
import com.intellij.refactoring.ui.*;
import com.intellij.refactoring.util.classMembers.MemberInfo;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.ReferenceEditorComboWithBrowseButton;
@@ -55,11 +52,14 @@ class ExtractClassDialog extends RefactoringDialog implements MemberInfoChangeLi
private final ReferenceEditorComboWithBrowseButton packageTextField;
private final JTextField sourceClassTextField;
private JCheckBox myGenerateAccessorsCb;
private VisibilityPanel myVisibilityPanel;
ExtractClassDialog(PsiClass sourceClass, PsiMember selectedMember) {
super(sourceClass.getProject(), true);
setModal(true);
setTitle(RefactorJBundle.message("extract.class.title"));
myVisibilityPanel = new VisibilityPanel(true, true);
myVisibilityPanel.setVisibility(null);
this.sourceClass = sourceClass;
final DocumentListener docListener = new DocumentAdapter() {
protected void textChanged(final DocumentEvent e) {
@@ -111,7 +111,7 @@ class ExtractClassDialog extends RefactoringDialog implements MemberInfoChangeLi
final String newClassName = getClassName();
final String packageName = getPackageName();
final ExtractClassProcessor processor = new ExtractClassProcessor(sourceClass, fields, methods, classes, packageName, newClassName, isGenerateAccessors());
final ExtractClassProcessor processor = new ExtractClassProcessor(sourceClass, fields, methods, classes, packageName, newClassName, myVisibilityPanel.getVisibility(), isGenerateAccessors());
invokeRefactoring(processor);
}
@@ -278,6 +278,8 @@ class ExtractClassDialog extends RefactoringDialog implements MemberInfoChangeLi
myGenerateAccessorsCb = new JCheckBox("Generate accessors");
myGenerateAccessorsCb.setMnemonic('G');
panel.add(myGenerateAccessorsCb, BorderLayout.SOUTH);
panel.add(myVisibilityPanel, BorderLayout.EAST);
return panel;
}
@@ -16,7 +16,6 @@
package com.intellij.refactoring.extractclass;
import com.intellij.ide.util.PackageUtil;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
@@ -43,10 +42,12 @@ import com.intellij.refactoring.psi.MethodInheritanceUtils;
import com.intellij.refactoring.psi.TypeParametersVisitor;
import com.intellij.refactoring.util.FixableUsageInfo;
import com.intellij.refactoring.util.FixableUsagesRefactoringProcessor;
import com.intellij.refactoring.util.RefactoringConflictsUtil;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.usageView.UsageInfo;
import com.intellij.usageView.UsageViewDescriptor;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.VisibilityUtil;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -63,6 +64,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
private final Set<PsiClass> innerClassesToMakePublic = new HashSet<PsiClass>();
private final List<PsiTypeParameter> typeParams = new ArrayList<PsiTypeParameter>();
private final String newPackageName;
private final String myNewVisibility;
private final boolean myGenerateAccessors;
private final String newClassName;
private final String delegateFieldName;
@@ -75,7 +77,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
List<PsiClass> innerClasses,
String newPackageName,
String newClassName) {
this(sourceClass, fields, methods, innerClasses, newPackageName, newClassName, false);
this(sourceClass, fields, methods, innerClasses, newPackageName, newClassName, null, false);
}
public ExtractClassProcessor(PsiClass sourceClass,
@@ -84,10 +86,12 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
List<PsiClass> classes,
String packageName,
String newClassName,
String newVisibility,
boolean generateAccessors) {
super(sourceClass.getProject());
this.sourceClass = sourceClass;
this.newPackageName = packageName;
myNewVisibility = newVisibility;
myGenerateAccessors = generateAccessors;
this.fields = new ArrayList<PsiField>(fields);
this.methods = new ArrayList<PsiMethod>(methods);
@@ -217,11 +221,39 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
}
protected void performRefactoring(UsageInfo[] usageInfos) {
if (!buildClass()) return;
final PsiClass psiClass = buildClass();
if (psiClass == null) return;
if (delegationRequired) {
buildDelegate();
}
super.performRefactoring(usageInfos);
if (myNewVisibility == null) return;
for (PsiMethod method : methods) {
final PsiMethod member = psiClass.findMethodBySignature(method, false);
if (member != null) {
fixVisibility(usageInfos, member);
}
}
for (PsiField field : fields) {
final PsiField member = psiClass.findFieldByName(field.getName(), false);
if (member != null) {
fixVisibility(usageInfos, member);
}
}
}
private void fixVisibility(UsageInfo[] usageInfos, PsiMember member) {
if (VisibilityUtil.ESCALATE_VISIBILITY.equals(myNewVisibility)) {
for (UsageInfo info : usageInfos) {
final PsiElement element = info.getElement();
if (element != null) {
VisibilityUtil.escalateVisibility(member, element);
}
}
} else {
RefactoringConflictsUtil.setVisibility(member.getModifierList(), myNewVisibility);
}
}
@@ -484,7 +516,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
}
private boolean buildClass() {
private PsiClass buildClass() {
final PsiManager manager = sourceClass.getManager();
final Project project = sourceClass.getProject();
final ExtractedClassBuilder extractedClassBuilder = new ExtractedClassBuilder();
@@ -538,15 +570,14 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
final PsiElement addedFile = directory.add(newFile);
final CodeStyleManager codeStyleManager = manager.getCodeStyleManager();
final PsiElement shortenedFile = JavaCodeStyleManager.getInstance(project).shortenClassReferences(addedFile);
codeStyleManager.reformat(shortenedFile);
return ((PsiJavaFile)codeStyleManager.reformat(shortenedFile)).getClasses()[0];
} else {
return false;
return null;
}
}
catch (IncorrectOperationException e) {
return false;
return null;
}
return true;
}
private List<PsiClass> calculateInterfacesSupported() {
@@ -120,7 +120,7 @@ public class ExtractClassTest extends MultiFileTestCase{
private static void doTest(final PsiClass aClass, final ArrayList<PsiMethod> methods, final ArrayList<PsiField> fields, final String conflicts,
boolean generateGettersSetters) {
try {
ExtractClassProcessor processor = new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), "", "Extracted", generateGettersSetters);
ExtractClassProcessor processor = new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), "", "Extracted", null, generateGettersSetters);
processor.run();
LocalFileSystem.getInstance().refresh(false);
FileDocumentManager.getInstance().saveAllDocuments();