void (@NotNull LineMarkerInfo<?> info, @NotNull MarkupModelEx markupModel, @NotNull HighlightersRecycler toReuse) { LineMarkerInfo.LineMarkerGutterIconRenderer<?> newRenderer = (LineMarkerInfo.LineMarkerGutterIconRenderer<?>)info.createGutterRenderer(); RangeHighlighterEx highlighter = toReuse.pickupHighlighterFromGarbageBin(info.startOffset, info.endOffset, HighlighterLayer.ADDITIONAL_SYNTAX); if (highlighter == null) { highlighter = markupModel.addRangeHighlighterAndChangeAttributes( null, info.startOffset, info.endOffset, HighlighterLayer.ADDITIONAL_SYNTAX, HighlighterTargetArea.LINES_IN_RANGE, false, changeAttributes(info, true, newRenderer, true, true)); MarkupEditorFilter editorFilter = info.getEditorFilter(); if (editorFilter != MarkupEditorFilter.EMPTY) { highlighter.setEditorFilter(editorFilter); } } else { LineMarkerInfo.LineMarkerGutterIconRenderer<?> oldRenderer = highlighter.getGutterIconRenderer() instanceof LineMarkerInfo.LineMarkerGutterIconRenderer<?> line ? line : null; boolean rendererChanged = newRenderer == null || !newRenderer.equals(oldRenderer); boolean lineSeparatorColorChanged = !Comparing.equal(highlighter.getLineSeparatorColor(), info.separatorColor); boolean lineSeparatorPlacementChanged = !Comparing.equal(highlighter.getLineSeparatorPlacement(), info.separatorPlacement); if (rendererChanged || lineSeparatorColorChanged || lineSeparatorPlacementChanged) { markupModel.changeAttributesInBatch(highlighter, changeAttributes(info, rendererChanged, newRenderer, lineSeparatorColorChanged, lineSeparatorPlacementChanged)); } HighlightingMarkupGrave.unmarkZombieMarkup(highlighter); } highlighter.putUserData(LINE_MARKER_INFO, info); info.highlighter = highlighter; }