Skip to content

Commit 03f18d2

Browse files
simplify Span struct and remove salsa tracking (#205)
1 parent 333e939 commit 03f18d2

File tree

4 files changed

+66
-132
lines changed

4 files changed

+66
-132
lines changed

crates/djls-templates/src/ast.rs

Lines changed: 40 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,16 @@ impl Default for LineOffsets {
5757
#[derive(Clone, Debug, PartialEq, Eq, salsa::Update)]
5858
pub enum Node<'db> {
5959
Tag(TagNode<'db>),
60-
Comment(CommentNode<'db>),
61-
Text(TextNode<'db>),
60+
Comment(CommentNode),
61+
Text(TextNode),
6262
Variable(VariableNode<'db>),
6363
}
6464

6565
#[derive(Debug, Clone, PartialEq, Eq, salsa::Update)]
6666
pub struct TagNode<'db> {
6767
pub name: TagName<'db>,
6868
pub bits: Vec<String>,
69-
pub span: Span<'db>,
69+
pub span: Span,
7070
}
7171

7272
#[salsa::interned(debug)]
@@ -75,22 +75,22 @@ pub struct TagName<'db> {
7575
}
7676

7777
#[derive(Debug, Clone, PartialEq, Eq, salsa::Update)]
78-
pub struct CommentNode<'db> {
78+
pub struct CommentNode {
7979
pub content: String,
80-
pub span: Span<'db>,
80+
pub span: Span,
8181
}
8282

8383
#[derive(Debug, Clone, PartialEq, Eq, salsa::Update)]
84-
pub struct TextNode<'db> {
84+
pub struct TextNode {
8585
pub content: String,
86-
pub span: Span<'db>,
86+
pub span: Span,
8787
}
8888

8989
#[derive(Debug, Clone, PartialEq, Eq, salsa::Update)]
9090
pub struct VariableNode<'db> {
9191
pub var: VariableName<'db>,
9292
pub filters: Vec<FilterName<'db>>,
93-
pub span: Span<'db>,
93+
pub span: Span,
9494
}
9595

9696
#[salsa::interned(debug)]
@@ -103,29 +103,29 @@ pub struct FilterName<'db> {
103103
pub text: String,
104104
}
105105

106-
#[salsa::tracked(debug)]
107-
pub struct Span<'db> {
108-
#[tracked]
106+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)]
107+
pub struct Span {
109108
pub start: u32,
110-
#[tracked]
111109
pub length: u32,
112110
}
113111

114-
impl<'db> Span<'db> {
115-
pub fn from_token(db: &'db dyn crate::db::Db, token: &Token) -> Self {
112+
impl Span {
113+
#[must_use]
114+
pub fn new(start: u32, length: u32) -> Self {
115+
Self { start, length }
116+
}
117+
118+
#[must_use]
119+
pub fn from_token(token: &Token) -> Self {
116120
let start = token.start().unwrap_or(0);
117121
let length = u32::try_from(token.lexeme().len()).unwrap_or(0);
118-
Span::new(db, start, length)
122+
Self { start, length }
119123
}
120124

121125
#[must_use]
122-
pub fn to_lsp_range(
123-
&self,
124-
db: &'db dyn crate::db::Db,
125-
line_offsets: &LineOffsets,
126-
) -> tower_lsp_server::lsp_types::Range {
127-
let start_pos = self.start(db) as usize;
128-
let end_pos = (self.start(db) + self.length(db)) as usize;
126+
pub fn to_lsp_range(&self, line_offsets: &LineOffsets) -> tower_lsp_server::lsp_types::Range {
127+
let start_pos = self.start as usize;
128+
let end_pos = (self.start + self.length) as usize;
129129

130130
let (start_line, start_char) = line_offsets.position_to_line_col(start_pos);
131131
let (end_line, end_char) = line_offsets.position_to_line_col(end_pos);
@@ -151,105 +151,52 @@ pub enum AstError {
151151
InvalidTagStructure {
152152
tag: String,
153153
reason: String,
154-
span_start: u32,
155-
span_length: u32,
154+
span: Span,
156155
},
157156
#[error("Unbalanced structure: '{opening_tag}' missing closing '{expected_closing}'")]
158157
UnbalancedStructure {
159158
opening_tag: String,
160159
expected_closing: String,
161-
opening_span_start: u32,
162-
opening_span_length: u32,
163-
closing_span_start: Option<u32>,
164-
closing_span_length: Option<u32>,
160+
opening_span: Span,
161+
closing_span: Option<Span>,
165162
},
166163
#[error("Invalid {node_type} node: {reason}")]
167164
InvalidNode {
168165
node_type: String,
169166
reason: String,
170-
span_start: u32,
171-
span_length: u32,
167+
span: Span,
172168
},
173169
#[error("Unclosed tag: {tag}")]
174-
UnclosedTag {
175-
tag: String,
176-
span_start: u32,
177-
span_length: u32,
178-
},
170+
UnclosedTag { tag: String, span: Span },
179171
#[error("Orphaned tag '{tag}' - {context}")]
180172
OrphanedTag {
181173
tag: String,
182174
context: String,
183-
span_start: u32,
184-
span_length: u32,
175+
span: Span,
185176
},
186177
#[error("endblock '{name}' does not match any open block")]
187-
UnmatchedBlockName {
188-
name: String,
189-
span_start: u32,
190-
span_length: u32,
191-
},
178+
UnmatchedBlockName { name: String, span: Span },
192179
#[error("Tag '{tag}' requires at least {min} argument{}", if *.min == 1 { "" } else { "s" })]
193-
MissingRequiredArguments {
194-
tag: String,
195-
min: usize,
196-
span_start: u32,
197-
span_length: u32,
198-
},
180+
MissingRequiredArguments { tag: String, min: usize, span: Span },
199181
#[error("Tag '{tag}' accepts at most {max} argument{}", if *.max == 1 { "" } else { "s" })]
200-
TooManyArguments {
201-
tag: String,
202-
max: usize,
203-
span_start: u32,
204-
span_length: u32,
205-
},
182+
TooManyArguments { tag: String, max: usize, span: Span },
206183
}
207184

208185
impl AstError {
209186
/// Get the span start and length of this error, if available
210187
#[must_use]
211188
pub fn span(&self) -> Option<(u32, u32)> {
212189
match self {
213-
AstError::UnbalancedStructure {
214-
opening_span_start,
215-
opening_span_length,
216-
..
217-
} => Some((*opening_span_start, *opening_span_length)),
218-
AstError::InvalidTagStructure {
219-
span_start,
220-
span_length,
221-
..
222-
}
223-
| AstError::InvalidNode {
224-
span_start,
225-
span_length,
226-
..
227-
}
228-
| AstError::UnclosedTag {
229-
span_start,
230-
span_length,
231-
..
232-
}
233-
| AstError::OrphanedTag {
234-
span_start,
235-
span_length,
236-
..
237-
}
238-
| AstError::UnmatchedBlockName {
239-
span_start,
240-
span_length,
241-
..
242-
}
243-
| AstError::MissingRequiredArguments {
244-
span_start,
245-
span_length,
246-
..
190+
AstError::UnbalancedStructure { opening_span, .. } => {
191+
Some((opening_span.start, opening_span.length))
247192
}
248-
| AstError::TooManyArguments {
249-
span_start,
250-
span_length,
251-
..
252-
} => Some((*span_start, *span_length)),
193+
AstError::InvalidTagStructure { span, .. }
194+
| AstError::InvalidNode { span, .. }
195+
| AstError::UnclosedTag { span, .. }
196+
| AstError::OrphanedTag { span, .. }
197+
| AstError::UnmatchedBlockName { span, .. }
198+
| AstError::MissingRequiredArguments { span, .. }
199+
| AstError::TooManyArguments { span, .. } => Some((span.start, span.length)),
253200
AstError::EmptyAst => None,
254201
}
255202
}

crates/djls-templates/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ fn accumulate_error(db: &dyn Db, error: &TemplateError, line_offsets: &LineOffse
163163
let range = error
164164
.span()
165165
.map(|(start, length)| {
166-
let span = crate::ast::Span::new(db, start, length);
167-
span.to_lsp_range(db, line_offsets)
166+
let span = crate::ast::Span::new(start, length);
167+
span.to_lsp_range(line_offsets)
168168
})
169169
.unwrap_or_default();
170170

crates/djls-templates/src/parser.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ impl<'db> Parser<'db> {
101101

102102
Ok(Node::Comment(CommentNode {
103103
content: token.content(),
104-
span: Span::from_token(self.db, &token),
104+
span: Span::from_token(&token),
105105
}))
106106
}
107107

@@ -116,7 +116,7 @@ impl<'db> Parser<'db> {
116116
let name_str = args.first().ok_or(ParserError::EmptyTag)?.clone();
117117
let name = TagName::new(self.db, name_str); // Intern the tag name
118118
let bits = args.into_iter().skip(1).collect();
119-
let span = Span::from_token(self.db, &token);
119+
let span = Span::from_token(&token);
120120

121121
Ok(Node::Tag(TagNode { name, bits, span }))
122122
}
@@ -137,7 +137,7 @@ impl<'db> Parser<'db> {
137137
.skip(1)
138138
.map(|s| FilterName::new(self.db, s.trim().to_string())) // Intern filter names
139139
.collect();
140-
let span = Span::from_token(self.db, &token);
140+
let span = Span::from_token(&token);
141141

142142
Ok(Node::Variable(VariableNode { var, filters, span }))
143143
}
@@ -175,7 +175,7 @@ impl<'db> Parser<'db> {
175175
let offset = u32::try_from(text.find(content.as_str()).unwrap_or(0))
176176
.expect("Offset should fit in u32");
177177
let length = u32::try_from(content.len()).expect("Content length should fit in u32");
178-
let span = Span::new(self.db, start + offset, length);
178+
let span = Span::new(start + offset, length);
179179

180180
Ok(Node::Text(TextNode { content, span }))
181181
}
@@ -404,20 +404,20 @@ mod tests {
404404
Node::Tag(TagNode { name, bits, span }) => TestNode::Tag {
405405
name: name.text(db).to_string(),
406406
bits: bits.clone(),
407-
span: (span.start(db), span.length(db)),
407+
span: (span.start, span.length),
408408
},
409409
Node::Comment(CommentNode { content, span }) => TestNode::Comment {
410410
content: content.clone(),
411-
span: (span.start(db), span.length(db)),
411+
span: (span.start, span.length),
412412
},
413413
Node::Text(TextNode { content, span }) => TestNode::Text {
414414
content: content.clone(),
415-
span: (span.start(db), span.length(db)),
415+
span: (span.start, span.length),
416416
},
417417
Node::Variable(VariableNode { var, filters, span }) => TestNode::Variable {
418418
var: var.text(db).to_string(),
419419
filters: filters.iter().map(|f| f.text(db).to_string()).collect(),
420-
span: (span.start(db), span.length(db)),
420+
span: (span.start, span.length),
421421
},
422422
}
423423
}

0 commit comments

Comments
 (0)