@@ -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,30 @@ 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+ pub fn new ( start : u32 , length : u32 ) -> Self {
114+ Self { start, length }
115+ }
116+
117+ pub fn from_token ( token : & Token ) -> Self {
116118 let start = token. start ( ) . unwrap_or ( 0 ) ;
117119 let length = u32:: try_from ( token. lexeme ( ) . len ( ) ) . unwrap_or ( 0 ) ;
118- Span :: new ( db , start, length)
120+ Self { start, length }
119121 }
120122
121123 #[ must_use]
122124 pub fn to_lsp_range (
123125 & self ,
124- db : & ' db dyn crate :: db:: Db ,
125126 line_offsets : & LineOffsets ,
126127 ) -> 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 ;
128+ let start_pos = self . start as usize ;
129+ let end_pos = ( self . start + self . length ) as usize ;
129130
130131 let ( start_line, start_char) = line_offsets. position_to_line_col ( start_pos) ;
131132 let ( end_line, end_char) = line_offsets. position_to_line_col ( end_pos) ;
@@ -151,57 +152,48 @@ pub enum AstError {
151152 InvalidTagStructure {
152153 tag : String ,
153154 reason : String ,
154- span_start : u32 ,
155- span_length : u32 ,
155+ span : Span ,
156156 } ,
157157 #[ error( "Unbalanced structure: '{opening_tag}' missing closing '{expected_closing}'" ) ]
158158 UnbalancedStructure {
159159 opening_tag : String ,
160160 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 > ,
161+ opening_span : Span ,
162+ closing_span : Option < Span > ,
165163 } ,
166164 #[ error( "Invalid {node_type} node: {reason}" ) ]
167165 InvalidNode {
168166 node_type : String ,
169167 reason : String ,
170- span_start : u32 ,
171- span_length : u32 ,
168+ span : Span ,
172169 } ,
173170 #[ error( "Unclosed tag: {tag}" ) ]
174171 UnclosedTag {
175172 tag : String ,
176- span_start : u32 ,
177- span_length : u32 ,
173+ span : Span ,
178174 } ,
179175 #[ error( "Orphaned tag '{tag}' - {context}" ) ]
180176 OrphanedTag {
181177 tag : String ,
182178 context : String ,
183- span_start : u32 ,
184- span_length : u32 ,
179+ span : Span ,
185180 } ,
186181 #[ error( "endblock '{name}' does not match any open block" ) ]
187182 UnmatchedBlockName {
188183 name : String ,
189- span_start : u32 ,
190- span_length : u32 ,
184+ span : Span ,
191185 } ,
192186 #[ error( "Tag '{tag}' requires at least {min} argument{}" , if * . min == 1 { "" } else { "s" } ) ]
193187 MissingRequiredArguments {
194188 tag : String ,
195189 min : usize ,
196- span_start : u32 ,
197- span_length : u32 ,
190+ span : Span ,
198191 } ,
199192 #[ error( "Tag '{tag}' accepts at most {max} argument{}" , if * . max == 1 { "" } else { "s" } ) ]
200193 TooManyArguments {
201194 tag : String ,
202195 max : usize ,
203- span_start : u32 ,
204- span_length : u32 ,
196+ span : Span ,
205197 } ,
206198}
207199
@@ -210,46 +202,16 @@ impl AstError {
210202 #[ must_use]
211203 pub fn span ( & self ) -> Option < ( u32 , u32 ) > {
212204 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- ..
205+ AstError :: UnbalancedStructure { opening_span, .. } => {
206+ Some ( ( opening_span. start , opening_span. length ) )
247207 }
248- | AstError :: TooManyArguments {
249- span_start,
250- span_length,
251- ..
252- } => Some ( ( * span_start, * span_length) ) ,
208+ AstError :: InvalidTagStructure { span, .. }
209+ | AstError :: InvalidNode { span, .. }
210+ | AstError :: UnclosedTag { span, .. }
211+ | AstError :: OrphanedTag { span, .. }
212+ | AstError :: UnmatchedBlockName { span, .. }
213+ | AstError :: MissingRequiredArguments { span, .. }
214+ | AstError :: TooManyArguments { span, .. } => Some ( ( span. start , span. length ) ) ,
253215 AstError :: EmptyAst => None ,
254216 }
255217 }
0 commit comments