@@ -11,7 +11,7 @@ use rowan::{GreenNodeData, GreenTokenData};
1111
1212use crate :: {
1313 ast:: { self , support, AstNode , AstToken , HasAttrs , HasGenericParams , HasName , SyntaxNode } ,
14- NodeOrToken , SmolStr , SyntaxElement , SyntaxToken , TokenText , T ,
14+ ted , NodeOrToken , SmolStr , SyntaxElement , SyntaxToken , TokenText , T ,
1515} ;
1616
1717impl ast:: Lifetime {
@@ -310,6 +310,10 @@ impl ast::UseTree {
310310 pub fn is_simple_path ( & self ) -> bool {
311311 self . use_tree_list ( ) . is_none ( ) && self . star_token ( ) . is_none ( )
312312 }
313+
314+ pub fn parent_use_tree_list ( & self ) -> Option < ast:: UseTreeList > {
315+ self . syntax ( ) . parent ( ) . and_then ( ast:: UseTreeList :: cast)
316+ }
313317}
314318
315319impl ast:: UseTreeList {
@@ -327,6 +331,27 @@ impl ast::UseTreeList {
327331 . find_map ( ast:: Comment :: cast)
328332 . is_some ( )
329333 }
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+ }
330355}
331356
332357impl ast:: Impl {
0 commit comments