Skip to content

Commit ed75d06

Browse files
committed
Auto merge of #83339 - Aaron1011:deep-recollect, r=petrochenkov
Perform 'deep recollection' in test helper macros Currently, the print helper macro performs 'recollection' by doing `token_stream.into_iter().collect()`. However, this will not affect nonterminals that occur nested inside delimited groups, since the wrapping delimited group will be left untouched. This commit adds 'deep recollection', which recursively recollects every delimited group in the token stream. As with normal recollection, we only print out something if deep recollection results in a different stringified token stream. This is useful for catching bugs where we update the AST of a nonterminal (which affects pretty-printing), but do not update the attatched `TokenStream`
2 parents bbf07c0 + 6d7294a commit ed75d06

File tree

3 files changed

+34
-1
lines changed

3 files changed

+34
-1
lines changed

src/test/ui/proc-macro/auxiliary/test-macros.rs

+32-1
Original file line numberDiff line numberDiff line change
@@ -83,21 +83,52 @@ fn print_helper(input: TokenStream, kind: &str) -> TokenStream {
8383
print_helper_ext(input, kind, true)
8484
}
8585

86+
fn deep_recollect(input: TokenStream) -> TokenStream {
87+
input.into_iter().map(|tree| {
88+
match tree {
89+
TokenTree::Group(group) => {
90+
let inner = deep_recollect(group.stream());
91+
let mut new_group = TokenTree::Group(
92+
proc_macro::Group::new(group.delimiter(), inner)
93+
);
94+
new_group.set_span(group.span());
95+
new_group
96+
}
97+
_ => tree,
98+
}
99+
}).collect()
100+
}
101+
86102
fn print_helper_ext(input: TokenStream, kind: &str, debug: bool) -> TokenStream {
87103
let input_display = format!("{}", input);
88104
let input_debug = format!("{:#?}", input);
89-
let recollected = input.into_iter().collect();
105+
let recollected = input.clone().into_iter().collect();
90106
let recollected_display = format!("{}", recollected);
91107
let recollected_debug = format!("{:#?}", recollected);
108+
109+
let deep_recollected = deep_recollect(input);
110+
let deep_recollected_display = format!("{}", deep_recollected);
111+
let deep_recollected_debug = format!("{:#?}", deep_recollected);
112+
113+
114+
92115
println!("PRINT-{} INPUT (DISPLAY): {}", kind, input_display);
93116
if recollected_display != input_display {
94117
println!("PRINT-{} RE-COLLECTED (DISPLAY): {}", kind, recollected_display);
95118
}
119+
120+
if deep_recollected_display != recollected_display {
121+
println!("PRINT-{} DEEP-RE-COLLECTED (DISPLAY): {}", kind, deep_recollected_display);
122+
}
123+
96124
if debug {
97125
println!("PRINT-{} INPUT (DEBUG): {}", kind, input_debug);
98126
if recollected_debug != input_debug {
99127
println!("PRINT-{} RE-COLLECTED (DEBUG): {}", kind, recollected_debug);
100128
}
129+
if deep_recollected_debug != recollected_debug {
130+
println!("PRINT-{} DEEP-RE-COLLETED (DEBUG): {}", kind, deep_recollected_debug);
131+
}
101132
}
102133
recollected
103134
}

src/test/ui/proc-macro/issue-78675-captured-inner-attrs.stdout

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
PRINT-BANG INPUT (DISPLAY): foo ! { #[fake_attr] mod bar {
22
#![doc = r" Foo"]
33
} }
4+
PRINT-BANG DEEP-RE-COLLECTED (DISPLAY): foo ! { #[fake_attr] mod bar { # ! [doc = r" Foo"] } }
45
PRINT-BANG INPUT (DEBUG): TokenStream [
56
Ident {
67
ident: "foo",

src/test/ui/proc-macro/nodelim-groups.stdout

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ PRINT-BANG INPUT (DEBUG): TokenStream [
7171
},
7272
]
7373
PRINT-BANG INPUT (DISPLAY): "hi" "hello".len() + "world".len() (1 + 1)
74+
PRINT-BANG DEEP-RE-COLLECTED (DISPLAY): "hi" "hello" . len() + "world" . len() (1 + 1)
7475
PRINT-BANG INPUT (DEBUG): TokenStream [
7576
Literal {
7677
kind: Str,

0 commit comments

Comments
 (0)