package org.intellij.markdown.parser.sequentialparsers import org.intellij.markdown.ExperimentalApi import org.intellij.markdown.parser.CancellationToken abstract class SequentialParserManager { abstract fun getParserSequence(): List @OptIn(ExperimentalApi::class) fun runParsingSequence( tokensCache: TokensCache, rangesToParse: List, ): Collection { return runParsingSequence(tokensCache, rangesToParse, CancellationToken.NonCancellable) } @ExperimentalApi fun runParsingSequence( tokensCache: TokensCache, rangesToParse: List, cancellationToken: CancellationToken ): Collection { val result = ArrayList() var parsingSpaces = ArrayList>() parsingSpaces.add(rangesToParse) for (sequentialParser in getParserSequence()) { cancellationToken.checkCancelled() val nextLevelSpaces = ArrayList>() for (parsingSpace in parsingSpaces) { val currentResult = sequentialParser.parse(tokensCache, parsingSpace) result.addAll(currentResult.parsedNodes) nextLevelSpaces.addAll(currentResult.rangesToProcessFurther) } parsingSpaces = nextLevelSpaces } return result } }