@@ -11,7 +11,7 @@ use rowan::{GreenNodeData, GreenTokenData};
11
11
12
12
use crate :: {
13
13
ast:: { self , support, AstNode , AstToken , HasAttrs , HasGenericParams , HasName , SyntaxNode } ,
14
- NodeOrToken , SmolStr , SyntaxElement , SyntaxToken , TokenText , T ,
14
+ ted , NodeOrToken , SmolStr , SyntaxElement , SyntaxToken , TokenText , T ,
15
15
} ;
16
16
17
17
impl ast:: Lifetime {
@@ -310,6 +310,10 @@ impl ast::UseTree {
310
310
pub fn is_simple_path ( & self ) -> bool {
311
311
self . use_tree_list ( ) . is_none ( ) && self . star_token ( ) . is_none ( )
312
312
}
313
+
314
+ pub fn parent_use_tree_list ( & self ) -> Option < ast:: UseTreeList > {
315
+ self . syntax ( ) . parent ( ) . and_then ( ast:: UseTreeList :: cast)
316
+ }
313
317
}
314
318
315
319
impl ast:: UseTreeList {
@@ -327,6 +331,27 @@ impl ast::UseTreeList {
327
331
. find_map ( ast:: Comment :: cast)
328
332
. is_some ( )
329
333
}
334
+
335
+ /// Remove the unnecessary braces in current `UseTreeList`
336
+ pub fn remove_unnecessary_braces ( mut self ) {
337
+ let remove_brace_in_use_tree_list = |u : & ast:: UseTreeList | {
338
+ let use_tree_count = u. use_trees ( ) . count ( ) ;
339
+ if use_tree_count == 1 {
340
+ u. l_curly_token ( ) . map ( ted:: remove) ;
341
+ u. r_curly_token ( ) . map ( ted:: remove) ;
342
+ }
343
+ } ;
344
+
345
+ // take `use crate::{{{{A}}}}` for example
346
+ // the below remove the innermost {}, got `use crate::{{{A}}}`
347
+ remove_brace_in_use_tree_list ( & self ) ;
348
+
349
+ // the below remove othe unnecessary {}, got `use crate::A`
350
+ while let Some ( parent_use_tree_list) = self . parent_use_tree ( ) . parent_use_tree_list ( ) {
351
+ remove_brace_in_use_tree_list ( & parent_use_tree_list) ;
352
+ self = parent_use_tree_list;
353
+ }
354
+ }
330
355
}
331
356
332
357
impl ast:: Impl {
0 commit comments