mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
use executeInBulk instead of manual flag switch to avoid inconsistent state in case of exception
This commit is contained in:
@@ -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);
|
||||
|
||||
+7
-12
@@ -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) {
|
||||
|
||||
+19
-27
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user