scan method

  1. @override
bool scan(
  1. StatelessExternalScannerState state,
  2. TreeSitterExternalLexer lexer,
  3. List<bool> validSymbols
)
override

Implementation

@override
bool scan(
  StatelessExternalScannerState state,
  TreeSitterExternalLexer lexer,
  List<bool> validSymbols,
) {
  if (validSymbols.length < 2 || validSymbols[1] || !validSymbols[0]) {
    return false;
  }
  if (!_isAsciiUpper(lexer.lookahead)) return false;

  var previous = lexer.lookahead;
  lexer.advance(skip: false);
  while (_isAsciiUpper(lexer.lookahead) ||
      _isAsciiDigit(lexer.lookahead) ||
      _isCommentTagInternal(lexer.lookahead)) {
    previous = lexer.lookahead;
    lexer.advance(skip: false);
  }
  lexer.markEnd();
  if (_isCommentTagInternal(previous)) return false;

  if ((_isWhitespace(lexer.lookahead) && !_isNewline(lexer.lookahead)) ||
      lexer.lookahead == 0x28) {
    while (_isWhitespace(lexer.lookahead) && !_isNewline(lexer.lookahead)) {
      lexer.advance(skip: false);
    }
    if (lexer.lookahead != 0x28) return false;
    lexer.advance(skip: false);
    var userLength = 0;
    while (lexer.lookahead != 0x29) {
      if (_isNewline(lexer.lookahead)) return false;
      lexer.advance(skip: false);
      userLength++;
    }
    if (userLength == 0) return false;
    lexer.advance(skip: false);
  }

  if (lexer.lookahead != 0x3a) return false;
  lexer.advance(skip: false);
  if (!_isWhitespace(lexer.lookahead)) return false;
  lexer.setResultSymbol(symbols[0]);
  return true;
}