List<Range> (@NotNull List<? extends Range> ranges, @NotNull Editor editor, int y) { int lineHeight = editor.getLineHeight(); int triangleGap = lineHeight / 3; Rectangle clip = new Rectangle(0, y - lineHeight, editor.getComponent().getWidth(), lineHeight * 2); List<ChangesBlock<Unit>> blocks = VisibleRangeMerger.merge(editor, ranges, clip); List<Range> result = new ArrayList<>(); for (ChangesBlock<Unit> block : blocks) { ChangedLines<Unit> firstChange = block.changes.get(0); ChangedLines<Unit> lastChange = block.changes.get(block.changes.size() - 1); int startY = firstChange.y1; int endY = lastChange.y2; // "empty" range for deleted block if (firstChange.y1 == firstChange.y2) { startY -= triangleGap; } if (lastChange.y1 == lastChange.y2) { endY += triangleGap; } if (startY <= y && endY > y) { result.addAll(block.ranges); } } return result; }