scan method

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

Implementation

@override
bool scan(
  AstroExternalScannerState state,
  TreeSitterExternalLexer lexer,
  List<bool> validSymbols,
) {
  while (_isWhitespace(lexer.lookahead)) {
    lexer.advance(skip: true);
  }

  if (_valid(validSymbols, AstroExternalToken.rawText) &&
      !_valid(validSymbols, AstroExternalToken.startTagName) &&
      !_valid(validSymbols, AstroExternalToken.endTagName)) {
    return _scanRawText(state, lexer);
  }

  switch (lexer.lookahead) {
    case 0x3c: // <
      lexer.markEnd();
      lexer.advance(skip: false);
      if (lexer.lookahead == 0x21) {
        lexer.advance(skip: false);
        return _scanComment(lexer);
      }
      if (_valid(validSymbols, AstroExternalToken.implicitEndTag)) {
        return _scanImplicitEndTag(state, lexer);
      }
    case 0:
      if (_valid(validSymbols, AstroExternalToken.implicitEndTag)) {
        return _scanImplicitEndTag(state, lexer);
      }
    case 0x2f: // /
      if (_valid(validSymbols, AstroExternalToken.selfClosingTagDelimiter)) {
        return _scanSelfClosingTagDelimiter(state, lexer);
      }
    case 0x7b: // {
      if (_valid(validSymbols, AstroExternalToken.interpolationStart)) {
        lexer.advance(skip: false);
        state._tags.add(const _AstroTag(_interpolation, ''));
        _emit(lexer, AstroExternalToken.interpolationStart);
        return true;
      }
    case 0x2d: // -
      if (_valid(validSymbols, AstroExternalToken.frontmatterStart)) {
        lexer.markEnd();
        lexer.advance(skip: false);
        if (lexer.lookahead == 0x2d) {
          lexer.advance(skip: false);
          if (lexer.lookahead == 0x2d) {
            lexer.advance(skip: false);
            lexer.markEnd();
            _emit(lexer, AstroExternalToken.frontmatterStart);
            return true;
          }
        }
      }
      // The pinned C++ switch deliberately falls through to `default`
      // after an unsuccessful frontmatter probe, at the probe's advanced
      // lexer position.
      if ((_valid(validSymbols, AstroExternalToken.startTagName) ||
              _valid(validSymbols, AstroExternalToken.endTagName)) &&
          !_valid(validSymbols, AstroExternalToken.rawText)) {
        return _valid(validSymbols, AstroExternalToken.startTagName)
            ? _scanStartTagName(state, lexer)
            : _scanEndTagName(state, lexer);
      }
    default:
      if ((_valid(validSymbols, AstroExternalToken.startTagName) ||
              _valid(validSymbols, AstroExternalToken.endTagName)) &&
          !_valid(validSymbols, AstroExternalToken.rawText)) {
        return _valid(validSymbols, AstroExternalToken.startTagName)
            ? _scanStartTagName(state, lexer)
            : _scanEndTagName(state, lexer);
      }
  }
  return false;
}