themeTokens function

List<ThemedToken> themeTokens(
  1. String line,
  2. List<Token> tokens,
  3. SyntaxTheme theme
)

Applies theme to one line's raw tokens, merging adjacent tokens with the same style. tokens must come from tokenizing line.

Implementation

List<ThemedToken> themeTokens(
  String line,
  List<Token> tokens,
  SyntaxTheme theme,
) {
  final result = <ThemedToken>[];
  for (final token in tokens) {
    final style = theme.styleFor(token.scopes);
    final text = line.substring(token.start, token.end);
    if (result.isNotEmpty && result.last.style == style) {
      final last = result.removeLast();
      result.add(
        ThemedToken(last.text + text, last.offset, style, last.scopes),
      );
    } else {
      result.add(ThemedToken(text, token.start, style, token.scopes));
    }
  }
  return result;
}