mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
extract class: visibility settings added (IDEA-21778)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+39
-8
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user