Extract Function: Allow user to call the refactoring from conflict view

This commit is contained in:
Alexey Sedunov
2014-07-03 21:15:23 +04:00
parent ac17594f67
commit 52c107504d
3 changed files with 45 additions and 26 deletions
@@ -74,24 +74,23 @@ public class ExtractKotlinFunctionHandler(public val allContainersEnabled: Boole
throw ConflictsInTestsException(analysisResult.messages.map { it.renderMessage() })
}
fun proceedWithExtraction() {
val validationResult = analysisResult.descriptor!!.validate()
if (!project.checkConflictsInteractively(validationResult.conflicts)) return
val descriptor =
if (ApplicationManager.getApplication()!!.isUnitTestMode()) {
validationResult.descriptor
}
else {
val dialog = KotlinExtractFunctionDialog(project, validationResult)
if (!dialog.showAndGet()) return
dialog.getCurrentDescriptor()
}
fun doRefactor(descriptor: ExtractionDescriptor) {
preprocessor?.invoke(descriptor)
project.executeWriteCommand(EXTRACT_FUNCTION) { descriptor.generateFunction() }
}
fun validateAndRefactor() {
val validationResult = analysisResult.descriptor!!.validate()
project.checkConflictsInteractively(validationResult.conflicts) {
if (ApplicationManager.getApplication()!!.isUnitTestMode()) {
doRefactor(validationResult.descriptor)
}
else {
KotlinExtractFunctionDialog(project, validationResult) { doRefactor(it.getCurrentDescriptor()) }.show()
}
}
}
val message = analysisResult.messages.map { it.renderMessage() }.makeString("\n")
when (analysisResult.status) {
Status.CRITICAL_ERROR -> {
@@ -109,7 +108,7 @@ public class ExtractKotlinFunctionHandler(public val allContainersEnabled: Boole
MessageType.WARNING,
{ event ->
if (event?.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
proceedWithExtraction()
validateAndRefactor()
}
}
)
@@ -120,7 +119,7 @@ public class ExtractKotlinFunctionHandler(public val allContainersEnabled: Boole
.show(anchorPoint, Position.below)
}
Status.SUCCESS -> proceedWithExtraction()
Status.SUCCESS -> validateAndRefactor()
}
}
@@ -25,6 +25,9 @@ import com.intellij.ui.EditorTextField;
import com.intellij.ui.TitledSeparator;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import kotlin.Function0;
import kotlin.Function1;
import kotlin.Unit;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetClassBody;
import org.jetbrains.jet.lang.psi.JetFile;
@@ -54,12 +57,18 @@ public class KotlinExtractFunctionDialog extends DialogWrapper {
private final ExtractionDescriptorWithConflicts originalDescriptor;
private ExtractionDescriptor currentDescriptor;
public KotlinExtractFunctionDialog(Project project, ExtractionDescriptorWithConflicts originalDescriptor) {
private final Function1<KotlinExtractFunctionDialog, Unit> onAccept;
public KotlinExtractFunctionDialog(
@NotNull Project project,
@NotNull ExtractionDescriptorWithConflicts originalDescriptor,
@NotNull Function1<KotlinExtractFunctionDialog, Unit> onAccept) {
super(project, true);
this.project = project;
this.originalDescriptor = originalDescriptor;
this.currentDescriptor = originalDescriptor.getDescriptor();
this.onAccept = onAccept;
setModal(true);
setTitle(JetRefactoringBundle.message("extract.function"));
@@ -162,9 +171,17 @@ public class KotlinExtractFunctionDialog extends DialogWrapper {
MultiMap<PsiElement, String> conflicts = ExtractFunctionPackage.validate(currentDescriptor).getConflicts();
conflicts.values().removeAll(originalDescriptor.getConflicts().values());
if (RefactoringPackage.checkConflictsInteractively(project, conflicts)) {
super.doOKAction();
}
RefactoringPackage.checkConflictsInteractively(
project,
conflicts,
new Function0<Unit>() {
@Override
public Unit invoke() {
KotlinExtractFunctionDialog.super.doOKAction();
return onAccept.invoke(KotlinExtractFunctionDialog.this);
}
}
);
}
@Override
@@ -46,6 +46,7 @@ import com.intellij.refactoring.ui.ConflictsDialog
import com.intellij.util.containers.MultiMap
import com.intellij.openapi.command.CommandProcessor
import org.jetbrains.jet.lang.psi.codeFragmentUtil.skipVisibilityCheck
import com.intellij.openapi.ui.DialogWrapper
/**
* Replace [[JetSimpleNameExpression]] (and its enclosing qualifier) with qualified element given by FqName
@@ -147,14 +148,16 @@ public fun PsiElement.getAllExtractionContainers(strict: Boolean): List<JetEleme
return containers
}
public fun Project.checkConflictsInteractively(conflicts: MultiMap<PsiElement, String>): Boolean {
if (conflicts.isEmpty()) return true
public fun Project.checkConflictsInteractively(conflicts: MultiMap<PsiElement, String>, onAccept: () -> Unit) {
if (!conflicts.isEmpty()) {
if (ApplicationManager.getApplication()!!.isUnitTestMode()) throw ConflictsInTestsException(conflicts.values())
if (ApplicationManager.getApplication()!!.isUnitTestMode()) throw ConflictsInTestsException(conflicts.values())
val dialog = ConflictsDialog(this, conflicts, onAccept)
dialog.show()
if (!dialog.isOK()) return
}
val dialog = ConflictsDialog(this, conflicts)
dialog.show()
return dialog.isOK()
onAccept()
}
public fun Project.executeWriteCommand(name: String, command: () -> Unit) {