Skip to content

Commit 193f492

Browse files
refactor parser a bit
1 parent 980983e commit 193f492

File tree

29 files changed

+61
-68
lines changed

29 files changed

+61
-68
lines changed

crates/djls-templates/src/ast.rs

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,42 @@
1-
use crate::tokens::Token;
1+
use crate::tokens::{Token, TokenStream, TokenType};
22
use serde::Serialize;
33
use thiserror::Error;
44

5-
#[derive(Clone, Default, Debug, Serialize)]
6-
pub struct NodeList {
7-
nodes: Vec<Node>,
5+
#[derive(Clone, Debug, Default, Serialize)]
6+
pub struct Ast {
7+
nodelist: Vec<Node>,
88
line_offsets: LineOffsets,
99
}
1010

11-
impl NodeList {
12-
pub fn nodes(&self) -> &Vec<Node> {
13-
&self.nodes
11+
impl Ast {
12+
pub fn nodelist(&self) -> &Vec<Node> {
13+
&self.nodelist
1414
}
1515

1616
pub fn line_offsets(&self) -> &LineOffsets {
1717
&self.line_offsets
1818
}
1919

2020
pub fn add_node(&mut self, node: Node) {
21-
self.nodes.push(node);
21+
self.nodelist.push(node);
2222
}
2323

24-
pub fn set_line_offsets(&mut self, line_offsets: LineOffsets) {
25-
self.line_offsets = line_offsets
26-
}
27-
28-
pub fn finalize(&mut self) -> NodeList {
29-
self.clone()
24+
pub fn set_line_offsets(&mut self, tokens: &TokenStream) {
25+
for token in tokens.tokens() {
26+
if let TokenType::Newline = token.token_type() {
27+
if let Some(start) = token.start() {
28+
// Add offset for next line
29+
self.line_offsets.add_line(start + 1);
30+
}
31+
}
32+
}
3033
}
3134
}
3235

33-
#[derive(Clone, Default, Debug, Serialize)]
36+
#[derive(Clone, Debug, Serialize)]
3437
pub struct LineOffsets(pub Vec<u32>);
3538

3639
impl LineOffsets {
37-
pub fn new() -> Self {
38-
Self(vec![0])
39-
}
40-
4140
pub fn add_line(&mut self, offset: u32) {
4241
self.0.push(offset);
4342
}
@@ -67,6 +66,12 @@ impl LineOffsets {
6766
}
6867
}
6968

69+
impl Default for LineOffsets {
70+
fn default() -> Self {
71+
Self(vec![0])
72+
}
73+
}
74+
7075
#[derive(Clone, Debug, Serialize)]
7176
pub enum Node {
7277
Tag {
@@ -155,13 +160,13 @@ mod tests {
155160

156161
#[test]
157162
fn test_new_starts_at_zero() {
158-
let offsets = LineOffsets::new();
163+
let offsets = LineOffsets::default();
159164
assert_eq!(offsets.position_to_line_col(0), (1, 0)); // Line 1, column 0
160165
}
161166

162167
#[test]
163168
fn test_start_of_lines() {
164-
let mut offsets = LineOffsets::new();
169+
let mut offsets = LineOffsets::default();
165170
offsets.add_line(10); // Line 2 starts at offset 10
166171
offsets.add_line(25); // Line 3 starts at offset 25
167172

@@ -183,7 +188,7 @@ mod tests {
183188
assert!(errors.is_empty());
184189

185190
// Find the variable node
186-
let nodes = nodelist.nodes();
191+
let nodes = nodelist.nodelist();
187192
let var_node = nodes
188193
.iter()
189194
.find(|n| matches!(n, Node::Variable { .. }))

crates/djls-templates/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mod parser;
55
mod tagspecs;
66
mod tokens;
77

8-
use ast::NodeList;
8+
use ast::Ast;
99
pub use error::{to_lsp_diagnostic, QuickFix, TemplateError};
1010

1111
use lexer::Lexer;
@@ -18,7 +18,7 @@ pub use parser::{Parser, ParserError};
1818
///
1919
/// Returns a `Result` containing a tuple of `(Ast, Vec<ParserError>)` on success,
2020
/// or a `ParserError` on failure.
21-
pub fn parse_template(source: &str) -> Result<(NodeList, Vec<TemplateError>), TemplateError> {
21+
pub fn parse_template(source: &str) -> Result<(Ast, Vec<TemplateError>), TemplateError> {
2222
let tokens = Lexer::new(source)
2323
.tokenize()
2424
.map_err(|e| TemplateError::Lexer(e.to_string()))?;

crates/djls-templates/src/parser.rs

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::ast::{AstError, LineOffsets, Node, NodeList, Span};
1+
use crate::ast::{Ast, AstError, Node, Span};
22
use crate::lexer::LexerError;
33
use crate::tokens::{Token, TokenStream, TokenType};
44
use thiserror::Error;
@@ -18,25 +18,14 @@ impl Parser {
1818
}
1919
}
2020

21-
pub fn parse(&mut self) -> Result<(NodeList, Vec<ParserError>), ParserError> {
22-
let mut nodelist = NodeList::default();
23-
let mut line_offsets = LineOffsets::new();
24-
25-
for token in self.tokens.tokens() {
26-
if let TokenType::Newline = token.token_type() {
27-
if let Some(start) = token.start() {
28-
// Add offset for next line
29-
line_offsets.add_line(start + 1);
30-
}
31-
}
32-
}
33-
34-
self.current = 0;
21+
pub fn parse(&mut self) -> Result<(Ast, Vec<ParserError>), ParserError> {
22+
let mut ast = Ast::default();
23+
ast.set_line_offsets(&self.tokens);
3524

3625
while !self.is_at_end() {
3726
match self.next_node() {
3827
Ok(node) => {
39-
nodelist.add_node(node);
28+
ast.add_node(node);
4029
}
4130
Err(err) => {
4231
if !self.is_at_end() {
@@ -47,8 +36,7 @@ impl Parser {
4736
}
4837
}
4938

50-
nodelist.set_line_offsets(line_offsets);
51-
Ok((nodelist.finalize(), std::mem::take(&mut self.errors)))
39+
Ok((ast.clone(), std::mem::take(&mut self.errors)))
5240
}
5341

5442
fn next_node(&mut self) -> Result<Node, ParserError> {

crates/djls-templates/src/snapshots/djls_templates__parser__tests__comments__parse_comments.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
source: crates/djls-templates/src/parser.rs
33
expression: nodelist
44
---
5-
nodes:
5+
nodelist:
66
- Text:
77
content: "<!-- HTML comment -->"
88
span:

crates/djls-templates/src/snapshots/djls_templates__parser__tests__django__parse_complex_if_elif.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
source: crates/djls-templates/src/parser.rs
33
expression: nodelist
44
---
5-
nodes:
5+
nodelist:
66
- Tag:
77
name: if
88
bits:

crates/djls-templates/src/snapshots/djls_templates__parser__tests__django__parse_django_for_block.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
source: crates/djls-templates/src/parser.rs
33
expression: nodelist
44
---
5-
nodes:
5+
nodelist:
66
- Tag:
77
name: for
88
bits:

crates/djls-templates/src/snapshots/djls_templates__parser__tests__django__parse_django_if_block.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
source: crates/djls-templates/src/parser.rs
33
expression: nodelist
44
---
5-
nodes:
5+
nodelist:
66
- Tag:
77
name: if
88
bits:

crates/djls-templates/src/snapshots/djls_templates__parser__tests__django__parse_django_tag_assignment.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
source: crates/djls-templates/src/parser.rs
33
expression: nodelist
44
---
5-
nodes:
5+
nodelist:
66
- Tag:
77
name: url
88
bits:

crates/djls-templates/src/snapshots/djls_templates__parser__tests__django__parse_django_variable.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
source: crates/djls-templates/src/parser.rs
33
expression: nodelist
44
---
5-
nodes:
5+
nodelist:
66
- Variable:
77
var: user.name
88
filters: []

crates/djls-templates/src/snapshots/djls_templates__parser__tests__django__parse_django_variable_with_filter.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
source: crates/djls-templates/src/parser.rs
33
expression: nodelist
44
---
5-
nodes:
5+
nodelist:
66
- Variable:
77
var: user.name
88
filters:

0 commit comments

Comments
 (0)