use executeInBulk instead of manual flag switch to avoid inconsistent state in case of exception

This commit is contained in:
Alexey Kudravtsev
2017-02-21 15:54:31 +03:00
parent efa13a57db
commit 464a52ddd4
6 changed files with 40 additions and 65 deletions
@@ -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
@@ -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));
}
}
@@ -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<TextChange> 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);
@@ -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<Integer> 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) {
@@ -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 {
"a<selection>bcdef<caret></selection>g");
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("a<caret>g\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("a<caret>bc");
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 a<caret>bc");
@@ -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);
@@ -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());