scan method

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

Implementation

@override
bool scan(
  JanetSimpleExternalScannerState state,
  TreeSitterExternalLexer lexer,
  List<bool> validSymbols,
) {
  // Exact counterpart of the pinned scanner's iswspace loop under the C
  // locale used by the native grammar build.
  while (_isWhitespace(lexer.lookahead)) {
    lexer.advance(skip: true);
  }

  if (!_valid(validSymbols, JanetSimpleExternalToken.longBufferLiteral) &&
      !_valid(validSymbols, JanetSimpleExternalToken.longStringLiteral)) {
    return false;
  }

  if (lexer.lookahead == 0x40) {
    lexer.setResultSymbol(
      symbols[JanetSimpleExternalToken.longBufferLiteral.index],
    );
    lexer.advance(skip: false);
  } else {
    lexer.setResultSymbol(
      symbols[JanetSimpleExternalToken.longStringLiteral.index],
    );
  }

  if (lexer.lookahead != 0x60) return false;

  lexer.advance(skip: false);
  var openingBackticks = 1;
  while (true) {
    if (lexer.isEof) return false;
    if (lexer.lookahead == 0x60) {
      openingBackticks++;
      lexer.advance(skip: false);
      continue;
    }
    lexer.advance(skip: false);
    break;
  }

  var consecutiveBackticks = 0;
  while (true) {
    if (lexer.isEof) return false;
    if (lexer.lookahead == 0x60) {
      consecutiveBackticks++;
      if (consecutiveBackticks == openingBackticks) {
        lexer.advance(skip: false);
        return true;
      }
    } else {
      consecutiveBackticks = 0;
    }
    lexer.advance(skip: false);
  }
}