Extract Function: Allow user to call the refactoring from conflict view
This commit is contained in:
+15
-16
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+21
-4
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user