From 67c770a3a30444b15115702e54db3e0ded35012e Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 26 Oct 2009 21:30:36 +0300 Subject: [PATCH] extract class: visibility settings added (IDEA-21778) --- .../extractclass/ExtractClassDialog.java | 12 +++-- .../extractclass/ExtractClassProcessor.java | 47 +++++++++++++++---- .../refactoring/ExtractClassTest.java | 2 +- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassDialog.java b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassDialog.java index 4b3dcd1f991d..e9c0997b61ce 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassDialog.java @@ -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; } diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java index eb3549167e0d..58a07e6e454b 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java @@ -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 innerClassesToMakePublic = new HashSet(); private final List typeParams = new ArrayList(); 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 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 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(fields); this.methods = new ArrayList(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 calculateInterfacesSupported() { diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java index 7b7ec5da6ef7..bc8f93c89f33 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java @@ -120,7 +120,7 @@ public class ExtractClassTest extends MultiFileTestCase{ private static void doTest(final PsiClass aClass, final ArrayList methods, final ArrayList fields, final String conflicts, boolean generateGettersSetters) { try { - ExtractClassProcessor processor = new ExtractClassProcessor(aClass, fields, methods, new ArrayList(), "", "Extracted", generateGettersSetters); + ExtractClassProcessor processor = new ExtractClassProcessor(aClass, fields, methods, new ArrayList(), "", "Extracted", null, generateGettersSetters); processor.run(); LocalFileSystem.getInstance().refresh(false); FileDocumentManager.getInstance().saveAllDocuments();