11use djls_source:: Span ;
2- use djls_templates:: nodelist:: TagBit ;
3- use djls_templates:: nodelist:: TagName ;
42use djls_templates:: tokens:: TagDelimiter ;
53use djls_templates:: Node ;
64
@@ -49,7 +47,7 @@ enum BlockSemanticOp {
4947pub struct BlockTreeBuilder < ' db > {
5048 db : & ' db dyn Db ,
5149 index : & ' db TagIndex ,
52- stack : Vec < TreeFrame < ' db > > ,
50+ stack : Vec < TreeFrame > ,
5351 block_allocs : Vec < ( Span , Option < BlockId > ) > ,
5452 semantic_ops : Vec < BlockSemanticOp > ,
5553}
@@ -136,9 +134,9 @@ impl<'db> BlockTreeBuilder<'db> {
136134 tree
137135 }
138136
139- fn handle_tag ( & mut self , name : TagName < ' db > , bits : Vec < TagBit < ' db > > , span : Span ) {
140- let tag_name = name. text ( self . db ) ;
141- match self . index . classify ( & tag_name) {
137+ fn handle_tag ( & mut self , name : & str , bits : & [ String ] , span : Span ) {
138+ let tag_name = name;
139+ match self . index . classify ( tag_name) {
142140 TagClass :: Opener => {
143141 let parent = get_active_segment ( & self . stack ) ;
144142
@@ -152,14 +150,14 @@ impl<'db> BlockTreeBuilder<'db> {
152150 // Nested block
153151 self . semantic_ops . push ( BlockSemanticOp :: AddBranchNode {
154152 target : parent_id,
155- tag : tag_name. clone ( ) ,
153+ tag : tag_name. to_string ( ) ,
156154 marker_span : span,
157155 body : container,
158156 kind : BranchKind :: Opener ,
159157 } ) ;
160158 self . semantic_ops . push ( BlockSemanticOp :: AddBranchNode {
161159 target : container,
162- tag : tag_name. clone ( ) ,
160+ tag : tag_name. to_string ( ) ,
163161 marker_span : span,
164162 body : segment,
165163 kind : BranchKind :: Segment ,
@@ -170,41 +168,41 @@ impl<'db> BlockTreeBuilder<'db> {
170168 . push ( BlockSemanticOp :: AddRoot { id : container } ) ;
171169 self . semantic_ops . push ( BlockSemanticOp :: AddBranchNode {
172170 target : container,
173- tag : tag_name. clone ( ) ,
171+ tag : tag_name. to_string ( ) ,
174172 marker_span : span,
175173 body : segment,
176174 kind : BranchKind :: Segment ,
177175 } ) ;
178176 }
179177
180178 self . stack . push ( TreeFrame {
181- opener_name : tag_name,
182- opener_bits : bits,
179+ opener_name : tag_name. to_string ( ) ,
180+ opener_bits : bits. to_vec ( ) ,
183181 opener_span : span,
184182 container_body : container,
185183 segment_body : segment,
186184 parent_body : parent,
187185 } ) ;
188186 }
189187 TagClass :: Closer { opener_name } => {
190- self . close_block ( & opener_name, & bits, span) ;
188+ self . close_block ( & opener_name, bits, span) ;
191189 }
192190 TagClass :: Intermediate { possible_openers } => {
193- self . add_intermediate ( & tag_name, & possible_openers, span) ;
191+ self . add_intermediate ( tag_name, & possible_openers, span) ;
194192 }
195193 TagClass :: Unknown => {
196194 if let Some ( segment) = get_active_segment ( & self . stack ) {
197195 self . semantic_ops . push ( BlockSemanticOp :: AddLeafNode {
198196 target : segment,
199- label : tag_name,
197+ label : tag_name. to_string ( ) ,
200198 span,
201199 } ) ;
202200 }
203201 }
204202 }
205203 }
206204
207- fn close_block ( & mut self , opener_name : & str , closer_bits : & [ TagBit < ' db > ] , span : Span ) {
205+ fn close_block ( & mut self , opener_name : & str , closer_bits : & [ String ] , span : Span ) {
208206 if let Some ( frame_idx) = find_frame_from_opener ( & self . stack , opener_name) {
209207 // Pop any unclosed blocks above this one
210208 while self . stack . len ( ) > frame_idx + 1 {
@@ -349,7 +347,7 @@ impl<'db> BlockTreeBuilder<'db> {
349347 }
350348}
351349
352- type TreeStack < ' db > = Vec < TreeFrame < ' db > > ;
350+ type TreeStack = Vec < TreeFrame > ;
353351
354352/// Get the currently active segment (the innermost block we're in)
355353fn get_active_segment ( stack : & TreeStack ) -> Option < BlockId > {
@@ -361,9 +359,9 @@ fn find_frame_from_opener(stack: &TreeStack, opener_name: &str) -> Option<usize>
361359 stack. iter ( ) . rposition ( |f| f. opener_name == opener_name)
362360}
363361
364- struct TreeFrame < ' db > {
362+ struct TreeFrame {
365363 opener_name : String ,
366- opener_bits : Vec < TagBit < ' db > > ,
364+ opener_bits : Vec < String > ,
367365 opener_span : Span ,
368366 container_body : BlockId ,
369367 segment_body : BlockId ,
@@ -373,10 +371,10 @@ struct TreeFrame<'db> {
373371impl < ' db > SemanticModel < ' db > for BlockTreeBuilder < ' db > {
374372 type Model = BlockTree ;
375373
376- fn observe ( & mut self , node : Node < ' db > ) {
374+ fn observe ( & mut self , node : Node ) {
377375 match node {
378376 Node :: Tag { name, bits, span } => {
379- self . handle_tag ( name, bits, span) ;
377+ self . handle_tag ( & name, & bits, span) ;
380378 }
381379 Node :: Comment { span, .. } => {
382380 if let Some ( parent) = get_active_segment ( & self . stack ) {
0 commit comments