1use std::{
2 cell::RefCell,
3 fmt,
4 hash::{Hash, Hasher},
5 iter, mem, ptr,
6 sync::Arc,
7};
8
9use crate::{
10 green::{GreenElementRef, SyntaxKind},
11 Children, Direction, GreenNode, GreenToken, NodeOrToken, SmolStr, SyntaxText, TextRange,
12 TextSize, TokenAtOffset, WalkEvent,
13};
14
15#[derive(Debug, Clone)]
16pub struct SyntaxNode(Arc<NodeData>);
17
18impl Drop for SyntaxNode {
19 fn drop(&mut self) {
20 NodeData::delete(&mut self.0)
21 }
22}
23
24impl PartialEq for SyntaxNode {
26 fn eq(&self, other: &SyntaxNode) -> bool {
27 self.green().ptr() == other.green().ptr()
28 && self.text_range().start() == other.text_range().start()
29 }
30}
31
32impl Eq for SyntaxNode {}
33
34impl Hash for SyntaxNode {
35 fn hash<H: Hasher>(&self, state: &mut H) {
36 ptr::hash(self.green().ptr(), state);
37 self.text_range().start().hash(state);
38 }
39}
40
41impl fmt::Display for SyntaxNode {
42 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43 self.preorder_with_tokens()
44 .filter_map(|event| match event {
45 WalkEvent::Enter(NodeOrToken::Token(token)) => Some(token),
46 _ => None,
47 })
48 .try_for_each(|it| fmt::Display::fmt(&it, f))
49 }
50}
51
52#[derive(Debug, Clone, PartialEq, Eq, Hash)]
53pub struct SyntaxToken {
54 parent: SyntaxNode,
55 index: u32,
56 offset: TextSize,
57}
58
59impl fmt::Display for SyntaxToken {
60 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
61 fmt::Display::fmt(self.text(), f)
62 }
63}
64
65pub type SyntaxElement = NodeOrToken<SyntaxNode, SyntaxToken>;
66
67impl From<SyntaxNode> for SyntaxElement {
68 fn from(node: SyntaxNode) -> SyntaxElement {
69 NodeOrToken::Node(node)
70 }
71}
72
73impl From<SyntaxToken> for SyntaxElement {
74 fn from(token: SyntaxToken) -> SyntaxElement {
75 NodeOrToken::Token(token)
76 }
77}
78
79impl fmt::Display for SyntaxElement {
80 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
81 match self {
82 NodeOrToken::Node(it) => fmt::Display::fmt(it, f),
83 NodeOrToken::Token(it) => fmt::Display::fmt(it, f),
84 }
85 }
86}
87
88#[derive(Debug)]
89enum Kind {
90 Root(GreenNode),
91 Child { parent: SyntaxNode, index: u32, offset: TextSize },
92 Free { next_free: Option<Arc<NodeData>> },
93}
94
95impl Kind {
96 fn as_child(&self) -> Option<(&SyntaxNode, u32, TextSize)> {
97 match self {
98 Kind::Child { parent, index, offset } => Some((parent, *index, *offset)),
99 _ => None,
100 }
101 }
102}
103
104#[derive(Debug)]
105struct NodeData {
106 kind: Kind,
107 green: ptr::NonNull<GreenNode>,
108}
109
110unsafe impl Send for NodeData {}
111unsafe impl Sync for NodeData {}
112
113struct FreeList {
114 first_free: Option<Arc<NodeData>>,
115 len: usize,
116}
117
118const FREE_LIST_LEN: usize = 128;
119
120impl FreeList {
121 fn new() -> FreeList {
122 let mut res = FreeList { first_free: None, len: 0 };
123 for _ in 0..FREE_LIST_LEN {
124 res.try_push(&mut Arc::new(NodeData {
125 kind: Kind::Free { next_free: None },
126 green: ptr::NonNull::dangling(),
127 }))
128 }
129 res
130 }
131
132 fn with<T, F: FnOnce(&mut FreeList) -> T>(f: F) -> T {
133 thread_local! {
134 static INSTANCE: RefCell<FreeList> = RefCell::new(FreeList::new());
135 }
136 INSTANCE.with(|it| f(&mut *it.borrow_mut()))
137 }
138
139 fn pop(&mut self) -> Option<Arc<NodeData>> {
140 let mut node = self.first_free.take()?;
141 self.len -= 1;
142 {
143 let node = Arc::get_mut(&mut node).unwrap();
144 self.first_free = match &mut node.kind {
145 Kind::Free { next_free } => next_free.take(),
146 _ => unreachable!(),
147 }
148 }
149 Some(node)
150 }
151
152 fn try_push(&mut self, node: &mut Arc<NodeData>) {
153 if self.len >= FREE_LIST_LEN {
154 return;
155 }
156 Arc::get_mut(node).unwrap().kind = Kind::Free { next_free: self.first_free.take() };
157 self.first_free = Some(Arc::clone(node));
158 self.len += 1;
159 }
160}
161
162impl NodeData {
163 fn new(kind: Kind, green: ptr::NonNull<GreenNode>) -> Arc<NodeData> {
164 let mut node = FreeList::with(|it| it.pop()).unwrap_or_else(|| {
165 Arc::new(NodeData {
166 kind: Kind::Free { next_free: None },
167 green: ptr::NonNull::dangling(),
168 })
169 });
170
171 {
172 let node = Arc::get_mut(&mut node).unwrap();
173 node.kind = kind;
174 node.green = green;
175 }
176 node
177 }
178 fn delete(this: &mut Arc<NodeData>) {
179 if let Some(this_mut) = Arc::get_mut(this) {
180 this_mut.kind = Kind::Free { next_free: None };
182 FreeList::with(|it| it.try_push(this))
183 }
184 }
185}
186
187impl SyntaxNode {
188 fn new(data: Arc<NodeData>) -> SyntaxNode {
189 SyntaxNode(data)
190 }
191
192 pub fn new_root(green: GreenNode) -> SyntaxNode {
193 let data = NodeData::new(Kind::Root(green), ptr::NonNull::dangling());
194 let mut ret = SyntaxNode::new(data);
195 let green: ptr::NonNull<GreenNode> = match &ret.0.kind {
196 Kind::Root(green) => green.into(),
197 _ => unreachable!(),
198 };
199 Arc::get_mut(&mut ret.0).unwrap().green = green;
200 ret
201 }
202
203 fn new_child(
206 green: &GreenNode,
207 parent: SyntaxNode,
208 index: u32,
209 offset: TextSize,
210 ) -> SyntaxNode {
211 let data = NodeData::new(Kind::Child { parent, index, offset }, green.into());
212 SyntaxNode::new(data)
213 }
214
215 pub fn replace_with(&self, replacement: GreenNode) -> GreenNode {
219 assert_eq!(self.kind(), replacement.kind());
220 match self.0.kind.as_child() {
221 None => replacement,
222 Some((parent, me, _offset)) => {
223 let mut replacement = Some(replacement);
224 let children = parent.green().children().enumerate().map(|(i, child)| {
225 if i as u32 == me {
226 replacement.take().unwrap().into()
227 } else {
228 child.cloned()
229 }
230 });
231 let new_parent = GreenNode::new(parent.kind(), children);
232 parent.replace_with(new_parent)
233 }
234 }
235 }
236
237 pub fn kind(&self) -> SyntaxKind {
238 self.green().kind()
239 }
240
241 pub fn text_range(&self) -> TextRange {
242 let offset = match self.0.kind.as_child() {
243 Some((_, _, it)) => it,
244 _ => 0.into(),
245 };
246 TextRange::at(offset, self.green().text_len())
247 }
248
249 pub fn text(&self) -> SyntaxText {
250 SyntaxText::new(self.clone())
251 }
252
253 pub fn green(&self) -> &GreenNode {
254 unsafe { self.0.green.as_ref() }
255 }
256
257 pub fn parent(&self) -> Option<SyntaxNode> {
258 match &self.0.kind {
259 Kind::Root(_) => None,
260 Kind::Child { parent, .. } => Some(parent.clone()),
261 Kind::Free { .. } => unreachable!(),
262 }
263 }
264
265 pub fn ancestors(&self) -> impl Iterator<Item = SyntaxNode> {
266 iter::successors(Some(self.clone()), SyntaxNode::parent)
267 }
268
269 pub fn children(&self) -> SyntaxNodeChildren {
270 SyntaxNodeChildren::new(self.clone())
271 }
272
273 pub fn children_with_tokens(&self) -> SyntaxElementChildren {
274 SyntaxElementChildren::new(self.clone())
275 }
276
277 #[inline]
278 pub fn first_child(&self) -> Option<SyntaxNode> {
279 let (node, (index, offset)) =
280 filter_nodes(self.green().children_from(0, self.text_range().start())).next()?;
281
282 Some(SyntaxNode::new_child(node, self.clone(), index as u32, offset))
283 }
284
285 pub fn first_child_or_token(&self) -> Option<SyntaxElement> {
286 let (element, (index, offset)) =
287 self.green().children_from(0, self.text_range().start()).next()?;
288 Some(SyntaxElement::new(element, self.clone(), index as u32, offset))
289 }
290
291 #[inline]
292 pub fn last_child(&self) -> Option<SyntaxNode> {
293 let (node, (index, offset)) = filter_nodes(
294 self.green().children_to(self.green().children().len(), self.text_range().end()),
295 )
296 .next()?;
297
298 Some(SyntaxNode::new_child(node, self.clone(), index as u32, offset))
299 }
300
301 pub fn last_child_or_token(&self) -> Option<SyntaxElement> {
302 let (element, (index, offset)) = self
303 .green()
304 .children_to(self.green().children().len(), self.text_range().end())
305 .next()?;
306 Some(SyntaxElement::new(element, self.clone(), index as u32, offset))
307 }
308
309 pub fn next_sibling(&self) -> Option<SyntaxNode> {
310 let (parent, index, _) = self.0.kind.as_child()?;
311
312 let (node, (index, offset)) = filter_nodes(
313 parent.green().children_from((index + 1) as usize, self.text_range().end()),
314 )
315 .next()?;
316
317 Some(SyntaxNode::new_child(node, parent.clone(), index as u32, offset))
318 }
319
320 pub fn next_sibling_or_token(&self) -> Option<SyntaxElement> {
321 let (parent, index, _) = self.0.kind.as_child()?;
322
323 let (element, (index, offset)) =
324 parent.green().children_from((index + 1) as usize, self.text_range().end()).next()?;
325
326 Some(SyntaxElement::new(element, parent.clone(), index as u32, offset))
327 }
328
329 pub fn prev_sibling(&self) -> Option<SyntaxNode> {
330 let (parent, index, _) = self.0.kind.as_child()?;
331
332 let (node, (index, offset)) =
333 filter_nodes(parent.green().children_to(index as usize, self.text_range().start()))
334 .next()?;
335
336 Some(SyntaxNode::new_child(node, parent.clone(), index as u32, offset))
337 }
338
339 pub fn prev_sibling_or_token(&self) -> Option<SyntaxElement> {
340 let (parent, index, _) = self.0.kind.as_child()?;
341
342 let (element, (index, offset)) =
343 parent.green().children_to(index as usize, self.text_range().start()).next()?;
344
345 Some(SyntaxElement::new(element, parent.clone(), index as u32, offset))
346 }
347
348 #[inline]
350 pub fn first_token(&self) -> Option<SyntaxToken> {
351 self.first_child_or_token()?.first_token()
352 }
353
354 #[inline]
356 pub fn last_token(&self) -> Option<SyntaxToken> {
357 self.last_child_or_token()?.last_token()
358 }
359
360 pub fn siblings(&self, direction: Direction) -> impl Iterator<Item = SyntaxNode> {
361 iter::successors(Some(self.clone()), move |node| match direction {
362 Direction::Next => node.next_sibling(),
363 Direction::Prev => node.prev_sibling(),
364 })
365 }
366
367 pub fn siblings_with_tokens(
368 &self,
369 direction: Direction,
370 ) -> impl Iterator<Item = SyntaxElement> {
371 let me: SyntaxElement = self.clone().into();
372 iter::successors(Some(me), move |el| match direction {
373 Direction::Next => el.next_sibling_or_token(),
374 Direction::Prev => el.prev_sibling_or_token(),
375 })
376 }
377
378 pub fn descendants(&self) -> impl Iterator<Item = SyntaxNode> {
379 self.preorder().filter_map(|event| match event {
380 WalkEvent::Enter(node) => Some(node),
381 WalkEvent::Leave(_) => None,
382 })
383 }
384
385 pub fn descendants_with_tokens(&self) -> impl Iterator<Item = SyntaxElement> {
386 self.preorder_with_tokens().filter_map(|event| match event {
387 WalkEvent::Enter(it) => Some(it),
388 WalkEvent::Leave(_) => None,
389 })
390 }
391
392 #[inline]
395 pub fn preorder(&self) -> impl Iterator<Item = WalkEvent<SyntaxNode>> {
396 let this = self.clone();
397 iter::successors(Some(WalkEvent::Enter(self.clone())), move |pos| {
398 let next = match pos {
399 WalkEvent::Enter(node) => match node.first_child() {
400 Some(child) => WalkEvent::Enter(child),
401 None => WalkEvent::Leave(node.clone()),
402 },
403 WalkEvent::Leave(node) => {
404 if node == &this {
405 return None;
406 }
407 match node.next_sibling() {
408 Some(sibling) => WalkEvent::Enter(sibling),
409 None => WalkEvent::Leave(node.parent().unwrap()),
410 }
411 }
412 };
413 Some(next)
414 })
415 }
416
417 #[inline]
420 pub fn preorder_with_tokens<'a>(&'a self) -> impl Iterator<Item = WalkEvent<SyntaxElement>> {
421 let start: SyntaxElement = self.clone().into();
422 iter::successors(Some(WalkEvent::Enter(start.clone())), move |pos| {
423 let next = match pos {
424 WalkEvent::Enter(el) => match el {
425 NodeOrToken::Node(node) => match node.first_child_or_token() {
426 Some(child) => WalkEvent::Enter(child),
427 None => WalkEvent::Leave(node.clone().into()),
428 },
429 NodeOrToken::Token(token) => WalkEvent::Leave(token.clone().into()),
430 },
431 WalkEvent::Leave(el) => {
432 if el == &start {
433 return None;
434 }
435 match el.next_sibling_or_token() {
436 Some(sibling) => WalkEvent::Enter(sibling),
437 None => WalkEvent::Leave(el.parent().unwrap().into()),
438 }
439 }
440 };
441 Some(next)
442 })
443 }
444
445 pub fn token_at_offset(&self, offset: TextSize) -> TokenAtOffset<SyntaxToken> {
448 let range = self.text_range();
452 assert!(
453 range.start() <= offset && offset <= range.end(),
454 "Bad offset: range {:?} offset {:?}",
455 range,
456 offset
457 );
458 if range.is_empty() {
459 return TokenAtOffset::None;
460 }
461
462 let mut children = self.children_with_tokens().filter(|child| {
463 let child_range = child.text_range();
464 !child_range.is_empty()
465 && (child_range.start() <= offset && offset <= child_range.end())
466 });
467
468 let left = children.next().unwrap();
469 let right = children.next();
470 assert!(children.next().is_none());
471
472 if let Some(right) = right {
473 match (left.token_at_offset(offset), right.token_at_offset(offset)) {
474 (TokenAtOffset::Single(left), TokenAtOffset::Single(right)) => {
475 TokenAtOffset::Between(left, right)
476 }
477 _ => unreachable!(),
478 }
479 } else {
480 left.token_at_offset(offset)
481 }
482 }
483
484 pub fn covering_element(&self, range: TextRange) -> SyntaxElement {
489 let mut res: SyntaxElement = self.clone().into();
490 loop {
491 assert!(
492 res.text_range().contains_range(range),
493 "Bad range: node range {:?}, range {:?}",
494 res.text_range(),
495 range,
496 );
497 res = match &res {
498 NodeOrToken::Token(_) => return res,
499 NodeOrToken::Node(node) => {
500 match node
501 .children_with_tokens()
502 .find(|child| child.text_range().contains_range(range))
503 {
504 Some(child) => child,
505 None => return res,
506 }
507 }
508 };
509 }
510 }
511}
512
513impl SyntaxToken {
514 fn new(parent: SyntaxNode, index: u32, offset: TextSize) -> SyntaxToken {
515 SyntaxToken { parent, index, offset }
516 }
517
518 pub fn replace_with(&self, replacement: GreenToken) -> GreenNode {
522 assert_eq!(self.kind(), replacement.kind());
523 let mut replacement = Some(replacement);
524 let parent = self.parent();
525 let me = self.index;
526
527 let children = parent.green().children().enumerate().map(|(i, child)| {
528 if i as u32 == me {
529 replacement.take().unwrap().into()
530 } else {
531 child.cloned()
532 }
533 });
534 let new_parent = GreenNode::new(parent.kind(), children);
535 parent.replace_with(new_parent)
536 }
537
538 pub fn kind(&self) -> SyntaxKind {
539 self.green().kind()
540 }
541
542 pub fn text_range(&self) -> TextRange {
543 TextRange::at(self.offset, self.green().text_len())
544 }
545
546 pub fn text(&self) -> &SmolStr {
547 self.green().text()
548 }
549
550 pub fn green(&self) -> &GreenToken {
551 self.parent.green().children().nth(self.index as usize).unwrap().as_token().unwrap()
552 }
553
554 pub fn parent(&self) -> SyntaxNode {
555 self.parent.clone()
556 }
557
558 pub fn ancestors(&self) -> impl Iterator<Item = SyntaxNode> {
559 self.parent().ancestors()
560 }
561
562 pub fn next_sibling_or_token(&self) -> Option<SyntaxElement> {
563 let (element, (index, offset)) = self
564 .parent
565 .green()
566 .children_from((self.index + 1) as usize, self.text_range().end())
567 .next()?;
568
569 Some(SyntaxElement::new(element, self.parent(), index as u32, offset))
570 }
571
572 pub fn prev_sibling_or_token(&self) -> Option<SyntaxElement> {
573 let parent = self.parent();
574 let (element, (index, offset)) = self
575 .parent
576 .green()
577 .children_to(self.index as usize, self.text_range().start())
578 .next()?;
579
580 Some(SyntaxElement::new(element, parent, index as u32, offset))
581 }
582
583 pub fn siblings_with_tokens(
584 &self,
585 direction: Direction,
586 ) -> impl Iterator<Item = SyntaxElement> {
587 let me: SyntaxElement = self.clone().into();
588 iter::successors(Some(me), move |el| match direction {
589 Direction::Next => el.next_sibling_or_token(),
590 Direction::Prev => el.prev_sibling_or_token(),
591 })
592 }
593
594 pub fn next_token(&self) -> Option<SyntaxToken> {
596 match self.next_sibling_or_token() {
597 Some(element) => element.first_token(),
598 None => self
599 .parent()
600 .ancestors()
601 .find_map(|it| it.next_sibling_or_token())
602 .and_then(|element| element.first_token()),
603 }
604 }
605 pub fn prev_token(&self) -> Option<SyntaxToken> {
607 match self.prev_sibling_or_token() {
608 Some(element) => element.last_token(),
609 None => self
610 .parent()
611 .ancestors()
612 .find_map(|it| it.prev_sibling_or_token())
613 .and_then(|element| element.last_token()),
614 }
615 }
616}
617
618impl SyntaxElement {
619 fn new(
620 element: GreenElementRef<'_>,
621 parent: SyntaxNode,
622 index: u32,
623 offset: TextSize,
624 ) -> SyntaxElement {
625 match element {
626 NodeOrToken::Node(node) => {
627 SyntaxNode::new_child(node, parent, index as u32, offset).into()
628 }
629 NodeOrToken::Token(_) => SyntaxToken::new(parent, index as u32, offset).into(),
630 }
631 }
632
633 pub fn text_range(&self) -> TextRange {
634 match self {
635 NodeOrToken::Node(it) => it.text_range(),
636 NodeOrToken::Token(it) => it.text_range(),
637 }
638 }
639
640 pub fn kind(&self) -> SyntaxKind {
641 match self {
642 NodeOrToken::Node(it) => it.kind(),
643 NodeOrToken::Token(it) => it.kind(),
644 }
645 }
646
647 pub fn parent(&self) -> Option<SyntaxNode> {
648 match self {
649 NodeOrToken::Node(it) => it.parent(),
650 NodeOrToken::Token(it) => Some(it.parent()),
651 }
652 }
653
654 pub fn ancestors(&self) -> impl Iterator<Item = SyntaxNode> {
655 match self {
656 NodeOrToken::Node(it) => it.ancestors(),
657 NodeOrToken::Token(it) => it.parent().ancestors(),
658 }
659 }
660
661 #[inline]
662 pub fn first_token(&self) -> Option<SyntaxToken> {
663 match self {
664 NodeOrToken::Node(it) => it.first_token(),
665 NodeOrToken::Token(it) => Some(it.clone()),
666 }
667 }
668
669 #[inline]
670 pub fn last_token(&self) -> Option<SyntaxToken> {
671 match self {
672 NodeOrToken::Node(it) => it.last_token(),
673 NodeOrToken::Token(it) => Some(it.clone()),
674 }
675 }
676
677 pub fn next_sibling_or_token(&self) -> Option<SyntaxElement> {
678 match self {
679 NodeOrToken::Node(it) => it.next_sibling_or_token(),
680 NodeOrToken::Token(it) => it.next_sibling_or_token(),
681 }
682 }
683
684 pub fn prev_sibling_or_token(&self) -> Option<SyntaxElement> {
685 match self {
686 NodeOrToken::Node(it) => it.prev_sibling_or_token(),
687 NodeOrToken::Token(it) => it.prev_sibling_or_token(),
688 }
689 }
690
691 fn token_at_offset(&self, offset: TextSize) -> TokenAtOffset<SyntaxToken> {
692 assert!(self.text_range().start() <= offset && offset <= self.text_range().end());
693 match self {
694 NodeOrToken::Token(token) => TokenAtOffset::Single(token.clone()),
695 NodeOrToken::Node(node) => node.token_at_offset(offset),
696 }
697 }
698}
699
700#[derive(Clone, Debug)]
701struct Iter {
702 parent: SyntaxNode,
703 green: Children<'static>,
704 offset: TextSize,
705 index: u32,
706}
707
708impl Iter {
709 fn new(parent: SyntaxNode) -> Iter {
710 let offset = parent.text_range().start();
711 let green: Children<'_> = parent.green().children();
712 let green: Children<'static> =
715 unsafe { mem::transmute::<Children<'_>, Children<'static>>(green) };
716 Iter { parent, green, offset, index: 0 }
717 }
718
719 fn next(&mut self) -> Option<(GreenElementRef, u32, TextSize)> {
720 self.green.next().map(|element| {
721 let offset = self.offset;
722 let index = self.index;
723 self.offset += element.text_len();
724 self.index += 1;
725 (element, index, offset)
726 })
727 }
728}
729
730#[derive(Clone, Debug)]
731pub struct SyntaxNodeChildren(Iter);
732
733impl SyntaxNodeChildren {
734 fn new(parent: SyntaxNode) -> SyntaxNodeChildren {
735 SyntaxNodeChildren(Iter::new(parent))
736 }
737}
738
739impl Iterator for SyntaxNodeChildren {
740 type Item = SyntaxNode;
741 fn next(&mut self) -> Option<Self::Item> {
742 let parent = self.0.parent.clone();
743 while let Some((element, index, offset)) = self.0.next() {
744 if let Some(node) = element.as_node() {
745 return Some(SyntaxNode::new_child(node, parent, index, offset));
746 }
747 }
748 None
749 }
750}
751
752#[derive(Clone, Debug)]
753pub struct SyntaxElementChildren(Iter);
754
755impl SyntaxElementChildren {
756 fn new(parent: SyntaxNode) -> SyntaxElementChildren {
757 SyntaxElementChildren(Iter::new(parent))
758 }
759}
760
761impl Iterator for SyntaxElementChildren {
762 type Item = SyntaxElement;
763 fn next(&mut self) -> Option<Self::Item> {
764 let parent = self.0.parent.clone();
765 self.0.next().map(|(green, index, offset)| SyntaxElement::new(green, parent, index, offset))
766 }
767}
768
769impl GreenNode {
770 fn children_from(
771 &self,
772 start_index: usize,
773 mut offset: TextSize,
774 ) -> impl Iterator<Item = (GreenElementRef, (usize, TextSize))> {
775 self.children().skip(start_index).enumerate().map(move |(index, element)| {
776 let element_offset = offset;
777 offset += element.text_len();
778 (element, (start_index + index, element_offset))
779 })
780 }
781
782 fn children_to(
783 &self,
784 end_index: usize,
785 mut offset: TextSize,
786 ) -> impl Iterator<Item = (GreenElementRef, (usize, TextSize))> {
787 self.children().take(end_index).rev().enumerate().map(move |(index, element)| {
788 offset -= element.text_len();
789 (element, (end_index - index - 1, offset))
790 })
791 }
792}
793
794fn filter_nodes<'a, I: Iterator<Item = (GreenElementRef<'a>, T)>, T>(
795 iter: I,
796) -> impl Iterator<Item = (&'a GreenNode, T)> {
797 iter.filter_map(|(element, data)| match element {
798 NodeOrToken::Node(it) => Some((it, data)),
799 NodeOrToken::Token(_) => None,
800 })
801}