Skip to content

Commit 6bcc692

Browse files
Cache tokens in parser to avoid repeated database queries (#220)
1 parent 36ae2f5 commit 6bcc692

File tree

1 file changed

+7
-9
lines changed

1 file changed

+7
-9
lines changed

crates/djls-templates/src/parser.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::tokens::TokenStream;
1414

1515
pub struct Parser<'db> {
1616
db: &'db dyn TemplateDb,
17-
tokens: TokenStream<'db>,
17+
tokens: Vec<Token<'db>>,
1818
current: usize,
1919
errors: Vec<ParserError>,
2020
}
@@ -24,7 +24,7 @@ impl<'db> Parser<'db> {
2424
pub fn new(db: &'db dyn TemplateDb, tokens: TokenStream<'db>) -> Self {
2525
Self {
2626
db,
27-
tokens,
27+
tokens: tokens.stream(db).clone(),
2828
current: 0,
2929
errors: Vec::new(),
3030
}
@@ -34,7 +34,7 @@ impl<'db> Parser<'db> {
3434
let mut nodelist = Vec::new();
3535
let mut line_offsets = crate::ast::LineOffsets::default();
3636

37-
let tokens = self.tokens.stream(self.db);
37+
let tokens = &self.tokens;
3838
for token in tokens {
3939
if matches!(token, Token::Newline { .. }) {
4040
let offset = token.offset();
@@ -206,15 +206,14 @@ impl<'db> Parser<'db> {
206206
}
207207

208208
fn item_at(&self, index: usize) -> Result<Token<'db>, ParserError> {
209-
let tokens = self.tokens.stream(self.db);
210-
if let Some(token) = tokens.get(index) {
209+
if let Some(token) = self.tokens.get(index) {
211210
Ok(token.clone())
212211
} else {
213-
let error = if tokens.is_empty() {
212+
let error = if self.tokens.is_empty() {
214213
ParserError::stream_error(StreamError::Empty)
215214
} else if index < self.current {
216215
ParserError::stream_error(StreamError::AtBeginning)
217-
} else if index >= tokens.len() {
216+
} else if index >= self.tokens.len() {
218217
ParserError::stream_error(StreamError::AtEnd)
219218
} else {
220219
ParserError::stream_error(StreamError::InvalidAccess)
@@ -224,8 +223,7 @@ impl<'db> Parser<'db> {
224223
}
225224

226225
fn is_at_end(&self) -> bool {
227-
let tokens = self.tokens.stream(self.db);
228-
self.current + 1 >= tokens.len()
226+
self.current + 1 >= self.tokens.len()
229227
}
230228

231229
fn consume(&mut self) -> Result<Token<'db>, ParserError> {

0 commit comments

Comments
 (0)