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