Skip to content

Commit 9c3a46a

Browse files
authored
Merge pull request #21154 from Veykril/push-nvlktkknrqms
proc-macro-srv: Fix unnecessary subtree wrapping in protocol
2 parents 2133d66 + be3ecb2 commit 9c3a46a

File tree

2 files changed

+42
-40
lines changed
  • crates
    • proc-macro-api/src/legacy_protocol/msg
    • proc-macro-srv/src

2 files changed

+42
-40
lines changed

crates/proc-macro-api/src/legacy_protocol/msg/flat.rs

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -216,16 +216,7 @@ impl FlatTree {
216216
text: Vec::new(),
217217
version,
218218
};
219-
let group = proc_macro_srv::Group {
220-
delimiter: proc_macro_srv::Delimiter::None,
221-
stream: Some(tokenstream),
222-
span: proc_macro_srv::DelimSpan {
223-
open: call_site,
224-
close: call_site,
225-
entire: call_site,
226-
},
227-
};
228-
w.write_tokenstream(&group);
219+
w.write_tokenstream(call_site, &tokenstream);
229220

230221
FlatTree {
231222
subtree: if version >= ENCODE_CLOSE_SPAN_VERSION {
@@ -267,16 +258,7 @@ impl FlatTree {
267258
text: Vec::new(),
268259
version,
269260
};
270-
let group = proc_macro_srv::Group {
271-
delimiter: proc_macro_srv::Delimiter::None,
272-
stream: Some(tokenstream),
273-
span: proc_macro_srv::DelimSpan {
274-
open: call_site,
275-
close: call_site,
276-
entire: call_site,
277-
},
278-
};
279-
w.write_tokenstream(&group);
261+
w.write_tokenstream(call_site, &tokenstream);
280262

281263
FlatTree {
282264
subtree: if version >= ENCODE_CLOSE_SPAN_VERSION {
@@ -491,7 +473,7 @@ impl SpanTransformer for Span {
491473
}
492474

493475
struct Writer<'a, 'span, S: SpanTransformer, W> {
494-
work: VecDeque<(usize, W)>,
476+
work: VecDeque<(usize, usize, W)>,
495477
string_table: FxHashMap<std::borrow::Cow<'a, str>, u32>,
496478
span_data_table: &'span mut S::Table,
497479
version: u32,
@@ -508,14 +490,13 @@ impl<'a, T: SpanTransformer> Writer<'a, '_, T, tt::iter::TtIter<'a, T::Span>> {
508490
fn write_subtree(&mut self, root: tt::SubtreeView<'a, T::Span>) {
509491
let subtree = root.top_subtree();
510492
self.enqueue(subtree, root.iter());
511-
while let Some((idx, subtree)) = self.work.pop_front() {
512-
self.subtree(idx, subtree);
493+
while let Some((idx, len, subtree)) = self.work.pop_front() {
494+
self.subtree(idx, len, subtree);
513495
}
514496
}
515497

516-
fn subtree(&mut self, idx: usize, subtree: tt::iter::TtIter<'a, T::Span>) {
498+
fn subtree(&mut self, idx: usize, n_tt: usize, subtree: tt::iter::TtIter<'a, T::Span>) {
517499
let mut first_tt = self.token_tree.len();
518-
let n_tt = subtree.clone().count(); // FIXME: `count()` walks over the entire iterator.
519500
self.token_tree.resize(first_tt + n_tt, !0);
520501

521502
self.subtree[idx].tt = [first_tt as u32, (first_tt + n_tt) as u32];
@@ -594,7 +575,8 @@ impl<'a, T: SpanTransformer> Writer<'a, '_, T, tt::iter::TtIter<'a, T::Span>> {
594575
let close = self.token_id_of(subtree.delimiter.close);
595576
let delimiter_kind = subtree.delimiter.kind;
596577
self.subtree.push(SubtreeRepr { open, close, kind: delimiter_kind, tt: [!0, !0] });
597-
self.work.push_back((idx, contents));
578+
// FIXME: `count()` walks over the entire iterator.
579+
self.work.push_back((idx, contents.clone().count(), contents));
598580
idx as u32
599581
}
600582
}
@@ -624,26 +606,43 @@ impl<'a, T: SpanTransformer, U> Writer<'a, '_, T, U> {
624606
}
625607

626608
#[cfg(feature = "sysroot-abi")]
627-
impl<'a, T: SpanTransformer> Writer<'a, '_, T, &'a proc_macro_srv::Group<T::Span>> {
628-
fn write_tokenstream(&mut self, root: &'a proc_macro_srv::Group<T::Span>) {
629-
self.enqueue_group(root);
630-
631-
while let Some((idx, group)) = self.work.pop_front() {
632-
self.group(idx, group);
609+
impl<'a, T: SpanTransformer>
610+
Writer<'a, '_, T, Option<proc_macro_srv::TokenStreamIter<'a, T::Span>>>
611+
{
612+
fn write_tokenstream(
613+
&mut self,
614+
call_site: T::Span,
615+
root: &'a proc_macro_srv::TokenStream<T::Span>,
616+
) {
617+
let call_site = self.token_id_of(call_site);
618+
self.subtree.push(SubtreeRepr {
619+
open: call_site,
620+
close: call_site,
621+
kind: tt::DelimiterKind::Invisible,
622+
tt: [!0, !0],
623+
});
624+
self.work.push_back((0, root.len(), Some(root.iter())));
625+
626+
while let Some((idx, len, group)) = self.work.pop_front() {
627+
self.group(idx, len, group);
633628
}
634629
}
635630

636-
fn group(&mut self, idx: usize, group: &'a proc_macro_srv::Group<T::Span>) {
631+
fn group(
632+
&mut self,
633+
idx: usize,
634+
n_tt: usize,
635+
group: Option<proc_macro_srv::TokenStreamIter<'a, T::Span>>,
636+
) {
637637
let mut first_tt = self.token_tree.len();
638-
let n_tt = group.stream.as_ref().map_or(0, |it| it.len());
639638
self.token_tree.resize(first_tt + n_tt, !0);
640639

641640
self.subtree[idx].tt = [first_tt as u32, (first_tt + n_tt) as u32];
642641

643-
for tt in group.stream.iter().flat_map(|it| it.iter()) {
642+
for tt in group.into_iter().flatten() {
644643
let idx_tag = match tt {
645644
proc_macro_srv::TokenTree::Group(group) => {
646-
let idx = self.enqueue_group(group);
645+
let idx = self.enqueue(group);
647646
idx << 2
648647
}
649648
proc_macro_srv::TokenTree::Literal(lit) => {
@@ -706,7 +705,7 @@ impl<'a, T: SpanTransformer> Writer<'a, '_, T, &'a proc_macro_srv::Group<T::Span
706705
}
707706
}
708707

709-
fn enqueue_group(&mut self, group: &'a proc_macro_srv::Group<T::Span>) -> u32 {
708+
fn enqueue(&mut self, group: &'a proc_macro_srv::Group<T::Span>) -> u32 {
710709
let idx = self.subtree.len();
711710
let open = self.token_id_of(group.span.open);
712711
let close = self.token_id_of(group.span.close);
@@ -717,7 +716,11 @@ impl<'a, T: SpanTransformer> Writer<'a, '_, T, &'a proc_macro_srv::Group<T::Span
717716
proc_macro_srv::Delimiter::None => tt::DelimiterKind::Invisible,
718717
};
719718
self.subtree.push(SubtreeRepr { open, close, kind: delimiter_kind, tt: [!0, !0] });
720-
self.work.push_back((idx, group));
719+
self.work.push_back((
720+
idx,
721+
group.stream.as_ref().map_or(0, |stream| stream.len()),
722+
group.stream.as_ref().map(|ts| ts.iter()),
723+
));
721724
idx as u32
722725
}
723726
}
@@ -959,7 +962,6 @@ impl<T: SpanTransformer> Reader<'_, T> {
959962
};
960963
res[i] = Some(g);
961964
}
962-
// FIXME: double check this
963965
proc_macro_srv::TokenStream::new(vec![proc_macro_srv::TokenTree::Group(
964966
res[0].take().unwrap(),
965967
)])

crates/proc-macro-srv/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ pub use proc_macro::Delimiter;
5656

5757
pub use crate::bridge::*;
5858
pub use crate::server_impl::literal_from_str;
59-
pub use crate::token_stream::{TokenStream, literal_to_string};
59+
pub use crate::token_stream::{TokenStream, TokenStreamIter, literal_to_string};
6060

6161
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
6262
pub enum ProcMacroKind {

0 commit comments

Comments
 (0)