[coverage] EA-846712 Fix ConcurrentModificationException access list only with lock

GitOrigin-RevId: dcd1b7b3d81eb3ddcb99770843c5a1e5b3738ba5
This commit is contained in:
Maksim Zuev
2023-05-29 12:32:51 +00:00
committed by intellij-monorepo-bot
parent fe3da5ffb9
commit 79d5aa0eeb
@@ -203,19 +203,10 @@ public class CoverageEditorAnnotatorImpl implements CoverageEditorAnnotator, Dis
@Override
public void documentChanged(@NotNull final DocumentEvent e) {
myMapper.clear();
var rangeHighlighters = getOrCreateHighlighters(false);
if (rangeHighlighters == null) return;
int offset = e.getOffset();
final int lineNumber = document.getLineNumber(offset);
final int lastLineNumber = document.getLineNumber(offset + e.getNewLength());
var changeRange = new TextRange(document.getLineStartOffset(lineNumber), document.getLineEndOffset(lastLineNumber));
for (var it = rangeHighlighters.iterator(); it.hasNext(); ) {
final RangeHighlighter highlighter = it.next();
if (!highlighter.isValid() || highlighter.getTextRange().intersects(changeRange)) {
ApplicationManager.getApplication().invokeLater(() -> highlighter.dispose());
it.remove();
}
}
if (!removeChangedHighlighters(lineNumber, lastLineNumber, document)) return;
if (!myUpdateAlarm.isDisposed()) {
myUpdateAlarm.addRequest(() -> {
Int2IntMap newToOldLineMapping = myMapper.canGetFastMapping() ? myMapper.getNewToOldLineMapping() : null;
@@ -238,6 +229,20 @@ public class CoverageEditorAnnotatorImpl implements CoverageEditorAnnotator, Dis
}
}
private synchronized boolean removeChangedHighlighters(int lineNumber, int lastLineNumber, Document document) {
var rangeHighlighters = getOrCreateHighlighters(false);
if (rangeHighlighters == null) return false;
var changeRange = new TextRange(document.getLineStartOffset(lineNumber), document.getLineEndOffset(lastLineNumber));
for (var it = rangeHighlighters.iterator(); it.hasNext(); ) {
final RangeHighlighter highlighter = it.next();
if (!highlighter.isValid() || highlighter.getTextRange().intersects(changeRange)) {
ApplicationManager.getApplication().invokeLater(() -> highlighter.dispose());
it.remove();
}
}
return true;
}
protected void collectLinesInFile(@NotNull CoverageSuitesBundle suite,
@NotNull PsiFile psiFile,
Module module,