override fun makeIntervals()

in src/org/jetbrains/r/editor/RMarkdownCellTypeAwareLexerProvider.kt [23:88]


  override fun makeIntervals(document: Document, event: DocumentEvent?): List<Interval> {
    val resultIntervals = mutableListOf<Interval>()

    val markdownLanguage = MarkdownLanguage.INSTANCE
    val documentTimestamp = document.modificationStamp
    val chars = document.charsSequence
    val codeIntervalLanguageParser = CodeIntervalLanguageParser()

    val lexer = RMarkdownMergingLangLexer()
    lexer.start(chars)

    while (lexer.tokenType != null) {
      when (lexer.tokenType) {
        RMarkdownCellType.MARKDOWN_CELL.elementType -> {
          resultIntervals += Interval(
            ordinal = resultIntervals.size,
            type = CellType.MARKDOWN,
            lines = lexer.getCurrentLinesIn(document),
            markers = MarkersAtLines.NO,
            language = markdownLanguage
          )
        }
        RMarkdownCellType.CODE_CELL.elementType -> {
          resultIntervals += Interval(
            ordinal = resultIntervals.size,
            type = CellType.CODE,
            lines = lexer.getCurrentLinesIn(document),
            markers = MarkersAtLines.TOP_AND_BOTTOM,
            language = codeIntervalLanguageParser.parse(cellText = lexer.tokenSequence) ?: PlainTextLanguage.INSTANCE
          )
        }
        else -> Unit
      }

      lexer.advance()
    }

    if (resultIntervals.lastOrNull()?.type == CellType.CODE && chars.endsWith('\n')) {
      val line = document.getLineNumber(chars.length)

      resultIntervals += Interval(
        ordinal = resultIntervals.size,
        type = CellType.MARKDOWN,
        lines = line..line,
        markers = MarkersAtLines.NO,
        language = markdownLanguage,
      )
    }

    if (resultIntervals.isEmpty()) {
      resultIntervals += Interval(
        ordinal = 0,
        type = CellType.MARKDOWN,
        lines = 0..max(0, document.lineCount - 1),
        markers = MarkersAtLines.NO,
        language = markdownLanguage,
      )
    }

    if (documentTimestamp != document.modificationStamp) {
      thisLogger().error("Document was modified during intervals creation")
      return makeIntervals(document, event)
    }

    return resultIntervals
  }