Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/tt/src/lib.rs')
| -rw-r--r-- | crates/tt/src/lib.rs | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/crates/tt/src/lib.rs b/crates/tt/src/lib.rs index 1cfead54f1..36ccb67f3b 100644 --- a/crates/tt/src/lib.rs +++ b/crates/tt/src/lib.rs @@ -22,6 +22,8 @@ use stdx::{impl_from, itertools::Itertools as _}; pub use text_size::{TextRange, TextSize}; +pub const MAX_GLUED_PUNCT_LEN: usize = 3; + #[derive(Clone, PartialEq, Debug)] pub struct Lit { pub kind: LitKind, @@ -243,6 +245,23 @@ impl<S: Copy> TopSubtreeBuilder<S> { self.token_trees.extend(tt.0.iter().cloned()); } + /// Like [`Self::extend_with_tt()`], but makes sure the new tokens will never be + /// joint with whatever comes after them. + pub fn extend_with_tt_alone(&mut self, tt: TokenTreesView<'_, S>) { + if let Some((last, before_last)) = tt.0.split_last() { + self.token_trees.reserve(tt.0.len()); + self.token_trees.extend(before_last.iter().cloned()); + let last = if let TokenTree::Leaf(Leaf::Punct(last)) = last { + let mut last = *last; + last.spacing = Spacing::Alone; + TokenTree::Leaf(Leaf::Punct(last)) + } else { + last.clone() + }; + self.token_trees.push(last); + } + } + pub fn expected_delimiters(&self) -> impl Iterator<Item = &Delimiter<S>> { self.unclosed_subtree_indices.iter().rev().map(|&subtree_idx| { let TokenTree::Subtree(subtree) = &self.token_trees[subtree_idx] else { @@ -363,7 +382,8 @@ impl<'a, S: Copy> TokenTreesView<'a, S> { ) -> impl Iterator<Item = TokenTreesView<'a, S>> { let mut subtree_iter = self.iter(); let mut need_to_yield_even_if_empty = true; - let result = std::iter::from_fn(move || { + + std::iter::from_fn(move || { if subtree_iter.is_empty() && !need_to_yield_even_if_empty { return None; }; @@ -379,8 +399,7 @@ impl<'a, S: Copy> TokenTreesView<'a, S> { result = subtree_iter.from_savepoint(savepoint); } Some(result) - }); - result + }) } } |