@@ -7,6 +7,7 @@ use ide_db::{
7
7
} ,
8
8
} ;
9
9
use itertools:: Itertools ;
10
+ use stdx:: format_to;
10
11
use syntax:: { ast, AstNode , AstToken , NodeOrToken , SyntaxKind :: COMMA , TextRange } ;
11
12
12
13
// Assist: move_format_string_arg
@@ -78,20 +79,26 @@ pub(crate) fn move_format_string_arg(acc: &mut Assists, ctx: &AssistContext<'_>)
78
79
79
80
// Extract existing arguments in macro
80
81
let tokens =
81
- tt. token_trees_and_tokens ( ) . filter_map ( NodeOrToken :: into_token ) . collect_vec ( ) ;
82
+ tt. token_trees_and_tokens ( ) . collect_vec ( ) ;
82
83
83
84
let mut existing_args: Vec < String > = vec ! [ ] ;
84
85
85
86
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) ] =
87
88
tokens. as_slice ( )
88
89
{
89
90
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
+ } ,
95
102
}
96
103
}
97
104
existing_args. push ( current_arg. trim ( ) . into ( ) ) ;
@@ -261,6 +268,27 @@ fn main() {
261
268
fn main() {
262
269
print!("{} {:b} {}"$0, 1, x + 1, Struct(1, 2));
263
270
}
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
+ }
264
292
"# ,
265
293
) ,
266
294
) ;
0 commit comments