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.rs25
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
+ })
}
}