From 79d5aa0eebd2dfd76e8692ea7df90d377a72ee82 Mon Sep 17 00:00:00 2001 From: Maksim Zuev Date: Mon, 29 May 2023 10:49:37 +0200 Subject: [PATCH] [coverage] EA-846712 Fix ConcurrentModificationException access list only with lock GitOrigin-RevId: dcd1b7b3d81eb3ddcb99770843c5a1e5b3738ba5 --- .../coverage/CoverageEditorAnnotatorImpl.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/plugins/coverage-common/src/com/intellij/coverage/CoverageEditorAnnotatorImpl.java b/plugins/coverage-common/src/com/intellij/coverage/CoverageEditorAnnotatorImpl.java index 2020651e8afc..cf837d5db482 100644 --- a/plugins/coverage-common/src/com/intellij/coverage/CoverageEditorAnnotatorImpl.java +++ b/plugins/coverage-common/src/com/intellij/coverage/CoverageEditorAnnotatorImpl.java @@ -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,