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
}