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.rs19
1 files changed, 19 insertions, 0 deletions
diff --git a/crates/tt/src/lib.rs b/crates/tt/src/lib.rs
index 916e00b73b..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 {