Java: Show "Extract Method" dialog in transaction only when needed (IDEA-186521)

This commit is contained in:
Pavel Dolgov
2018-03-14 14:51:30 +03:00
parent c9b6e56e06
commit 4fa4cb4b5b
3 changed files with 24 additions and 8 deletions
@@ -36,4 +36,6 @@ public interface AbstractExtractDialog {
boolean isOK();
default boolean isPreviewUsages() {return false;}
default boolean showInTransaction() {return false;}
}
@@ -697,4 +697,9 @@ public class ExtractMethodDialog extends RefactoringDialog implements AbstractEx
public PsiType getReturnType() {
return mySelector != null ? mySelector.getSelectedType() : myReturnType;
}
@Override
public boolean showInTransaction() {
return true;
}
}
@@ -16,6 +16,7 @@ import com.intellij.ide.DataManager;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.ide.util.PsiClassListCellRenderer;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.TransactionGuard;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
@@ -26,10 +27,7 @@ import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Pass;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.WindowManager;
@@ -577,10 +575,21 @@ public class ExtractMethodProcessor implements MatchProvider {
public boolean showDialog(final boolean direct) {
AbstractExtractDialog dialog = createExtractMethodDialog(direct);
dialog.show();
if (!dialog.isOK()) return false;
apply(dialog);
return true;
Ref<Boolean> result = Ref.create(Boolean.FALSE);
Runnable showAndApply = () -> {
dialog.show();
if (dialog.isOK()) {
apply(dialog);
result.set(Boolean.TRUE);
}
};
if (dialog.showInTransaction()) {
TransactionGuard.getInstance().submitTransactionAndWait(showAndApply);
}
else {
showAndApply.run();
}
return result.get();
}
protected void apply(final AbstractExtractDialog dialog) {