Skip to content

Commit 3ad0334

Browse files
committed
Fix move_format_string_arg being tokentree unaware
1 parent 39eaf78 commit 3ad0334

File tree

1 file changed

+35
-7
lines changed

1 file changed

+35
-7
lines changed

crates/ide-assists/src/handlers/move_format_string_arg.rs

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use ide_db::{
77
},
88
};
99
use itertools::Itertools;
10+
use stdx::format_to;
1011
use syntax::{ast, AstNode, AstToken, NodeOrToken, SyntaxKind::COMMA, TextRange};
1112

1213
// Assist: move_format_string_arg
@@ -78,20 +79,26 @@ pub(crate) fn move_format_string_arg(acc: &mut Assists, ctx: &AssistContext<'_>)
7879

7980
// Extract existing arguments in macro
8081
let tokens =
81-
tt.token_trees_and_tokens().filter_map(NodeOrToken::into_token).collect_vec();
82+
tt.token_trees_and_tokens().collect_vec();
8283

8384
let mut existing_args: Vec<String> = vec![];
8485

8586
let mut current_arg = String::new();
86-
if let [_opening_bracket, format_string, _args_start_comma, tokens @ .., end_bracket] =
87+
if let [_opening_bracket, NodeOrToken::Token(format_string), _args_start_comma, tokens @ .., NodeOrToken::Token(end_bracket)] =
8788
tokens.as_slice()
8889
{
8990
for t in tokens {
90-
if t.kind() == COMMA {
91-
existing_args.push(current_arg.trim().into());
92-
current_arg.clear();
93-
} else {
94-
current_arg.push_str(t.text());
91+
match t {
92+
NodeOrToken::Node(n) => {
93+
format_to!(current_arg, "{n}");
94+
},
95+
NodeOrToken::Token(t) if t.kind() == COMMA=> {
96+
existing_args.push(current_arg.trim().into());
97+
current_arg.clear();
98+
},
99+
NodeOrToken::Token(t) => {
100+
current_arg.push_str(t.text());
101+
},
95102
}
96103
}
97104
existing_args.push(current_arg.trim().into());
@@ -261,6 +268,27 @@ fn main() {
261268
fn main() {
262269
print!("{} {:b} {}"$0, 1, x + 1, Struct(1, 2));
263270
}
271+
"#,
272+
),
273+
);
274+
}
275+
276+
#[test]
277+
fn nested_tt() {
278+
check_assist(
279+
move_format_string_arg,
280+
&add_macro_decl(
281+
r#"
282+
fn main() {
283+
print!("My name is {} {x$0 + x}", stringify!(Paperino))
284+
}
285+
"#,
286+
),
287+
&add_macro_decl(
288+
r#"
289+
fn main() {
290+
print!("My name is {} {}"$0, stringify!(Paperino), x + x)
291+
}
264292
"#,
265293
),
266294
);

0 commit comments

Comments
 (0)