scan method
bool
scan(
- AstroExternalScannerState state,
- TreeSitterExternalLexer lexer,
- 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;
}