private void processStickyLines(
    @Nullable SourceID source,
    int startOffset,
    int endOffset,
    @NotNull Processor<? super StickyLine> processor
  ) {
    myMarkupModel.processRangeHighlightersOverlappingWith(
      startOffset,
      endOffset,
      highlighter -> {
        if (STICKY_LINE_ATTRIBUTE.equals(highlighter.getTextAttributesKey()) && isSuitableSource(highlighter, source)) {
          StickyLineImpl stickyLine = highlighter.getUserData(STICKY_LINE_IMPL_KEY);
          if (stickyLine == null) {
            // probably it is a zombie highlighter
            stickyLine = new StickyLineImpl(highlighter.getDocument(), highlighter, "StickyZombie");
          }
          return processor.process(stickyLine);
        } else {
          return true;
        }
      }
    );
  }
private void processStickyLines(
    @Nullable SourceID source,
    int startOffset,
    int endOffset,
    @NotNull Processor<? super StickyLine> processor
  )