@@ -57,16 +57,16 @@ impl Default for LineOffsets {
5757#[ derive( Clone , Debug , PartialEq , Eq , salsa:: Update ) ]
5858pub 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 ) ]
6666pub 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 ) ]
9090pub 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
208185impl 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 }
0 commit comments