diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/AbstractExtractDialog.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/AbstractExtractDialog.java index c29422c47220..a5778c926994 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/AbstractExtractDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/AbstractExtractDialog.java @@ -36,4 +36,6 @@ public interface AbstractExtractDialog { boolean isOK(); default boolean isPreviewUsages() {return false;} + + default boolean showInTransaction() {return false;} } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java index 69a6cef6b2d5..da8ea042b46d 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java @@ -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; + } } diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java index 1566859ad581..14109821a9d0 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -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 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) {