From a600606cacac5cd9d3528397936e5b8f4dd790a1 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 22 Apr 2014 14:35:22 +0400 Subject: [PATCH] Extract Function: UI support for validation --- .../ExtractKotlinFunctionHandler.kt | 2 +- .../ui/KotlinExtractFunctionDialog.java | 31 +++++++++++-------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractKotlinFunctionHandler.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractKotlinFunctionHandler.kt index 044e93fcd73..328babf15ba 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractKotlinFunctionHandler.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractKotlinFunctionHandler.kt @@ -72,7 +72,7 @@ public class ExtractKotlinFunctionHandler : RefactoringActionHandler { validationResult.descriptor } else { - val dialog = KotlinExtractFunctionDialog(project, validationResult.descriptor) + val dialog = KotlinExtractFunctionDialog(project, validationResult) if (!dialog.showAndGet()) return dialog.getCurrentDescriptor() diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ui/KotlinExtractFunctionDialog.java b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ui/KotlinExtractFunctionDialog.java index a8219aa044a..7d14d286379 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ui/KotlinExtractFunctionDialog.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ui/KotlinExtractFunctionDialog.java @@ -23,6 +23,7 @@ import com.intellij.openapi.ui.DialogWrapper; import com.intellij.psi.PsiElement; import com.intellij.ui.EditorTextField; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetFile; @@ -47,15 +48,15 @@ public class KotlinExtractFunctionDialog extends DialogWrapper { private final Project project; - private final ExtractionDescriptor originalDescriptor; + private final ExtractionDescriptorWithConflicts originalDescriptor; private ExtractionDescriptor currentDescriptor; - public KotlinExtractFunctionDialog(Project project, ExtractionDescriptor originalDescriptor) { + public KotlinExtractFunctionDialog(Project project, ExtractionDescriptorWithConflicts originalDescriptor) { super(project, true); this.project = project; this.originalDescriptor = originalDescriptor; - this.currentDescriptor = originalDescriptor; + this.currentDescriptor = originalDescriptor.getDescriptor(); setModal(true); setTitle(JetRefactoringBundle.message("extract.function")); @@ -68,7 +69,7 @@ public class KotlinExtractFunctionDialog extends DialogWrapper { } private boolean isVisibilitySectionAvailable() { - PsiElement target = originalDescriptor.getExtractionData().getNextSibling().getParent(); + PsiElement target = originalDescriptor.getDescriptor().getExtractionData().getNextSibling().getParent(); return target instanceof JetClassOrObject || target instanceof JetFile; } @@ -108,7 +109,7 @@ public class KotlinExtractFunctionDialog extends DialogWrapper { functionNameLabel.setLabelFor(functionNameField); - functionNameField.setText(originalDescriptor.getName()); + functionNameField.setText(originalDescriptor.getDescriptor().getName()); functionNameField.addDocumentListener( new DocumentAdapter() { @Override @@ -121,7 +122,7 @@ public class KotlinExtractFunctionDialog extends DialogWrapper { boolean enableVisibility = isVisibilitySectionAvailable(); visibilityBox.setEnabled(enableVisibility); if (enableVisibility) { - String visibility = originalDescriptor.getVisibility(); + String visibility = originalDescriptor.getDescriptor().getVisibility(); visibilityBox.setSelectedItem(visibility.isEmpty() ? "internal" : visibility); } @@ -141,14 +142,16 @@ public class KotlinExtractFunctionDialog extends DialogWrapper { doCancelAction(); } }; - parameterTablePanel.init(originalDescriptor.getParameters()); + parameterTablePanel.init(originalDescriptor.getDescriptor().getParameters()); inputParametersPanel.add(parameterTablePanel); } @Override protected void doOKAction() { - ExtractionDescriptorWithConflicts validationResult = ExtractFunctionPackage.validate(currentDescriptor); - if (RefactoringPackage.checkConflictsInteractively(project, validationResult.getConflicts())) { + MultiMap conflicts = ExtractFunctionPackage.validate(currentDescriptor).getConflicts(); + conflicts.values().removeAll(originalDescriptor.getConflicts().values()); + + if (RefactoringPackage.checkConflictsInteractively(project, conflicts)) { super.doOKAction(); } } @@ -170,6 +173,8 @@ public class KotlinExtractFunctionDialog extends DialogWrapper { @NotNull private ExtractionDescriptor createDescriptor() { + ExtractionDescriptor descriptor = originalDescriptor.getDescriptor(); + List parameterInfos = parameterTablePanel.getParameterInfos(); Map oldToNewParameters = ContainerUtil.newLinkedHashMap(); @@ -177,13 +182,13 @@ public class KotlinExtractFunctionDialog extends DialogWrapper { oldToNewParameters.put(parameterInfo.getOriginalParameter(), parameterInfo.toParameter()); } - ControlFlow controlFlow = originalDescriptor.getControlFlow(); + ControlFlow controlFlow = descriptor.getControlFlow(); if (controlFlow instanceof ParameterUpdate) { controlFlow = new ParameterUpdate(oldToNewParameters.get(((ParameterUpdate) controlFlow).getParameter())); } Map replacementMap = ContainerUtil.newHashMap(); - for (Map.Entry e : originalDescriptor.getReplacementMap().entrySet()) { + for (Map.Entry e : descriptor.getReplacementMap().entrySet()) { Integer offset = e.getKey(); Replacement replacement = e.getValue(); @@ -202,11 +207,11 @@ public class KotlinExtractFunctionDialog extends DialogWrapper { } return new ExtractionDescriptor( - originalDescriptor.getExtractionData(), + descriptor.getExtractionData(), getFunctionName(), getVisibility(), ContainerUtil.newArrayList(oldToNewParameters.values()), - originalDescriptor.getReceiverParameter(), + descriptor.getReceiverParameter(), replacementMap, controlFlow );