void (@NotNull TextRange range, @NotNull List<? extends HighlightInfo> infos, @NotNull MarkupModelEx markup, int group, @NotNull HighlightingSession session, @NotNull List<? extends HighlightInfo> toRemove) { ApplicationManager.getApplication().assertIsNonDispatchThread(); ApplicationManager.getApplication().assertReadAccessAllowed(); PsiFile psiFile = session.getPsiFile(); Project project = session.getProject(); SeverityRegistrar severityRegistrar = SeverityRegistrar.getSeverityRegistrar(project); HighlightersRecycler toReuse = new HighlightersRecycler(); Document document = session.getDocument(); Long2ObjectMap<RangeMarker> range2markerCache = new Long2ObjectOpenHashMap<>(10); boolean[] changed = {false}; try { for (HighlightInfo info : toRemove) { RangeHighlighterEx highlighter = info.getHighlighter(); if (highlighter != null) { toReuse.recycleHighlighter(highlighter); } } List<HighlightInfo> filteredInfos = UpdateHighlightersUtil.HighlightInfoPostFilters.applyPostFilter(project, infos); ContainerUtil.quickSort(filteredInfos, UpdateHighlightersUtil.BY_ACTUAL_START_OFFSET_NO_DUPS); SweepProcessor.Generator<HighlightInfo> generator = processor -> ContainerUtil.process(filteredInfos, processor); List<HighlightInfo> fileLevelHighlights = new ArrayList<>(); List<HighlightInfo> infosToCreateHighlightersFor = new ArrayList<>(filteredInfos.size()); SweepProcessor.sweep(generator, (__, info, atStart, overlappingIntervals) -> { if (!atStart) { return true; } if (info.isFileLevelAnnotation()) { fileLevelHighlights.add(info); changed[0] = true; return true; } if (range.contains(info) && !UpdateHighlightersUtil.isWarningCoveredByError(info, severityRegistrar, overlappingIntervals)) { // have to create RangeHighlighter later, to avoid exposing them to the markup model immediately, // thus messing the HighlightInfo.getStartOffset() leading to "sweep generator supplied infos in a wrong order" exception infosToCreateHighlightersFor.add(info); changed[0] = true; } return true; }); for (HighlightInfo info : infosToCreateHighlightersFor) { createOrReuseHighlighterFor(info, session.getColorsScheme(), document, group, psiFile, markup, toReuse, range2markerCache, severityRegistrar); } session.updateFileLevelHighlights(fileLevelHighlights, group, range.equalsToRange(0, document.getTextLength())); changed[0] |= UpdateHighlightersUtil.incinerateObsoleteHighlighters(toReuse, session); } finally { toReuse.releaseHighlighters(); } if (changed[0]) { UpdateHighlightersUtil.clearWhiteSpaceOptimizationFlag(document); } }