scan method

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

Implementation

@override
bool scan(
  RonExternalScannerState state,
  TreeSitterExternalLexer lexer,
  List<bool> validSymbols,
) {
  if (_valid(validSymbols, RonExternalToken.stringContent) &&
      !_valid(validSymbols, RonExternalToken.float)) {
    var hasContent = false;
    while (true) {
      if (lexer.lookahead == 0x22 || lexer.lookahead == 0x5c) break;
      if (lexer.isEof) return false;
      hasContent = true;
      _advance(lexer);
    }
    lexer.setResultSymbol(symbols[RonExternalToken.stringContent.index]);
    return hasContent;
  }

  while (_isWhitespace(lexer.lookahead)) {
    lexer.advance(skip: true);
  }

  if (_valid(validSymbols, RonExternalToken.rawString) &&
      (lexer.lookahead == 0x72 || lexer.lookahead == 0x62)) {
    lexer.setResultSymbol(symbols[RonExternalToken.rawString.index]);
    if (lexer.lookahead == 0x62) _advance(lexer);
    if (lexer.lookahead != 0x72) return false;
    _advance(lexer);

    var openingHashCount = 0;
    while (lexer.lookahead == 0x23) {
      _advance(lexer);
      openingHashCount++;
    }
    if (lexer.lookahead != 0x22) return false;
    _advance(lexer);

    while (true) {
      if (lexer.isEof) return false;
      if (lexer.lookahead == 0x22) {
        _advance(lexer);
        var hashCount = 0;
        while (lexer.lookahead == 0x23 && hashCount < openingHashCount) {
          _advance(lexer);
          hashCount++;
        }
        if (hashCount == openingHashCount) return true;
      } else {
        _advance(lexer);
      }
    }
  }

  if (_valid(validSymbols, RonExternalToken.float) &&
      _isDigit(lexer.lookahead)) {
    lexer.setResultSymbol(symbols[RonExternalToken.float.index]);
    _advance(lexer);
    while (_isNumberCharacter(lexer.lookahead)) _advance(lexer);

    var hasFraction = false;
    var hasExponent = false;
    if (lexer.lookahead == 0x2e) {
      hasFraction = true;
      _advance(lexer);
      if (_isAlpha(lexer.lookahead)) return false;
      if (lexer.lookahead == 0x2e) return false;
      while (_isNumberCharacter(lexer.lookahead)) _advance(lexer);
    }

    lexer.markEnd();
    if (lexer.lookahead == 0x65 || lexer.lookahead == 0x45) {
      hasExponent = true;
      _advance(lexer);
      if (lexer.lookahead == 0x2b || lexer.lookahead == 0x2d) {
        _advance(lexer);
      }
      if (!_isNumberCharacter(lexer.lookahead)) return true;
      _advance(lexer);
      while (_isNumberCharacter(lexer.lookahead)) _advance(lexer);
      lexer.markEnd();
    }

    if (!hasExponent && !hasFraction) return false;
    if (lexer.lookahead != 0x75 &&
        lexer.lookahead != 0x69 &&
        lexer.lookahead != 0x66) {
      return true;
    }
    _advance(lexer);
    if (!_isDigit(lexer.lookahead)) return true;
    while (_isDigit(lexer.lookahead)) _advance(lexer);
    lexer.markEnd();
    return true;
  }

  // The pinned scanner deliberately probes comments without consulting the
  // BLOCK_COMMENT validity bit.
  if (lexer.lookahead == 0x2f) {
    _advance(lexer);
    if (lexer.lookahead != 0x2a) return false;
    _advance(lexer);

    var afterStar = false;
    var nestingDepth = 1;
    while (true) {
      switch (lexer.lookahead) {
        case 0:
          return false;
        case 0x2a:
          _advance(lexer);
          afterStar = true;
        case 0x2f:
          if (afterStar) {
            _advance(lexer);
            afterStar = false;
            nestingDepth--;
            if (nestingDepth == 0) {
              lexer.setResultSymbol(
                symbols[RonExternalToken.blockComment.index],
              );
              return true;
            }
          } else {
            _advance(lexer);
            afterStar = false;
            if (lexer.lookahead == 0x2a) {
              nestingDepth++;
              _advance(lexer);
            }
          }
        default:
          _advance(lexer);
          afterStar = false;
      }
    }
  }
  return false;
}