Extract Function: UI support for validation
This commit is contained in:
+1
-1
@@ -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()
|
||||||
|
|||||||
+18
-13
@@ -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
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user