From 52c107504d65c12000a83f17a8754613941cc388 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 3 Jul 2014 21:15:23 +0400 Subject: [PATCH] Extract Function: Allow user to call the refactoring from conflict view --- .../ExtractKotlinFunctionHandler.kt | 31 +++++++++---------- .../ui/KotlinExtractFunctionDialog.java | 25 ++++++++++++--- .../plugin/refactoring/jetRefactoringUtil.kt | 15 +++++---- 3 files changed, 45 insertions(+), 26 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 e601bbb04c2..7113ba2184f 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractKotlinFunctionHandler.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractKotlinFunctionHandler.kt @@ -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() } } 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 a61580d2f76..be761cf56e7 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 @@ -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 onAccept; + + public KotlinExtractFunctionDialog( + @NotNull Project project, + @NotNull ExtractionDescriptorWithConflicts originalDescriptor, + @NotNull Function1 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 conflicts = ExtractFunctionPackage.validate(currentDescriptor).getConflicts(); conflicts.values().removeAll(originalDescriptor.getConflicts().values()); - if (RefactoringPackage.checkConflictsInteractively(project, conflicts)) { - super.doOKAction(); - } + RefactoringPackage.checkConflictsInteractively( + project, + conflicts, + new Function0() { + @Override + public Unit invoke() { + KotlinExtractFunctionDialog.super.doOKAction(); + return onAccept.invoke(KotlinExtractFunctionDialog.this); + } + } + ); } @Override diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt index 5efae6ad3a2..cf6139fa1ec 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt @@ -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): Boolean { - if (conflicts.isEmpty()) return true +public fun Project.checkConflictsInteractively(conflicts: MultiMap, 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) {