Add eat_char2 for the lexer (#6968)

## Summary

This PR adds a new helper method on the `Cursor` called `eat_char2`
which is similar to `eat_char` but accepts 2 characters instead of 1. It'll
`bump` the cursor twice if both characters are found on lookahead.

## Test Plan

`cargo test`
This commit is contained in:
Dhruv Manilawala 2023-08-29 17:18:02 +05:30 committed by GitHub
parent 715d86dae9
commit 4d49d5e845
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 13 deletions

View file

@ -515,13 +515,7 @@ impl<'source> Lexer<'source> {
// If the next two characters are also the quote character, then we have a triple-quoted
// string; consume those two characters and ensure that we require a triple-quote to close
let triple_quoted = if self.cursor.first() == quote && self.cursor.second() == quote {
self.cursor.bump();
self.cursor.bump();
true
} else {
false
};
let triple_quoted = self.cursor.eat_char2(quote, quote);
let value_start = self.offset();
@ -544,9 +538,7 @@ impl<'source> Lexer<'source> {
}
Some(c) if c == quote => {
if triple_quoted {
if self.cursor.first() == quote && self.cursor.second() == quote {
self.cursor.bump();
self.cursor.bump();
if self.cursor.eat_char2(quote, quote) {
break self.offset() - TextSize::new(3);
}
} else {
@ -918,9 +910,7 @@ impl<'source> Lexer<'source> {
'.' => {
if self.cursor.first().is_ascii_digit() {
self.lex_decimal_number('.')?
} else if self.cursor.first() == '.' && self.cursor.second() == '.' {
self.cursor.bump();
self.cursor.bump();
} else if self.cursor.eat_char2('.', '.') {
Tok::Ellipsis
} else {
Tok::Dot

View file

@ -85,6 +85,17 @@ impl<'a> Cursor<'a> {
}
}
pub(super) fn eat_char2(&mut self, c1: char, c2: char) -> bool {
let mut chars = self.chars.clone();
if chars.next() == Some(c1) && chars.next() == Some(c2) {
self.bump();
self.bump();
true
} else {
false
}
}
pub(super) fn eat_if<F>(&mut self, mut predicate: F) -> Option<char>
where
F: FnMut(char) -> bool,