From 464a52ddd43e31e82d73f6e48d21fa5339b16d6e Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 20 Feb 2017 20:36:36 +0300 Subject: [PATCH] use executeInBulk instead of manual flag switch to avoid inconsistent state in case of exception --- .../folding/JavaFoldingTest.groovy | 9 ++-- .../execution/impl/ConsoleViewImpl.java | 12 ++--- .../formatting/engine/ApplyChangesState.java | 9 ++-- .../editor/actions/IndentSelectionAction.java | 19 +++----- .../openapi/editor/impl/EditorImplTest.java | 46 ++++++++----------- .../intellij/codeInsight/XmlEventsTest.java | 10 ++-- 6 files changed, 40 insertions(+), 65 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy index 91b1773db911..809a0a70c8ff 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy @@ -39,6 +39,7 @@ import com.intellij.testFramework.EditorTestUtil import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl +import com.intellij.util.DocumentUtil import org.intellij.lang.annotations.Language import org.jetbrains.annotations.NotNull @@ -843,13 +844,9 @@ class Foo { def document = (DocumentEx)myFixture.editor.document WriteCommandAction.runWriteCommandAction myFixture.project, { - document.inBulkUpdate = true; - try { + DocumentUtil.executeInBulk(document, true, { document.insertString(document.getText().indexOf("}") + 1, "\n"); - } - finally { - document.inBulkUpdate = false; - } + } as Closure) } assertEquals 2, foldRegionsCount assertEquals 0, expandedFoldRegionsCount diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index 2f60a1ef7959..105ec4f4d087 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -768,15 +768,9 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo } final int documentTextLength = document.getTextLength(); if (documentTextLength > 0) { - CommandProcessor.getInstance().executeCommand(myProject, () -> { - document.setInBulkUpdate(true); - try { - document.deleteString(0, documentTextLength); - } - finally { - document.setInBulkUpdate(false); - } - }, null, DocCommandGroupId.noneGroupId(document)); + CommandProcessor.getInstance().executeCommand(myProject, + () -> DocumentUtil.executeInBulk(document, true, + ()->document.deleteString(0, documentTextLength)), null, DocCommandGroupId.noneGroupId(document)); } } diff --git a/platform/lang-impl/src/com/intellij/formatting/engine/ApplyChangesState.java b/platform/lang-impl/src/com/intellij/formatting/engine/ApplyChangesState.java index 9e6aa5a46265..9f562bcd13be 100644 --- a/platform/lang-impl/src/com/intellij/formatting/engine/ApplyChangesState.java +++ b/platform/lang-impl/src/com/intellij/formatting/engine/ApplyChangesState.java @@ -22,6 +22,7 @@ import com.intellij.openapi.editor.TextChange; import com.intellij.openapi.editor.ex.DocumentEx; import com.intellij.openapi.editor.impl.BulkChangesMerger; import com.intellij.openapi.editor.impl.TextChangeImpl; +import com.intellij.util.DocumentUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -72,8 +73,7 @@ public class ApplyChangesState extends State { Document document = documentModel.getDocument(); CaretOffsetUpdater caretOffsetUpdater = new CaretOffsetUpdater(document); - if (document instanceof DocumentEx) ((DocumentEx)document).setInBulkUpdate(true); - try { + DocumentUtil.executeInBulk(document, true, ()->{ List changes = new ArrayList<>(); int shift = 0; int currentIterationShift = 0; @@ -99,10 +99,7 @@ public class ApplyChangesState extends State { caretOffsetUpdater.update(changes); CharSequence mergeResult = BulkChangesMerger.INSTANCE.mergeToCharSequence(document.getChars(), document.getTextLength(), changes); document.replaceString(0, document.getTextLength(), mergeResult); - } - finally { - if (document instanceof DocumentEx) ((DocumentEx)document).setInBulkUpdate(false); - } + }); caretOffsetUpdater.restoreCaretLocations(); cleanupBlocks(blocksToModify); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/actions/IndentSelectionAction.java b/platform/platform-impl/src/com/intellij/openapi/editor/actions/IndentSelectionAction.java index ba5b9b137be2..98dee23bc8ee 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/actions/IndentSelectionAction.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/actions/IndentSelectionAction.java @@ -28,12 +28,12 @@ import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.actionSystem.EditorAction; import com.intellij.openapi.editor.actionSystem.EditorWriteActionHandler; -import com.intellij.openapi.editor.ex.DocumentEx; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.util.DocumentUtil; import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -119,12 +119,10 @@ public class IndentSelectionAction extends EditorAction { static void doIndent(final int endIndex, final int startIndex, final Document document, final Project project, final Editor editor, final int blockIndent) { - int caretOffset = editor.getCaretModel().getOffset(); + final int[] caretOffset = {editor.getCaretModel().getOffset()}; boolean bulkMode = endIndex - startIndex > 50; - if (bulkMode) ((DocumentEx)document).setInBulkUpdate(true); - - try { + DocumentUtil.executeInBulk(document, bulkMode, ()-> { List nonModifiableLines = new ArrayList<>(); if (project != null) { PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(document); @@ -139,15 +137,12 @@ public class IndentSelectionAction extends EditorAction { } for(int i=startIndex; i<=endIndex; i++) { if (!nonModifiableLines.contains(i)) { - caretOffset = EditorActionUtil.indentLine(project, editor, i, blockIndent, caretOffset); + caretOffset[0] = EditorActionUtil.indentLine(project, editor, i, blockIndent, caretOffset[0]); } } - } - finally { - if (bulkMode) ((DocumentEx)document).setInBulkUpdate(false); - } - - editor.getCaretModel().moveToOffset(caretOffset); + }); + + editor.getCaretModel().moveToOffset(caretOffset[0]); } static boolean canIndent(Document document, PsiFile file, int line, @NotNull IndentStrategy indentStrategy) { diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java index 395df54b07dc..7245d7efa538 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java @@ -113,13 +113,9 @@ public class EditorImplTest extends AbstractEditorTest { initText("something"); DocumentEx document = (DocumentEx)myEditor.getDocument(); runWriteCommand(() -> { - document.setInBulkUpdate(true); - try { + DocumentUtil.executeInBulk(document, true, ()-> { document.setText("something\telse"); - } - finally { - document.setInBulkUpdate(false); - } + }); }); checkResultByText("something\telse"); @@ -130,15 +126,11 @@ public class EditorImplTest extends AbstractEditorTest { "abcdefg"); runWriteCommand(() -> { DocumentEx document = (DocumentEx)myEditor.getDocument(); - document.setInBulkUpdate(true); - try { + DocumentUtil.executeInBulk(document, true, ()-> { // delete selected text document.deleteString(1, 6); document.deleteString(4, 9); - } - finally { - document.setInBulkUpdate(false); - } + }); }); checkResultByText("ag\n" + @@ -190,9 +182,9 @@ public class EditorImplTest extends AbstractEditorTest { configureSoftWraps(12); DocumentEx document = (DocumentEx)myEditor.getDocument(); runWriteCommand(() -> { - document.setInBulkUpdate(true); - document.replaceString(4, 5, "-"); - document.setInBulkUpdate(false); + DocumentUtil.executeInBulk(document, true, ()-> { + document.replaceString(4, 5, "-"); + }); }); assertEquals(new VisualPosition(1, 5), myEditor.getCaretModel().getVisualPosition()); @@ -203,15 +195,15 @@ public class EditorImplTest extends AbstractEditorTest { DocumentEx document = (DocumentEx)myEditor.getDocument(); runWriteCommand(() -> { - document.setInBulkUpdate(true); - document.replaceString(4, 5, "-"); - document.setInBulkUpdate(false); + DocumentUtil.executeInBulk(document, true, ()-> { + document.replaceString(4, 5, "-"); + }); myEditor.getCaretModel().moveToOffset(9); - document.setInBulkUpdate(true); - document.replaceString(4, 5, "+"); - document.setInBulkUpdate(false); + DocumentUtil.executeInBulk(document, true, ()-> { + document.replaceString(4, 5, "+"); + }); }); @@ -258,9 +250,9 @@ public class EditorImplTest extends AbstractEditorTest { initText("abc"); runWriteCommand(() -> { DocumentEx document = (DocumentEx)myEditor.getDocument(); - document.setInBulkUpdate(true); - document.insertString(0, "\n "); // we're changing number of visual lines, and invalidating text layout for caret line - document.setInBulkUpdate(false); + DocumentUtil.executeInBulk(document, true, ()-> { + document.insertString(0, "\n "); // we're changing number of visual lines, and invalidating text layout for caret line + }); }); checkResultByText("\n abc"); @@ -340,9 +332,9 @@ public class EditorImplTest extends AbstractEditorTest { initText("abcdef"); DocumentEx document = (DocumentEx)myEditor.getDocument(); runWriteCommand(() -> { - document.setInBulkUpdate(true); - document.insertString(3, "\n\n"); - document.setInBulkUpdate(false); + DocumentUtil.executeInBulk(document, true, ()-> { + document.insertString(3, "\n\n"); + }); }); RangeHighlighter[] highlighters = myEditor.getMarkupModel().getAllHighlighters(); assertEquals(1, highlighters.length); diff --git a/xml/tests/src/com/intellij/codeInsight/XmlEventsTest.java b/xml/tests/src/com/intellij/codeInsight/XmlEventsTest.java index 4194e078c584..6e292f8e57f1 100644 --- a/xml/tests/src/com/intellij/codeInsight/XmlEventsTest.java +++ b/xml/tests/src/com/intellij/codeInsight/XmlEventsTest.java @@ -20,7 +20,6 @@ import com.intellij.openapi.application.Result; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.editor.Document; -import com.intellij.openapi.editor.ex.DocumentEx; import com.intellij.openapi.util.TextRange; import com.intellij.pom.PomManager; import com.intellij.pom.PomModel; @@ -33,6 +32,7 @@ import com.intellij.psi.*; import com.intellij.psi.impl.source.PsiFileImpl; import com.intellij.psi.xml.*; import com.intellij.testFramework.LightCodeInsightTestCase; +import com.intellij.util.DocumentUtil; import org.jetbrains.annotations.NotNull; public class XmlEventsTest extends LightCodeInsightTestCase { @@ -125,10 +125,10 @@ public class XmlEventsTest extends LightCodeInsightTestCase { @Override protected void run(@NotNull Result result) throws Throwable { final Document document = PsiDocumentManager.getInstance(getProject()).getDocument(file); - ((DocumentEx)document).setInBulkUpdate(true); - document.insertString(0, " "); - commitDocument(document); - ((DocumentEx)document).setInBulkUpdate(false); + DocumentUtil.executeInBulk(document, true, ()-> { + document.insertString(0, " "); + commitDocument(document); + }); } }.execute(); assertEquals("(Xml document changed)", listener.getEventString().trim());