Extract Function: UI support for validation

This commit is contained in:
Alexey Sedunov
2014-04-22 14:35:22 +04:00
parent 0e9676173b
commit a600606cac
2 changed files with 19 additions and 14 deletions
@@ -72,7 +72,7 @@ public class ExtractKotlinFunctionHandler : RefactoringActionHandler {
validationResult.descriptor validationResult.descriptor
} }
else { else {
val dialog = KotlinExtractFunctionDialog(project, validationResult.descriptor) val dialog = KotlinExtractFunctionDialog(project, validationResult)
if (!dialog.showAndGet()) return if (!dialog.showAndGet()) return
dialog.getCurrentDescriptor() dialog.getCurrentDescriptor()
@@ -23,6 +23,7 @@ import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.ui.EditorTextField; import com.intellij.ui.EditorTextField;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
@@ -47,15 +48,15 @@ public class KotlinExtractFunctionDialog extends DialogWrapper {
private final Project project; private final Project project;
private final ExtractionDescriptor originalDescriptor; private final ExtractionDescriptorWithConflicts originalDescriptor;
private ExtractionDescriptor currentDescriptor; private ExtractionDescriptor currentDescriptor;
public KotlinExtractFunctionDialog(Project project, ExtractionDescriptor originalDescriptor) { public KotlinExtractFunctionDialog(Project project, ExtractionDescriptorWithConflicts originalDescriptor) {
super(project, true); super(project, true);
this.project = project; this.project = project;
this.originalDescriptor = originalDescriptor; this.originalDescriptor = originalDescriptor;
this.currentDescriptor = originalDescriptor; this.currentDescriptor = originalDescriptor.getDescriptor();
setModal(true); setModal(true);
setTitle(JetRefactoringBundle.message("extract.function")); setTitle(JetRefactoringBundle.message("extract.function"));
@@ -68,7 +69,7 @@ public class KotlinExtractFunctionDialog extends DialogWrapper {
} }
private boolean isVisibilitySectionAvailable() { private boolean isVisibilitySectionAvailable() {
PsiElement target = originalDescriptor.getExtractionData().getNextSibling().getParent(); PsiElement target = originalDescriptor.getDescriptor().getExtractionData().getNextSibling().getParent();
return target instanceof JetClassOrObject || target instanceof JetFile; return target instanceof JetClassOrObject || target instanceof JetFile;
} }
@@ -108,7 +109,7 @@ public class KotlinExtractFunctionDialog extends DialogWrapper {
functionNameLabel.setLabelFor(functionNameField); functionNameLabel.setLabelFor(functionNameField);
functionNameField.setText(originalDescriptor.getName()); functionNameField.setText(originalDescriptor.getDescriptor().getName());
functionNameField.addDocumentListener( functionNameField.addDocumentListener(
new DocumentAdapter() { new DocumentAdapter() {
@Override @Override
@@ -121,7 +122,7 @@ public class KotlinExtractFunctionDialog extends DialogWrapper {
boolean enableVisibility = isVisibilitySectionAvailable(); boolean enableVisibility = isVisibilitySectionAvailable();
visibilityBox.setEnabled(enableVisibility); visibilityBox.setEnabled(enableVisibility);
if (enableVisibility) { if (enableVisibility) {
String visibility = originalDescriptor.getVisibility(); String visibility = originalDescriptor.getDescriptor().getVisibility();
visibilityBox.setSelectedItem(visibility.isEmpty() ? "internal" : visibility); visibilityBox.setSelectedItem(visibility.isEmpty() ? "internal" : visibility);
} }
@@ -141,14 +142,16 @@ public class KotlinExtractFunctionDialog extends DialogWrapper {
doCancelAction(); doCancelAction();
} }
}; };
parameterTablePanel.init(originalDescriptor.getParameters()); parameterTablePanel.init(originalDescriptor.getDescriptor().getParameters());
inputParametersPanel.add(parameterTablePanel); inputParametersPanel.add(parameterTablePanel);
} }
@Override @Override
protected void doOKAction() { protected void doOKAction() {
ExtractionDescriptorWithConflicts validationResult = ExtractFunctionPackage.validate(currentDescriptor); MultiMap<PsiElement, String> conflicts = ExtractFunctionPackage.validate(currentDescriptor).getConflicts();
if (RefactoringPackage.checkConflictsInteractively(project, validationResult.getConflicts())) { conflicts.values().removeAll(originalDescriptor.getConflicts().values());
if (RefactoringPackage.checkConflictsInteractively(project, conflicts)) {
super.doOKAction(); super.doOKAction();
} }
} }
@@ -170,6 +173,8 @@ public class KotlinExtractFunctionDialog extends DialogWrapper {
@NotNull @NotNull
private ExtractionDescriptor createDescriptor() { private ExtractionDescriptor createDescriptor() {
ExtractionDescriptor descriptor = originalDescriptor.getDescriptor();
List<KotlinParameterTablePanel.ParameterInfo> parameterInfos = parameterTablePanel.getParameterInfos(); List<KotlinParameterTablePanel.ParameterInfo> parameterInfos = parameterTablePanel.getParameterInfos();
Map<Parameter, Parameter> oldToNewParameters = ContainerUtil.newLinkedHashMap(); Map<Parameter, Parameter> oldToNewParameters = ContainerUtil.newLinkedHashMap();
@@ -177,13 +182,13 @@ public class KotlinExtractFunctionDialog extends DialogWrapper {
oldToNewParameters.put(parameterInfo.getOriginalParameter(), parameterInfo.toParameter()); oldToNewParameters.put(parameterInfo.getOriginalParameter(), parameterInfo.toParameter());
} }
ControlFlow controlFlow = originalDescriptor.getControlFlow(); ControlFlow controlFlow = descriptor.getControlFlow();
if (controlFlow instanceof ParameterUpdate) { if (controlFlow instanceof ParameterUpdate) {
controlFlow = new ParameterUpdate(oldToNewParameters.get(((ParameterUpdate) controlFlow).getParameter())); controlFlow = new ParameterUpdate(oldToNewParameters.get(((ParameterUpdate) controlFlow).getParameter()));
} }
Map<Integer, Replacement> replacementMap = ContainerUtil.newHashMap(); Map<Integer, Replacement> replacementMap = ContainerUtil.newHashMap();
for (Map.Entry<Integer, Replacement> e : originalDescriptor.getReplacementMap().entrySet()) { for (Map.Entry<Integer, Replacement> e : descriptor.getReplacementMap().entrySet()) {
Integer offset = e.getKey(); Integer offset = e.getKey();
Replacement replacement = e.getValue(); Replacement replacement = e.getValue();
@@ -202,11 +207,11 @@ public class KotlinExtractFunctionDialog extends DialogWrapper {
} }
return new ExtractionDescriptor( return new ExtractionDescriptor(
originalDescriptor.getExtractionData(), descriptor.getExtractionData(),
getFunctionName(), getFunctionName(),
getVisibility(), getVisibility(),
ContainerUtil.newArrayList(oldToNewParameters.values()), ContainerUtil.newArrayList(oldToNewParameters.values()),
originalDescriptor.getReceiverParameter(), descriptor.getReceiverParameter(),
replacementMap, replacementMap,
controlFlow controlFlow
); );