1use crate::*;
7use std::cmp::{max, min};
8use std::ops::Add;
9
10pub struct NodeIter<'a, 'b> {
31 nodes: Vec<Node<'a, 'b>>,
32}
33
34impl<'a: 'b, 'b> NodeIter<'a, 'b> {
35 pub(crate) fn raw(self) -> Vec<Node<'a, 'b>> {
41 self.nodes
42 }
43}
44
45impl<'a: 'b, 'b> Default for NodeIter<'a, 'b> {
46 fn default() -> Self {
47 NodeIter { nodes: Vec::new() }
48 }
49}
50
51impl<'a: 'b, 'b> From<Node<'a, 'b>> for NodeIter<'a, 'b> {
52 fn from(value: Node<'a, 'b>) -> Self {
53 NodeIter { nodes: vec![value] }
54 }
55}
56
57impl<'a: 'b, 'b> Add for NodeIter<'a, 'b> {
58 type Output = Self;
59 fn add(mut self, rhs: Self) -> Self::Output {
60 self.nodes.extend(rhs.nodes);
61 self
62 }
63}
64
65impl<'a: 'b, 'b> Iterator for NodeIter<'a, 'b> {
66 type Item = Node<'a, 'b>;
67 fn next(&mut self) -> Option<Self::Item> {
68 let next = self.nodes.pop();
69 if let Some(node) = next.clone() {
70 let mut new_nodes: Vec<Node<'a, 'b>> = node.children();
71 new_nodes.reverse();
72 self.nodes.append(&mut new_nodes);
73 };
74 next
75 }
76}
77
78pub trait Nodes<'a: 'b, 'b> {
83 fn nodes(&'b self) -> NodeIter<'a, 'b>;
88
89 fn span(&'b self) -> Span<'a>;
94
95 fn add_nodes(
102 &'b self,
103 dest: &mut Vec<Node<'a, 'b>>,
104 pred: fn(Node<'a, 'b>) -> bool,
105 );
106
107 fn find(&'b self, pred: fn(Node<'a, 'b>) -> bool) -> Vec<Node<'a, 'b>> {
113 let mut result = Vec::new();
114 self.add_nodes(&mut result, pred);
115 result
116 }
117}
118
119pub(crate) fn merge_spans<'a>(span1: Span<'a>, span2: Span<'a>) -> Span<'a> {
120 if span1.file == "" {
121 span2
122 } else if span2.file == "" {
123 span1
124 } else if span1.file == span2.file {
125 Span {
126 bytes: (min(span1.bytes.start, span2.bytes.start)
127 ..max(span1.bytes.end, span2.bytes.end)),
128 ..span1
129 }
130 } else {
131 span1
132 }
133}
134
135impl<'a: 'b, 'b, T> Nodes<'a, 'b> for Box<T>
136where
137 T: Nodes<'a, 'b>,
138{
139 fn nodes(&'b self) -> NodeIter<'a, 'b> {
140 self.as_ref().nodes()
141 }
142 fn add_nodes(
143 &'b self,
144 dest: &mut Vec<Node<'a, 'b>>,
145 pred: fn(Node<'a, 'b>) -> bool,
146 ) {
147 self.as_ref().add_nodes(dest, pred);
148 }
149 fn span(&'b self) -> Span<'a> {
150 self.as_ref().span()
151 }
152}
153
154impl<'a: 'b, 'b, T> Nodes<'a, 'b> for Option<T>
155where
156 T: Nodes<'a, 'b>,
157{
158 fn nodes(&'b self) -> NodeIter<'a, 'b> {
159 match self {
160 Some(data) => data.nodes(),
161 None => NodeIter::default(),
162 }
163 }
164 fn add_nodes(
165 &'b self,
166 dest: &mut Vec<Node<'a, 'b>>,
167 pred: fn(Node<'a, 'b>) -> bool,
168 ) {
169 match self {
170 Some(data) => data.add_nodes(dest, pred),
171 None => (),
172 }
173 }
174 fn span(&'b self) -> Span<'a> {
175 match self {
176 Some(data) => data.span(),
177 None => Span::default(),
178 }
179 }
180}
181
182impl<'a: 'b, 'b, T> Nodes<'a, 'b> for Vec<T>
183where
184 T: Nodes<'a, 'b>,
185{
186 fn nodes(&'b self) -> NodeIter<'a, 'b> {
187 let mut ret: NodeIter<'a, 'b> = NodeIter::default();
188 for member in self {
189 ret = ret + member.nodes().into();
190 }
191 ret
192 }
193 fn add_nodes(
194 &'b self,
195 dest: &mut Vec<Node<'a, 'b>>,
196 pred: fn(Node<'a, 'b>) -> bool,
197 ) {
198 for member in self {
199 member.add_nodes(dest, pred);
200 }
201 }
202 fn span(&'b self) -> Span<'a> {
203 self.iter()
204 .map(|child_node| child_node.span())
205 .reduce(merge_spans)
206 .unwrap_or(Span::default())
207 }
208}
209
210impl<'a: 'b, 'b, T0, T1> Nodes<'a, 'b> for (T0, T1)
211where
212 T0: Nodes<'a, 'b>,
213 T1: Nodes<'a, 'b>,
214{
215 fn nodes(&'b self) -> NodeIter<'a, 'b> {
216 self.0.nodes() + self.1.nodes()
217 }
218 fn add_nodes(
219 &'b self,
220 dest: &mut Vec<Node<'a, 'b>>,
221 pred: fn(Node<'a, 'b>) -> bool,
222 ) {
223 self.0.add_nodes(dest, pred);
224 self.1.add_nodes(dest, pred);
225 }
226 fn span(&'b self) -> Span<'a> {
227 merge_spans(self.0.span(), self.1.span())
228 }
229}
230
231impl<'a: 'b, 'b, T0, T1, T2> Nodes<'a, 'b> for (T0, T1, T2)
232where
233 T0: Nodes<'a, 'b>,
234 T1: Nodes<'a, 'b>,
235 T2: Nodes<'a, 'b>,
236{
237 fn nodes(&'b self) -> NodeIter<'a, 'b> {
238 self.0.nodes() + self.1.nodes() + self.2.nodes()
239 }
240 fn add_nodes(
241 &'b self,
242 dest: &mut Vec<Node<'a, 'b>>,
243 pred: fn(Node<'a, 'b>) -> bool,
244 ) {
245 self.0.add_nodes(dest, pred);
246 self.1.add_nodes(dest, pred);
247 self.2.add_nodes(dest, pred);
248 }
249 fn span(&'b self) -> Span<'a> {
250 let merge_span = merge_spans(self.0.span(), self.1.span());
251 merge_spans(merge_span, self.2.span())
252 }
253}
254
255impl<'a: 'b, 'b, T0, T1, T2, T3: 'a> Nodes<'a, 'b> for (T0, T1, T2, T3)
256where
257 T0: Nodes<'a, 'b>,
258 T1: Nodes<'a, 'b>,
259 T2: Nodes<'a, 'b>,
260 T3: Nodes<'a, 'b>,
261{
262 fn nodes(&'b self) -> NodeIter<'a, 'b> {
263 self.0.nodes() + self.1.nodes() + self.2.nodes() + self.3.nodes()
264 }
265 fn add_nodes(
266 &'b self,
267 dest: &mut Vec<Node<'a, 'b>>,
268 pred: fn(Node<'a, 'b>) -> bool,
269 ) {
270 self.0.add_nodes(dest, pred);
271 self.1.add_nodes(dest, pred);
272 self.2.add_nodes(dest, pred);
273 self.3.add_nodes(dest, pred);
274 }
275 fn span(&'b self) -> Span<'a> {
276 let merge_span = merge_spans(self.0.span(), self.1.span());
277 let merge_span = merge_spans(merge_span, self.2.span());
278 merge_spans(merge_span, self.3.span())
279 }
280}
281
282impl<'a: 'b, 'b, T0, T1, T2, T3, T4: 'a> Nodes<'a, 'b> for (T0, T1, T2, T3, T4)
283where
284 T0: Nodes<'a, 'b>,
285 T1: Nodes<'a, 'b>,
286 T2: Nodes<'a, 'b>,
287 T3: Nodes<'a, 'b>,
288 T4: Nodes<'a, 'b>,
289{
290 fn nodes(&'b self) -> NodeIter<'a, 'b> {
291 self.0.nodes()
292 + self.1.nodes()
293 + self.2.nodes()
294 + self.3.nodes()
295 + self.4.nodes()
296 }
297 fn add_nodes(
298 &'b self,
299 dest: &mut Vec<Node<'a, 'b>>,
300 pred: fn(Node<'a, 'b>) -> bool,
301 ) {
302 self.0.add_nodes(dest, pred);
303 self.1.add_nodes(dest, pred);
304 self.2.add_nodes(dest, pred);
305 self.3.add_nodes(dest, pred);
306 self.4.add_nodes(dest, pred);
307 }
308 fn span(&'b self) -> Span<'a> {
309 let merge_span = merge_spans(self.0.span(), self.1.span());
310 let merge_span = merge_spans(merge_span, self.2.span());
311 let merge_span = merge_spans(merge_span, self.3.span());
312 merge_spans(merge_span, self.4.span())
313 }
314}
315
316impl<'a: 'b, 'b, T0, T1, T2, T3, T4, T5: 'a> Nodes<'a, 'b>
317 for (T0, T1, T2, T3, T4, T5)
318where
319 T0: Nodes<'a, 'b>,
320 T1: Nodes<'a, 'b>,
321 T2: Nodes<'a, 'b>,
322 T3: Nodes<'a, 'b>,
323 T4: Nodes<'a, 'b>,
324 T5: Nodes<'a, 'b>,
325{
326 fn nodes(&'b self) -> NodeIter<'a, 'b> {
327 self.0.nodes()
328 + self.1.nodes()
329 + self.2.nodes()
330 + self.3.nodes()
331 + self.4.nodes()
332 + self.5.nodes()
333 }
334 fn add_nodes(
335 &'b self,
336 dest: &mut Vec<Node<'a, 'b>>,
337 pred: fn(Node<'a, 'b>) -> bool,
338 ) {
339 self.0.add_nodes(dest, pred);
340 self.1.add_nodes(dest, pred);
341 self.2.add_nodes(dest, pred);
342 self.3.add_nodes(dest, pred);
343 self.4.add_nodes(dest, pred);
344 self.5.add_nodes(dest, pred);
345 }
346 fn span(&'b self) -> Span<'a> {
347 let merge_span = merge_spans(self.0.span(), self.1.span());
348 let merge_span = merge_spans(merge_span, self.2.span());
349 let merge_span = merge_spans(merge_span, self.3.span());
350 let merge_span = merge_spans(merge_span, self.4.span());
351 merge_spans(merge_span, self.5.span())
352 }
353}
354
355impl<'a: 'b, 'b, T0, T1, T2, T3, T4, T5, T6: 'a> Nodes<'a, 'b>
356 for (T0, T1, T2, T3, T4, T5, T6)
357where
358 T0: Nodes<'a, 'b>,
359 T1: Nodes<'a, 'b>,
360 T2: Nodes<'a, 'b>,
361 T3: Nodes<'a, 'b>,
362 T4: Nodes<'a, 'b>,
363 T5: Nodes<'a, 'b>,
364 T6: Nodes<'a, 'b>,
365{
366 fn nodes(&'b self) -> NodeIter<'a, 'b> {
367 self.0.nodes()
368 + self.1.nodes()
369 + self.2.nodes()
370 + self.3.nodes()
371 + self.4.nodes()
372 + self.5.nodes()
373 + self.6.nodes()
374 }
375 fn add_nodes(
376 &'b self,
377 dest: &mut Vec<Node<'a, 'b>>,
378 pred: fn(Node<'a, 'b>) -> bool,
379 ) {
380 self.0.add_nodes(dest, pred);
381 self.1.add_nodes(dest, pred);
382 self.2.add_nodes(dest, pred);
383 self.3.add_nodes(dest, pred);
384 self.4.add_nodes(dest, pred);
385 self.5.add_nodes(dest, pred);
386 self.6.add_nodes(dest, pred);
387 }
388 fn span(&'b self) -> Span<'a> {
389 let merge_span = merge_spans(self.0.span(), self.1.span());
390 let merge_span = merge_spans(merge_span, self.2.span());
391 let merge_span = merge_spans(merge_span, self.3.span());
392 let merge_span = merge_spans(merge_span, self.4.span());
393 let merge_span = merge_spans(merge_span, self.5.span());
394 merge_spans(merge_span, self.6.span())
395 }
396}
397
398impl<'a: 'b, 'b, T0, T1, T2, T3, T4, T5, T6, T7: 'a> Nodes<'a, 'b>
399 for (T0, T1, T2, T3, T4, T5, T6, T7)
400where
401 T0: Nodes<'a, 'b>,
402 T1: Nodes<'a, 'b>,
403 T2: Nodes<'a, 'b>,
404 T3: Nodes<'a, 'b>,
405 T4: Nodes<'a, 'b>,
406 T5: Nodes<'a, 'b>,
407 T6: Nodes<'a, 'b>,
408 T7: Nodes<'a, 'b>,
409{
410 fn nodes(&'b self) -> NodeIter<'a, 'b> {
411 self.0.nodes()
412 + self.1.nodes()
413 + self.2.nodes()
414 + self.3.nodes()
415 + self.4.nodes()
416 + self.5.nodes()
417 + self.6.nodes()
418 + self.7.nodes()
419 }
420 fn add_nodes(
421 &'b self,
422 dest: &mut Vec<Node<'a, 'b>>,
423 pred: fn(Node<'a, 'b>) -> bool,
424 ) {
425 self.0.add_nodes(dest, pred);
426 self.1.add_nodes(dest, pred);
427 self.2.add_nodes(dest, pred);
428 self.3.add_nodes(dest, pred);
429 self.4.add_nodes(dest, pred);
430 self.5.add_nodes(dest, pred);
431 self.6.add_nodes(dest, pred);
432 self.7.add_nodes(dest, pred);
433 }
434 fn span(&'b self) -> Span<'a> {
435 let merge_span = merge_spans(self.0.span(), self.1.span());
436 let merge_span = merge_spans(merge_span, self.2.span());
437 let merge_span = merge_spans(merge_span, self.3.span());
438 let merge_span = merge_spans(merge_span, self.4.span());
439 let merge_span = merge_spans(merge_span, self.5.span());
440 let merge_span = merge_spans(merge_span, self.6.span());
441 merge_spans(merge_span, self.7.span())
442 }
443}
444
445impl<'a: 'b, 'b, T0, T1, T2, T3, T4, T5, T6, T7, T8> Nodes<'a, 'b>
446 for (T0, T1, T2, T3, T4, T5, T6, T7, T8)
447where
448 T0: Nodes<'a, 'b>,
449 T1: Nodes<'a, 'b>,
450 T2: Nodes<'a, 'b>,
451 T3: Nodes<'a, 'b>,
452 T4: Nodes<'a, 'b>,
453 T5: Nodes<'a, 'b>,
454 T6: Nodes<'a, 'b>,
455 T7: Nodes<'a, 'b>,
456 T8: Nodes<'a, 'b>,
457{
458 fn nodes(&'b self) -> NodeIter<'a, 'b> {
459 self.0.nodes()
460 + self.1.nodes()
461 + self.2.nodes()
462 + self.3.nodes()
463 + self.4.nodes()
464 + self.5.nodes()
465 + self.6.nodes()
466 + self.7.nodes()
467 + self.8.nodes()
468 }
469 fn add_nodes(
470 &'b self,
471 dest: &mut Vec<Node<'a, 'b>>,
472 pred: fn(Node<'a, 'b>) -> bool,
473 ) {
474 self.0.add_nodes(dest, pred);
475 self.1.add_nodes(dest, pred);
476 self.2.add_nodes(dest, pred);
477 self.3.add_nodes(dest, pred);
478 self.4.add_nodes(dest, pred);
479 self.5.add_nodes(dest, pred);
480 self.6.add_nodes(dest, pred);
481 self.7.add_nodes(dest, pred);
482 self.8.add_nodes(dest, pred);
483 }
484 fn span(&'b self) -> Span<'a> {
485 let merge_span = merge_spans(self.0.span(), self.1.span());
486 let merge_span = merge_spans(merge_span, self.2.span());
487 let merge_span = merge_spans(merge_span, self.3.span());
488 let merge_span = merge_spans(merge_span, self.4.span());
489 let merge_span = merge_spans(merge_span, self.5.span());
490 let merge_span = merge_spans(merge_span, self.6.span());
491 let merge_span = merge_spans(merge_span, self.7.span());
492 merge_spans(merge_span, self.8.span())
493 }
494}
495
496impl<'a: 'b, 'b, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> Nodes<'a, 'b>
497 for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)
498where
499 T0: Nodes<'a, 'b>,
500 T1: Nodes<'a, 'b>,
501 T2: Nodes<'a, 'b>,
502 T3: Nodes<'a, 'b>,
503 T4: Nodes<'a, 'b>,
504 T5: Nodes<'a, 'b>,
505 T6: Nodes<'a, 'b>,
506 T7: Nodes<'a, 'b>,
507 T8: Nodes<'a, 'b>,
508 T9: Nodes<'a, 'b>,
509{
510 fn nodes(&'b self) -> NodeIter<'a, 'b> {
511 self.0.nodes()
512 + self.1.nodes()
513 + self.2.nodes()
514 + self.3.nodes()
515 + self.4.nodes()
516 + self.5.nodes()
517 + self.6.nodes()
518 + self.7.nodes()
519 + self.8.nodes()
520 + self.9.nodes()
521 }
522 fn add_nodes(
523 &'b self,
524 dest: &mut Vec<Node<'a, 'b>>,
525 pred: fn(Node<'a, 'b>) -> bool,
526 ) {
527 self.0.add_nodes(dest, pred);
528 self.1.add_nodes(dest, pred);
529 self.2.add_nodes(dest, pred);
530 self.3.add_nodes(dest, pred);
531 self.4.add_nodes(dest, pred);
532 self.5.add_nodes(dest, pred);
533 self.6.add_nodes(dest, pred);
534 self.7.add_nodes(dest, pred);
535 self.8.add_nodes(dest, pred);
536 self.9.add_nodes(dest, pred);
537 }
538 fn span(&'b self) -> Span<'a> {
539 let merge_span = merge_spans(self.0.span(), self.1.span());
540 let merge_span = merge_spans(merge_span, self.2.span());
541 let merge_span = merge_spans(merge_span, self.3.span());
542 let merge_span = merge_spans(merge_span, self.4.span());
543 let merge_span = merge_spans(merge_span, self.5.span());
544 let merge_span = merge_spans(merge_span, self.6.span());
545 let merge_span = merge_spans(merge_span, self.7.span());
546 let merge_span = merge_spans(merge_span, self.8.span());
547 merge_spans(merge_span, self.9.span())
548 }
549}
550
551impl<'a: 'b, 'b, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Nodes<'a, 'b>
552 for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
553where
554 T0: Nodes<'a, 'b>,
555 T1: Nodes<'a, 'b>,
556 T2: Nodes<'a, 'b>,
557 T3: Nodes<'a, 'b>,
558 T4: Nodes<'a, 'b>,
559 T5: Nodes<'a, 'b>,
560 T6: Nodes<'a, 'b>,
561 T7: Nodes<'a, 'b>,
562 T8: Nodes<'a, 'b>,
563 T9: Nodes<'a, 'b>,
564 T10: Nodes<'a, 'b>,
565{
566 fn nodes(&'b self) -> NodeIter<'a, 'b> {
567 self.0.nodes()
568 + self.1.nodes()
569 + self.2.nodes()
570 + self.3.nodes()
571 + self.4.nodes()
572 + self.5.nodes()
573 + self.6.nodes()
574 + self.7.nodes()
575 + self.8.nodes()
576 + self.9.nodes()
577 + self.10.nodes()
578 }
579 fn add_nodes(
580 &'b self,
581 dest: &mut Vec<Node<'a, 'b>>,
582 pred: fn(Node<'a, 'b>) -> bool,
583 ) {
584 self.0.add_nodes(dest, pred);
585 self.1.add_nodes(dest, pred);
586 self.2.add_nodes(dest, pred);
587 self.3.add_nodes(dest, pred);
588 self.4.add_nodes(dest, pred);
589 self.5.add_nodes(dest, pred);
590 self.6.add_nodes(dest, pred);
591 self.7.add_nodes(dest, pred);
592 self.8.add_nodes(dest, pred);
593 self.9.add_nodes(dest, pred);
594 self.10.add_nodes(dest, pred);
595 }
596 fn span(&'b self) -> Span<'a> {
597 let merge_span = merge_spans(self.0.span(), self.1.span());
598 let merge_span = merge_spans(merge_span, self.2.span());
599 let merge_span = merge_spans(merge_span, self.3.span());
600 let merge_span = merge_spans(merge_span, self.4.span());
601 let merge_span = merge_spans(merge_span, self.5.span());
602 let merge_span = merge_spans(merge_span, self.6.span());
603 let merge_span = merge_spans(merge_span, self.7.span());
604 let merge_span = merge_spans(merge_span, self.8.span());
605 let merge_span = merge_spans(merge_span, self.9.span());
606 merge_spans(merge_span, self.10.span())
607 }
608}
609
610impl<'a: 'b, 'b, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Nodes<'a, 'b>
611 for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)
612where
613 T0: Nodes<'a, 'b>,
614 T1: Nodes<'a, 'b>,
615 T2: Nodes<'a, 'b>,
616 T3: Nodes<'a, 'b>,
617 T4: Nodes<'a, 'b>,
618 T5: Nodes<'a, 'b>,
619 T6: Nodes<'a, 'b>,
620 T7: Nodes<'a, 'b>,
621 T8: Nodes<'a, 'b>,
622 T9: Nodes<'a, 'b>,
623 T10: Nodes<'a, 'b>,
624 T11: Nodes<'a, 'b>,
625{
626 fn nodes(&'b self) -> NodeIter<'a, 'b> {
627 self.0.nodes()
628 + self.1.nodes()
629 + self.2.nodes()
630 + self.3.nodes()
631 + self.4.nodes()
632 + self.5.nodes()
633 + self.6.nodes()
634 + self.7.nodes()
635 + self.8.nodes()
636 + self.9.nodes()
637 + self.10.nodes()
638 + self.11.nodes()
639 }
640 fn add_nodes(
641 &'b self,
642 dest: &mut Vec<Node<'a, 'b>>,
643 pred: fn(Node<'a, 'b>) -> bool,
644 ) {
645 self.0.add_nodes(dest, pred);
646 self.1.add_nodes(dest, pred);
647 self.2.add_nodes(dest, pred);
648 self.3.add_nodes(dest, pred);
649 self.4.add_nodes(dest, pred);
650 self.5.add_nodes(dest, pred);
651 self.6.add_nodes(dest, pred);
652 self.7.add_nodes(dest, pred);
653 self.8.add_nodes(dest, pred);
654 self.9.add_nodes(dest, pred);
655 self.10.add_nodes(dest, pred);
656 self.11.add_nodes(dest, pred);
657 }
658 fn span(&'b self) -> Span<'a> {
659 let merge_span = merge_spans(self.0.span(), self.1.span());
660 let merge_span = merge_spans(merge_span, self.2.span());
661 let merge_span = merge_spans(merge_span, self.3.span());
662 let merge_span = merge_spans(merge_span, self.4.span());
663 let merge_span = merge_spans(merge_span, self.5.span());
664 let merge_span = merge_spans(merge_span, self.6.span());
665 let merge_span = merge_spans(merge_span, self.7.span());
666 let merge_span = merge_spans(merge_span, self.8.span());
667 let merge_span = merge_spans(merge_span, self.9.span());
668 let merge_span = merge_spans(merge_span, self.10.span());
669 merge_spans(merge_span, self.11.span())
670 }
671}
672
673impl<'a: 'b, 'b> Nodes<'a, 'b> for Metadata<'a> {
674 fn nodes(&self) -> NodeIter<'a, 'b> {
675 NodeIter::default()
676 }
677 fn add_nodes(
678 &'b self,
679 _: &mut Vec<Node<'a, 'b>>,
680 _: fn(Node<'a, 'b>) -> bool,
681 ) {
682 }
683 fn span(&'b self) -> Span<'a> {
684 self.span.clone()
685 }
686}
687
688impl<'a: 'b, 'b> Nodes<'a, 'b> for NonTriviaToken<'a> {
689 fn nodes(&self) -> NodeIter<'a, 'b> {
690 NodeIter::default()
691 }
692 fn add_nodes(
693 &'b self,
694 _: &mut Vec<Node<'a, 'b>>,
695 _: fn(Node<'a, 'b>) -> bool,
696 ) {
697 }
698 fn span(&'b self) -> Span<'a> {
699 Span::default()
700 }
701}
702
703impl<'a: 'b, 'b> Nodes<'a, 'b> for &'a str {
704 fn nodes(&self) -> NodeIter<'a, 'b> {
705 NodeIter::default()
706 }
707 fn add_nodes(
708 &'b self,
709 _: &mut Vec<Node<'a, 'b>>,
710 _: fn(Node<'a, 'b>) -> bool,
711 ) {
712 }
713 fn span(&'b self) -> Span<'a> {
714 Span::default()
715 }
716}
717
718#[cfg(test)]
719fn example_source() -> SourceText<'static> {
720 SourceText(
721 vec![],
722 None,
723 vec![Description::ModuleDeclaration(Box::new(
724 ModuleDeclaration::Ansi(Box::new(ModuleDeclarationAnsi(
725 ModuleAnsiHeader(
726 vec![],
727 ModuleKeyword::Module(Metadata::default()),
728 None,
729 ModuleIdentifier(Identifier::SimpleIdentifier((
730 "test_module",
731 Metadata::default(),
732 ))),
733 vec![],
734 None,
735 None,
736 Metadata::default(),
737 ),
738 None,
739 vec![
740 NonPortModuleItem::ModuleOrGenerate(Box::new(
741 ModuleOrGenerateItem::ModuleCommon(
742 Box::new((
743 vec![],
744 ModuleCommonItem::ModuleOrGenerateDeclaration(Box::new(
745 ModuleOrGenerateItemDeclaration::PackageOrGenerate(Box::new(
746 PackageOrGenerateItemDeclaration::Data(
747 Box::new(
748 DataDeclaration::Variable(
749 Box::new((
750 None,
751 None,
752 None,
753 DataTypeOrImplicit::DataType(DataType::Vector(Box::new((
754 IntegerVectorType::Logic(Metadata::default()),
755 None,
756 vec![]
757 )))),
758 ListOfVariableDeclAssignments(
759 VariableDeclAssignment::Variable(Box::new((
760 VariableIdentifier(Identifier::SimpleIdentifier(("my_signal", Metadata::default()))),
761 vec![],
762 None)
763 )),
764 vec![]
765 ),
766 Metadata::default()
767 ))
768 )
769 )
770 )
771 ))
772 ))
773 ))
774 )
775 ))
776 ],
777 Metadata::default(),
778 None,
779 ))),
780 ))],
781 )
782}
783
784#[test]
785fn iterate() {
786 let source = example_source();
787 let mut nodes = source.nodes();
788 assert!(matches!(nodes.next().unwrap(), Node::SourceText(_)));
789 assert!(matches!(nodes.next().unwrap(), Node::Description(_)));
790 assert!(matches!(nodes.next().unwrap(), Node::ModuleDeclaration(_)));
791 assert!(matches!(
792 nodes.next().unwrap(),
793 Node::ModuleDeclarationAnsi(_)
794 ));
795 assert!(matches!(nodes.next().unwrap(), Node::ModuleAnsiHeader(_)));
796 assert!(matches!(nodes.next().unwrap(), Node::ModuleKeyword(_)));
797 assert!(matches!(nodes.next().unwrap(), Node::ModuleIdentifier(_)));
798 assert!(matches!(nodes.next().unwrap(), Node::Identifier(_)));
799 assert!(matches!(nodes.next().unwrap(), Node::NonPortModuleItem(_)));
800 assert!(matches!(
801 nodes.next().unwrap(),
802 Node::ModuleOrGenerateItem(_)
803 ));
804 assert!(matches!(nodes.next().unwrap(), Node::ModuleCommonItem(_)));
805 assert!(matches!(
806 nodes.next().unwrap(),
807 Node::ModuleOrGenerateItemDeclaration(_)
808 ));
809 assert!(matches!(
810 nodes.next().unwrap(),
811 Node::PackageOrGenerateItemDeclaration(_)
812 ));
813 assert!(matches!(nodes.next().unwrap(), Node::DataDeclaration(_)));
814 assert!(matches!(nodes.next().unwrap(), Node::DataTypeOrImplicit(_)));
815 assert!(matches!(nodes.next().unwrap(), Node::DataType(_)));
816 assert!(matches!(nodes.next().unwrap(), Node::IntegerVectorType(_)));
817 assert!(matches!(
818 nodes.next().unwrap(),
819 Node::ListOfVariableDeclAssignments(_)
820 ));
821 assert!(matches!(
822 nodes.next().unwrap(),
823 Node::VariableDeclAssignment(_)
824 ));
825 assert!(matches!(nodes.next().unwrap(), Node::VariableIdentifier(_)));
826 assert!(matches!(nodes.next().unwrap(), Node::Identifier(_)));
827 assert!(nodes.next().is_none());
828}
829
830#[cfg(test)]
831fn is_identifier<'a, 'b>(node: Node<'a, 'b>) -> bool {
832 matches!(node, Node::Identifier(_))
833}
834
835#[test]
836fn find() {
837 let source = example_source();
838 let source_node: Node<'_, '_> = (&source).into();
839 let identifiers: Vec<Node<'_, '_>> = source_node.find(is_identifier);
840 assert_eq!(identifiers.len(), 2);
841 let mut identifier_iter = identifiers.iter();
842 assert!(matches!(
843 identifier_iter.next().unwrap(),
844 Node::Identifier(Identifier::SimpleIdentifier(("test_module", _)))
845 ));
846 assert!(matches!(
847 identifier_iter.next().unwrap(),
848 Node::Identifier(Identifier::SimpleIdentifier(("my_signal", _)))
849 ));
850}