Skip to content

Commit 9f33771

Browse files
inline enum fields instead of a separate struct
1 parent 375992e commit 9f33771

File tree

4 files changed

+39
-42
lines changed

4 files changed

+39
-42
lines changed

crates/djls-templates/src/lib.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ use djls_source::File;
5858
use djls_source::FileKind;
5959
pub use error::TemplateError;
6060
pub use lexer::Lexer;
61-
pub use nodelist::ErrorNode;
6261
use nodelist::Node;
6362
pub use nodelist::NodeList;
6463
pub use parser::ParseError;
@@ -109,11 +108,9 @@ pub fn parse_template(db: &dyn Db, file: File) -> Option<NodeList<'_>> {
109108
let text = source.as_ref();
110109
let span = djls_source::Span::from_bounds(0, text.len());
111110
let error_node = Node::Error {
112-
node: ErrorNode {
113-
span,
114-
full_span: span,
115-
error: err,
116-
},
111+
span,
112+
full_span: span,
113+
error: err,
117114
};
118115

119116
NodeList::new(db, vec![error_node])

crates/djls-templates/src/nodelist.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ pub enum Node<'db> {
3131
span: Span,
3232
},
3333
Error {
34-
node: ErrorNode,
34+
span: Span,
35+
full_span: Span,
36+
error: ParseError,
3537
},
3638
}
3739

@@ -42,8 +44,8 @@ impl<'db> Node<'db> {
4244
Node::Tag { span, .. }
4345
| Node::Variable { span, .. }
4446
| Node::Comment { span, .. }
45-
| Node::Text { span, .. } => *span,
46-
Node::Error { node, .. } => node.span,
47+
| Node::Text { span, .. }
48+
| Node::Error { span, .. } => *span,
4749
}
4850
}
4951

@@ -54,7 +56,7 @@ impl<'db> Node<'db> {
5456
span.expand(TagDelimiter::LENGTH_U32, TagDelimiter::LENGTH_U32)
5557
}
5658
Node::Text { span, .. } => *span,
57-
Node::Error { node } => node.full_span,
59+
Node::Error { full_span, .. } => *full_span,
5860
}
5961
}
6062

@@ -81,13 +83,6 @@ impl<'db> Node<'db> {
8183
}
8284
}
8385

84-
#[derive(Clone, Debug, PartialEq, Eq, salsa::Update)]
85-
pub struct ErrorNode {
86-
pub span: Span,
87-
pub full_span: Span,
88-
pub error: ParseError,
89-
}
90-
9186
#[salsa::interned(debug)]
9287
pub struct TagName<'db> {
9388
pub text: String,

crates/djls-templates/src/parser.rs

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use thiserror::Error;
66
use crate::db::Db as TemplateDb;
77
use crate::db::TemplateErrorAccumulator;
88
use crate::error::TemplateError;
9-
use crate::nodelist::ErrorNode;
109
use crate::nodelist::FilterName;
1110
use crate::nodelist::Node;
1211
use crate::nodelist::NodeList;
@@ -50,22 +49,16 @@ impl<'db> Parser<'db> {
5049
let empty = Span::new(0, 0);
5150
(empty, empty)
5251
},
53-
|token| {
54-
let content_span = token.to_span(self.db);
55-
let full_span = token.full_span().unwrap_or(content_span);
56-
(content_span, full_span)
57-
},
52+
|error_tok| error_tok.spans(self.db),
5853
);
5954

6055
TemplateErrorAccumulator(TemplateError::Parser(error.to_string()))
6156
.accumulate(self.db);
6257

6358
nodelist.push(Node::Error {
64-
node: ErrorNode {
65-
span,
66-
full_span,
67-
error,
68-
},
59+
span,
60+
full_span,
61+
error,
6962
});
7063

7164
if !self.is_at_end() {
@@ -114,15 +107,15 @@ impl<'db> Parser<'db> {
114107
let name = TagName::new(self.db, name_str.to_string());
115108

116109
let bits = parts.map(|s| TagBit::new(self.db, s.to_string())).collect();
117-
let span = token.to_span(self.db);
110+
let span = token.content_span_or_fallback(self.db);
118111

119112
Ok(Node::Tag { name, bits, span })
120113
}
121114

122115
fn parse_comment(&mut self) -> Result<Node<'db>, ParseError> {
123116
let token = self.peek_previous()?;
124117

125-
let span = token.to_span(self.db);
118+
let span = token.content_span_or_fallback(self.db);
126119
Ok(Node::Comment {
127120
content: token.content(self.db),
128121
span,
@@ -151,7 +144,7 @@ impl<'db> Parser<'db> {
151144
let first_token = self.peek_previous()?;
152145
let first_span = first_token
153146
.full_span()
154-
.unwrap_or_else(|| first_token.to_span(self.db));
147+
.unwrap_or_else(|| first_token.content_span_or_fallback(self.db));
155148
let start = first_span.start;
156149
let mut end = first_span.start + first_span.length;
157150

@@ -164,7 +157,9 @@ impl<'db> Parser<'db> {
164157
| Token::Eof { .. } => break, // Stop at Django constructs
165158
Token::Text { .. } | Token::Whitespace { .. } | Token::Newline { .. } => {
166159
// Update end position
167-
let token_span = token.full_span().unwrap_or_else(|| token.to_span(self.db));
160+
let token_span = token
161+
.full_span()
162+
.unwrap_or_else(|| token.content_span_or_fallback(self.db));
168163
let token_end = token_span.start + token_span.length;
169164
end = end.max(token_end);
170165
self.consume()?;
@@ -202,7 +197,7 @@ impl<'db> Parser<'db> {
202197
FilterName::new(self.db, trimmed.to_string())
203198
})
204199
.collect();
205-
let span = token.to_span(self.db);
200+
let span = token.content_span_or_fallback(self.db);
206201

207202
Ok(Node::Variable { var, filters, span })
208203
}
@@ -429,10 +424,14 @@ mod tests {
429424
span: span.as_tuple(),
430425
full_span: node.full_span().as_tuple(),
431426
},
432-
Node::Error { node } => TestNode::Error {
433-
span: node.span.as_tuple(),
434-
full_span: node.full_span.as_tuple(),
435-
error: node.error.clone(),
427+
Node::Error {
428+
span,
429+
full_span,
430+
error,
431+
} => TestNode::Error {
432+
span: span.as_tuple(),
433+
full_span: full_span.as_tuple(),
434+
error: error.clone(),
436435
},
437436
}
438437
}

crates/djls-templates/src/tokens.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,6 @@ pub struct TokenContent<'db> {
7777
}
7878

7979
impl<'db> Token<'db> {
80-
pub fn to_span(&self, db: &dyn TemplateDb) -> Span {
81-
self.content_span()
82-
.unwrap_or_else(|| Span::new(self.offset().unwrap_or(0), self.length(db)))
83-
}
84-
8580
/// Get the content text for content-bearing tokens
8681
pub fn content(&self, db: &'db dyn TemplateDb) -> String {
8782
match self {
@@ -177,6 +172,17 @@ impl<'db> Token<'db> {
177172
Token::Eof => None,
178173
}
179174
}
175+
176+
pub fn content_span_or_fallback(&self, db: &dyn TemplateDb) -> Span {
177+
self.content_span()
178+
.unwrap_or_else(|| Span::new(self.offset().unwrap_or(0), self.length(db)))
179+
}
180+
181+
pub fn spans(&self, db: &'db dyn TemplateDb) -> (Span, Span) {
182+
let content = self.content_span_or_fallback(db);
183+
let full = self.full_span().unwrap_or(content);
184+
(content, full)
185+
}
180186
}
181187

182188
#[cfg(test)]

0 commit comments

Comments
 (0)