move instance member: disable visibility change when move into interface; insert @override if needed (IDEA-88471)

This commit is contained in:
anna
2012-07-09 13:39:03 +02:00
parent d1f95e1970
commit b47bf7ece1
6 changed files with 121 additions and 97 deletions
@@ -27,6 +27,7 @@ import com.intellij.ui.EditorTextField;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.TitledSeparatorWithMnemonic;
import com.intellij.util.containers.HashMap;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
@@ -86,6 +87,8 @@ public class MoveInstanceMethodDialog extends MoveInstanceMethodDialogBase {
separator.setLabelFor(myList);
validateTextFields(myList.getSelectedIndex());
updateOnChanged(myList);
return mainPanel;
}
@@ -150,6 +153,17 @@ public class MoveInstanceMethodDialog extends MoveInstanceMethodDialogBase {
invokeRefactoring(processor);
}
@Override
protected void updateOnChanged(JList list) {
super.updateOnChanged(list);
final PsiVariable selectedValue = (PsiVariable)list.getSelectedValue();
if (selectedValue != null) {
final PsiClassType psiType = (PsiClassType)selectedValue.getType();
final PsiClass targetClass = psiType.resolve();
UIUtil.setEnabled(myVisibilityPanel, targetClass != null && !targetClass.isInterface(), true);
}
}
protected void doHelpAction() {
HelpManager.getInstance().invokeHelp(HelpID.MOVE_INSTANCE_METHOD);
}
@@ -89,12 +89,16 @@ public abstract class MoveInstanceMethodDialogBase extends RefactoringDialog {
list.setSelectedIndex(0);
list.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
getOKAction().setEnabled(!list.getSelectionModel().isSelectionEmpty());
updateOnChanged(list);
}
});
return list;
}
protected void updateOnChanged(JList list) {
getOKAction().setEnabled(!list.getSelectionModel().isSelectionEmpty());
}
protected static JavaVisibilityPanel createVisibilityPanel() {
final JavaVisibilityPanel visibilityPanel = new JavaVisibilityPanel(false, true);
visibilityPanel.setVisibility(null);
@@ -16,6 +16,7 @@
package com.intellij.refactoring.move.moveInstanceMethod;
import com.intellij.codeInsight.ChangeContextUtil;
import com.intellij.codeInsight.generation.OverrideImplementUtil;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
@@ -216,7 +217,7 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{
for (UsageInfo usage : usages) {
if (usage instanceof InheritorUsageInfo) {
final PsiClass inheritor = ((InheritorUsageInfo)usage).getInheritor();
addMethodToClass(inheritor, patternMethod);
addMethodToClass(inheritor, patternMethod, true);
}
else if (usage instanceof MethodCallUsageInfo && !((MethodCallUsageInfo)usage).isInternal()) {
correctMethodCall(((MethodCallUsageInfo)usage).getMethodCallExpression(), false);
@@ -229,7 +230,7 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{
try {
if (myTargetClass.isInterface()) patternMethod.getBody().delete();
final PsiMethod method = addMethodToClass(myTargetClass, patternMethod);
final PsiMethod method = addMethodToClass(myTargetClass, patternMethod, false);
myMethod.delete();
for (PsiReference reference : docRefs) {
reference.bindToElement(method);
@@ -354,10 +355,13 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{
}
}
private static PsiMethod addMethodToClass(final PsiClass aClass, final PsiMethod patternMethod) {
private static PsiMethod addMethodToClass(final PsiClass aClass, final PsiMethod patternMethod, boolean canAddOverride) {
try {
final PsiMethod method = (PsiMethod)aClass.add(patternMethod);
ChangeContextUtil.decodeContextInfo(method, null, null);
if (canAddOverride && OverrideImplementUtil.isInsertOverride(method, aClass)) {
method.getModifierList().addAnnotation(CommonClassNames.JAVA_LANG_OVERRIDE);
}
return method;
}
catch (IncorrectOperationException e) {
@@ -119,10 +119,10 @@ public class RefactoringConflictsUtil {
conflicts.putValue(targetClass, message);
}
// check for member accessibility
else if (!manager.getResolveHelper().isAccessible(member, modifierListCopy, ref, null, null)) {
else if (!manager.getResolveHelper().isAccessible(member, modifierListCopy, ref, targetClass, null)) {
String message = RefactoringBundle.message("0.is.1.and.will.not.be.accessible.from.2.in.the.target.class",
RefactoringUIUtil.getDescription(member, true),
VisibilityUtil.getVisibilityStringToDisplay(member),
VisibilityUtil.toPresentableText(VisibilityUtil.getVisibilityModifier(modifierListCopy)),
RefactoringUIUtil.getDescription(ConflictsUtil.getContainer(ref), true));
message = CommonRefactoringUtil.capitalize(message);
conflicts.putValue(member, message);