Skip to content

Commit 333e939

Browse files
use Node substructs for enum fields (#204)
1 parent 6389f7e commit 333e939

File tree

3 files changed

+38
-47
lines changed

3 files changed

+38
-47
lines changed

crates/djls-templates/src/ast.rs

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,6 @@ use thiserror::Error;
33

44
use crate::tokens::Token;
55

6-
#[salsa::interned(debug)]
7-
pub struct TagName<'db> {
8-
pub text: String,
9-
}
10-
11-
#[salsa::interned(debug)]
12-
pub struct VariableName<'db> {
13-
pub text: String,
14-
}
15-
16-
#[salsa::interned(debug)]
17-
pub struct FilterName<'db> {
18-
pub text: String,
19-
}
20-
216
#[salsa::tracked(debug)]
227
pub struct Ast<'db> {
238
#[tracked]
@@ -71,52 +56,53 @@ impl Default for LineOffsets {
7156

7257
#[derive(Clone, Debug, PartialEq, Eq, salsa::Update)]
7358
pub enum Node<'db> {
74-
Tag {
75-
name: TagName<'db>,
76-
bits: Vec<String>, // Keep as strings for now, could intern later
77-
span: Span<'db>,
78-
},
79-
Comment {
80-
content: String, // Keep as string - not repeated
81-
span: Span<'db>,
82-
},
83-
Text {
84-
content: String, // Keep as string - not repeated
85-
span: Span<'db>,
86-
},
87-
Variable {
88-
var: VariableName<'db>,
89-
filters: Vec<FilterName<'db>>,
90-
span: Span<'db>,
91-
},
59+
Tag(TagNode<'db>),
60+
Comment(CommentNode<'db>),
61+
Text(TextNode<'db>),
62+
Variable(VariableNode<'db>),
9263
}
9364

94-
#[derive(Debug, Clone)]
65+
#[derive(Debug, Clone, PartialEq, Eq, salsa::Update)]
9566
pub struct TagNode<'db> {
9667
pub name: TagName<'db>,
9768
pub bits: Vec<String>,
9869
pub span: Span<'db>,
9970
}
10071

101-
#[derive(Debug, Clone)]
72+
#[salsa::interned(debug)]
73+
pub struct TagName<'db> {
74+
pub text: String,
75+
}
76+
77+
#[derive(Debug, Clone, PartialEq, Eq, salsa::Update)]
10278
pub struct CommentNode<'db> {
10379
pub content: String,
10480
pub span: Span<'db>,
10581
}
10682

107-
#[derive(Debug, Clone)]
83+
#[derive(Debug, Clone, PartialEq, Eq, salsa::Update)]
10884
pub struct TextNode<'db> {
10985
pub content: String,
11086
pub span: Span<'db>,
11187
}
11288

113-
#[derive(Debug, Clone)]
89+
#[derive(Debug, Clone, PartialEq, Eq, salsa::Update)]
11490
pub struct VariableNode<'db> {
11591
pub var: VariableName<'db>,
11692
pub filters: Vec<FilterName<'db>>,
11793
pub span: Span<'db>,
11894
}
11995

96+
#[salsa::interned(debug)]
97+
pub struct VariableName<'db> {
98+
pub text: String,
99+
}
100+
101+
#[salsa::interned(debug)]
102+
pub struct FilterName<'db> {
103+
pub text: String,
104+
}
105+
120106
#[salsa::tracked(debug)]
121107
pub struct Span<'db> {
122108
#[tracked]

crates/djls-templates/src/parser.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@ use thiserror::Error;
22

33
use crate::ast::Ast;
44
use crate::ast::AstError;
5+
use crate::ast::CommentNode;
56
use crate::ast::FilterName;
67
use crate::ast::Node;
78
use crate::ast::Span;
89
use crate::ast::TagName;
10+
use crate::ast::TagNode;
11+
use crate::ast::TextNode;
912
use crate::ast::VariableName;
13+
use crate::ast::VariableNode;
1014
use crate::db::Db as TemplateDb;
1115
use crate::lexer::LexerError;
1216
use crate::tokens::Token;
@@ -95,10 +99,10 @@ impl<'db> Parser<'db> {
9599

96100
let token = self.peek_previous()?;
97101

98-
Ok(Node::Comment {
102+
Ok(Node::Comment(CommentNode {
99103
content: token.content(),
100104
span: Span::from_token(self.db, &token),
101-
})
105+
}))
102106
}
103107

104108
pub fn parse_django_block(&mut self) -> Result<Node<'db>, ParserError> {
@@ -114,7 +118,7 @@ impl<'db> Parser<'db> {
114118
let bits = args.into_iter().skip(1).collect();
115119
let span = Span::from_token(self.db, &token);
116120

117-
Ok(Node::Tag { name, bits, span })
121+
Ok(Node::Tag(TagNode { name, bits, span }))
118122
}
119123

120124
fn parse_django_variable(&mut self) -> Result<Node<'db>, ParserError> {
@@ -135,7 +139,7 @@ impl<'db> Parser<'db> {
135139
.collect();
136140
let span = Span::from_token(self.db, &token);
137141

138-
Ok(Node::Variable { var, filters, span })
142+
Ok(Node::Variable(VariableNode { var, filters, span }))
139143
}
140144

141145
fn parse_text(&mut self) -> Result<Node<'db>, ParserError> {
@@ -173,7 +177,7 @@ impl<'db> Parser<'db> {
173177
let length = u32::try_from(content.len()).expect("Content length should fit in u32");
174178
let span = Span::new(self.db, start + offset, length);
175179

176-
Ok(Node::Text { content, span })
180+
Ok(Node::Text(TextNode { content, span }))
177181
}
178182

179183
fn peek(&self) -> Result<Token, ParserError> {
@@ -397,20 +401,20 @@ mod tests {
397401
impl TestNode {
398402
fn from_node(node: &Node<'_>, db: &dyn crate::db::Db) -> Self {
399403
match node {
400-
Node::Tag { name, bits, span } => TestNode::Tag {
404+
Node::Tag(TagNode { name, bits, span }) => TestNode::Tag {
401405
name: name.text(db).to_string(),
402406
bits: bits.clone(),
403407
span: (span.start(db), span.length(db)),
404408
},
405-
Node::Comment { content, span } => TestNode::Comment {
409+
Node::Comment(CommentNode { content, span }) => TestNode::Comment {
406410
content: content.clone(),
407411
span: (span.start(db), span.length(db)),
408412
},
409-
Node::Text { content, span } => TestNode::Text {
413+
Node::Text(TextNode { content, span }) => TestNode::Text {
410414
content: content.clone(),
411415
span: (span.start(db), span.length(db)),
412416
},
413-
Node::Variable { var, filters, span } => TestNode::Variable {
417+
Node::Variable(VariableNode { var, filters, span }) => TestNode::Variable {
414418
var: var.text(db).to_string(),
415419
filters: filters.iter().map(|f| f.text(db).to_string()).collect(),
416420
span: (span.start(db), span.length(db)),

crates/djls-templates/src/validation.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ impl<'db> TagValidator<'db> {
5050
#[must_use]
5151
pub fn validate(mut self) -> Vec<AstError> {
5252
while !self.is_at_end() {
53-
if let Some(Node::Tag { name, bits, span }) = self.current_node() {
53+
if let Some(Node::Tag(tag_node)) = self.current_node() {
54+
let TagNode { name, bits, span } = tag_node;
5455
let name_str = name.text(self.db);
5556

5657
let tag_specs = self.db.tag_specs();

0 commit comments

Comments
 (0)