OC-2385 Feature Request: Extract method should create interface definition

OC-3557 Create method from usage for protocols
OC-4331 Allow extracting a method to a category
This commit is contained in:
Alexander Kirillin
2012-06-28 23:21:16 +04:00
parent f8d1f220b8
commit a1235143fc
11 changed files with 67 additions and 35 deletions
@@ -80,7 +80,7 @@ import static com.intellij.refactoring.changeSignature.ChangeSignatureHandler.RE
/**
* @author Konstantin Bulenkov
*/
public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase<ParameterInfoImpl, PsiMethod, JavaMethodDescriptor> {
public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase<ParameterInfoImpl, PsiMethod, String, JavaMethodDescriptor> {
private ExceptionsTableModel myExceptionsModel;
protected Set<PsiMethod> myMethodsToPropagateExceptions;
private AnActionButton myPropExceptionsButton;
@@ -95,7 +95,7 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase<Paramet
}
@Override
protected VisibilityPanelBase createVisibilityControl() {
protected VisibilityPanelBase<String> createVisibilityControl() {
return new JavaComboBoxVisibilityPanel();
}
@@ -192,7 +192,7 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase<Paramet
}
@Override
protected ParameterTableModelBase<ParameterInfoImpl> createParametersInfoModel(MethodDescriptor<ParameterInfoImpl> descriptor) {
protected ParameterTableModelBase<ParameterInfoImpl> createParametersInfoModel(MethodDescriptor<ParameterInfoImpl, String> descriptor) {
final PsiParameterList parameterList = ((JavaMethodDescriptor)descriptor).getMethod().getParameterList();
return new JavaParameterTableModel(parameterList, myDefaultValueContext, this);
}
@@ -25,7 +25,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
public class JavaMethodDescriptor implements MethodDescriptor<ParameterInfoImpl> {
public class JavaMethodDescriptor implements MethodDescriptor<ParameterInfoImpl, String> {
private final PsiMethod myMethod;
@@ -72,7 +72,7 @@ public class ExtractMethodDialog extends AbstractExtractDialog {
private final InputVariables myVariableData;
private final PsiClass myTargetClass;
private ComboBoxVisibilityPanel myVisibilityPanel;
private ComboBoxVisibilityPanel<String> myVisibilityPanel;
private boolean myDefaultVisibility = true;
private boolean myChangingVisibility;
@@ -300,7 +300,7 @@ public class ExtractMethodDialog extends AbstractExtractDialog {
return optionsPanel;
}
private ComboBoxVisibilityPanel createVisibilityPanel() {
private ComboBoxVisibilityPanel<String> createVisibilityPanel() {
final JavaComboBoxVisibilityPanel panel = new JavaComboBoxVisibilityPanel();
panel.setVisibility(PsiModifier.PRIVATE);
panel.addListener(new ChangeListener() {
@@ -22,7 +22,7 @@ import static com.intellij.util.VisibilityUtil.toPresentableText;
/**
* @author Konstantin Bulenkov
*/
public class JavaComboBoxVisibilityPanel extends ComboBoxVisibilityPanel implements PsiModifier {
public class JavaComboBoxVisibilityPanel extends ComboBoxVisibilityPanel<String> implements PsiModifier {
private static final String[] MODIFIERS = {PRIVATE, PACKAGE_LOCAL, PROTECTED, PUBLIC};
private static final String[] PRESENTABLE_NAMES = {
@@ -36,7 +36,7 @@ import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class JavaVisibilityPanel extends VisibilityPanelBase {
public class JavaVisibilityPanel extends VisibilityPanelBase<String> {
private JRadioButton myRbAsIs;
private JRadioButton myRbEscalate;
private final JRadioButton myRbPrivate;
@@ -72,7 +72,7 @@ import java.util.Set;
/**
* @author Konstantin Bulenkov
*/
public abstract class ChangeSignatureDialogBase<P extends ParameterInfo, M extends PsiElement, D extends MethodDescriptor<P>>
public abstract class ChangeSignatureDialogBase<P extends ParameterInfo, M extends PsiElement, V, D extends MethodDescriptor<P, V>>
extends RefactoringDialog {
protected static final String EXIT_SILENTLY = "";
@@ -89,7 +89,7 @@ public abstract class ChangeSignatureDialogBase<P extends ParameterInfo, M exten
private MethodSignatureComponent mySignatureArea;
private final Alarm myUpdateSignatureAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD);
protected VisibilityPanelBase myVisibilityPanel;
protected VisibilityPanelBase<V> myVisibilityPanel;
protected PsiCodeFragment myReturnTypeCodeFragment;
private DelegationPanel myDelegationPanel;
protected AnActionButton myPropagateParamChangesButton;
@@ -101,7 +101,7 @@ public abstract class ChangeSignatureDialogBase<P extends ParameterInfo, M exten
protected abstract LanguageFileType getFileType();
protected abstract ParameterTableModelBase<P> createParametersInfoModel(MethodDescriptor<P> method);
protected abstract ParameterTableModelBase<P> createParametersInfoModel(MethodDescriptor<P, V> method);
protected abstract BaseRefactoringProcessor createRefactoringProcessor();
@@ -113,7 +113,7 @@ public abstract class ChangeSignatureDialogBase<P extends ParameterInfo, M exten
protected abstract String calculateSignature();
protected abstract VisibilityPanelBase createVisibilityControl();
protected abstract VisibilityPanelBase<V> createVisibilityControl();
public ChangeSignatureDialogBase(Project project, final D method, boolean allowDelegation, PsiElement defaultValueContext) {
super(project, true);
@@ -148,7 +148,7 @@ public abstract class ChangeSignatureDialogBase<P extends ParameterInfo, M exten
}
}
protected String getVisibility() {
protected V getVisibility() {
if (myVisibilityPanel != null) {
return myVisibilityPanel.getVisibility();
}
@@ -19,7 +19,7 @@ import com.intellij.psi.PsiElement;
import java.util.List;
public interface MethodDescriptor<P extends ParameterInfo> {
public interface MethodDescriptor<P extends ParameterInfo, V> {
enum ReadWriteOption { ReadWrite, Read, None }
@@ -29,7 +29,7 @@ public interface MethodDescriptor<P extends ParameterInfo> {
int getParametersCount();
String getVisibility();
V getVisibility();
PsiElement getMethod();
@@ -15,8 +15,8 @@
*/
package com.intellij.refactoring.ui;
import com.intellij.openapi.ui.VerticalFlowLayout;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.ui.ListCellRendererWrapper;
import com.intellij.util.IJSwingUtilities;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.DialogUtil;
@@ -35,16 +35,17 @@ import java.util.Map;
/**
* @author Konstantin Bulenkov
*/
public class ComboBoxVisibilityPanel extends VisibilityPanelBase {
public class ComboBoxVisibilityPanel<V> extends VisibilityPanelBase<V> {
private final JLabel myLabel;
private final JComboBox myComboBox;
private final Map<String, String> myNamesMap = new HashMap<String, String>();
protected final JComboBox myComboBox;
private final Map<V, String> myNamesMap = new HashMap<V, String>();
public ComboBoxVisibilityPanel(String name, String[] options, String[] presentableNames) {
public ComboBoxVisibilityPanel(String name, V[] options, String[] presentableNames) {
setLayout(new BorderLayout(0,2));
myLabel = new JLabel(name);
add(myLabel, BorderLayout.NORTH);
myComboBox = new JComboBox(presentableNames);
myComboBox = new JComboBox(options);
myComboBox.setRenderer(getRenderer());
IJSwingUtilities.adjustComponentsOnMac(myLabel, myComboBox);
add(myComboBox, BorderLayout.SOUTH);
for (int i = 0; i < options.length; i++) {
@@ -66,26 +67,57 @@ public class ComboBoxVisibilityPanel extends VisibilityPanelBase {
DialogUtil.registerMnemonic(myLabel, myComboBox);
}
public ComboBoxVisibilityPanel(String name, String[] options) {
this(name, options, options);
protected ListCellRendererWrapper getRenderer() {
return new ListCellRendererWrapper(myComboBox) {
@Override
public void customize(JList list, Object value, int index, boolean selected, boolean hasFocus) {
setText(myNamesMap.get((V)value));
}
};
}
public ComboBoxVisibilityPanel(String[] options) {
public ComboBoxVisibilityPanel(String name, V[] options) {
this(name, options, getObjectNames(options));
}
private static String[] getObjectNames(Object[] options) {
String[] names = new String[options.length];
for (int i = 0; i < options.length; i ++) {
names[i] = options[i].toString();
}
return names;
}
public ComboBoxVisibilityPanel(V[] options) {
this(RefactoringBundle.message("visibility.combo.title"), options);
}
public ComboBoxVisibilityPanel(String[] options, String[] presentableNames) {
public ComboBoxVisibilityPanel(V[] options, String[] presentableNames) {
this(RefactoringBundle.message("visibility.combo.title"), options, presentableNames);
}
protected void addOption(int index, V option, String presentableName, boolean select) {
myNamesMap.put(option, presentableName);
myComboBox.insertItemAt(option, index);
if (select) {
myComboBox.setSelectedIndex(index);
}
}
protected void addOption(V option) {
addOption(myComboBox.getItemCount(), option, option.toString(), false);
}
public void setDisplayedMnemonicIndex(int index) {
myLabel.setDisplayedMnemonicIndex(index);
}
@Override
public String getVisibility() {
final String selected = (String)myComboBox.getSelectedItem();
return ContainerUtil.reverseMap(myNamesMap).get((selected));
public V getVisibility() {
return (V)myComboBox.getSelectedItem();
}
public void addListener(ChangeListener listener) {
@@ -97,8 +129,8 @@ public class ComboBoxVisibilityPanel extends VisibilityPanelBase {
}
@Override
public void setVisibility(String visibility) {
myComboBox.setSelectedItem(myNamesMap.get(visibility));
public void setVisibility(V visibility) {
myComboBox.setSelectedItem(visibility);
myEventDispatcher.getMulticaster().stateChanged(new ChangeEvent(this));
}
}
@@ -20,13 +20,13 @@ import com.intellij.util.EventDispatcher;
import javax.swing.*;
import javax.swing.event.ChangeListener;
public abstract class VisibilityPanelBase extends JPanel {
public abstract class VisibilityPanelBase<V> extends JPanel {
protected final EventDispatcher<ChangeListener> myEventDispatcher = EventDispatcher.create(ChangeListener.class);
public abstract String getVisibility();
public abstract V getVisibility();
public abstract void setVisibility(String visibility);
public abstract void setVisibility(V visibility);
public void addListener(ChangeListener listener) {
myEventDispatcher.addListener(listener);
@@ -75,7 +75,7 @@ public class GroovyExtractMethodDialog extends DialogWrapper {
private JCheckBox myCbSpecifyType;
private JLabel myNameLabel;
private MethodSignatureComponent mySignature;
private ComboBoxVisibilityPanel myVisibilityPanel;
private ComboBoxVisibilityPanel<String> myVisibilityPanel;
private Splitter mySplitter;
private JCheckBox myForceReturnCheckBox;
private ParameterTablePanel myParameterTablePanel;
@@ -24,7 +24,7 @@ import static com.intellij.util.VisibilityUtil.toPresentableText;
/**
* @author Max Medvedev
*/
public class GroovyComboboxVisibilityPanel extends ComboBoxVisibilityPanel {
public class GroovyComboboxVisibilityPanel extends ComboBoxVisibilityPanel<String> {
private static final String[] MODIFIERS = {PRIVATE, PROTECTED, PUBLIC, GrModifier.DEF};
private static final String[] PRESENTABLE_NAMES = {