@@ -15,7 +15,7 @@ use crate::{
1515 make:: { self , tokens} ,
1616 AstNode , GenericParamsOwner , NameOwner , TypeBoundsOwner ,
1717 } ,
18- AstToken , Direction , InsertPosition , SmolStr , SyntaxElement , SyntaxKind ,
18+ ted , AstToken , Direction , InsertPosition , NodeOrToken , SmolStr , SyntaxElement , SyntaxKind ,
1919 SyntaxKind :: { ATTR , COMMENT , WHITESPACE } ,
2020 SyntaxNode , SyntaxToken , T ,
2121} ;
@@ -588,37 +588,39 @@ impl IndentLevel {
588588 /// ```
589589 /// if you indent the block, the `{` token would stay put.
590590 fn increase_indent ( self , node : SyntaxNode ) -> SyntaxNode {
591- let mut rewriter = SyntaxRewriter :: default ( ) ;
592- node. descendants_with_tokens ( )
593- . filter_map ( |el| el. into_token ( ) )
594- . filter_map ( ast:: Whitespace :: cast)
595- . filter ( |ws| {
596- let text = ws. syntax ( ) . text ( ) ;
597- text. contains ( '\n' )
598- } )
599- . for_each ( |ws| {
600- let new_ws = make:: tokens:: whitespace ( & format ! ( "{}{}" , ws. syntax( ) , self , ) ) ;
601- rewriter. replace ( ws. syntax ( ) , & new_ws)
602- } ) ;
603- rewriter. rewrite ( & node)
591+ let res = node. clone_subtree ( ) . clone_for_update ( ) ;
592+ let tokens = res. preorder_with_tokens ( ) . filter_map ( |event| match event {
593+ rowan:: WalkEvent :: Leave ( NodeOrToken :: Token ( it) ) => Some ( it) ,
594+ _ => None ,
595+ } ) ;
596+ for token in tokens {
597+ if let Some ( ws) = ast:: Whitespace :: cast ( token) {
598+ if ws. text ( ) . contains ( '\n' ) {
599+ let new_ws = make:: tokens:: whitespace ( & format ! ( "{}{}" , ws. syntax( ) , self ) ) ;
600+ ted:: replace ( ws. syntax ( ) , & new_ws)
601+ }
602+ }
603+ }
604+ res. clone_subtree ( )
604605 }
605606
606607 fn decrease_indent ( self , node : SyntaxNode ) -> SyntaxNode {
607- let mut rewriter = SyntaxRewriter :: default ( ) ;
608- node. descendants_with_tokens ( )
609- . filter_map ( |el| el. into_token ( ) )
610- . filter_map ( ast:: Whitespace :: cast)
611- . filter ( |ws| {
612- let text = ws. syntax ( ) . text ( ) ;
613- text. contains ( '\n' )
614- } )
615- . for_each ( |ws| {
616- let new_ws = make:: tokens:: whitespace (
617- & ws. syntax ( ) . text ( ) . replace ( & format ! ( "\n {}" , self ) , "\n " ) ,
618- ) ;
619- rewriter. replace ( ws. syntax ( ) , & new_ws)
620- } ) ;
621- rewriter. rewrite ( & node)
608+ let res = node. clone_subtree ( ) . clone_for_update ( ) ;
609+ let tokens = res. preorder_with_tokens ( ) . filter_map ( |event| match event {
610+ rowan:: WalkEvent :: Leave ( NodeOrToken :: Token ( it) ) => Some ( it) ,
611+ _ => None ,
612+ } ) ;
613+ for token in tokens {
614+ if let Some ( ws) = ast:: Whitespace :: cast ( token) {
615+ if ws. text ( ) . contains ( '\n' ) {
616+ let new_ws = make:: tokens:: whitespace (
617+ & ws. syntax ( ) . text ( ) . replace ( & format ! ( "\n {}" , self ) , "\n " ) ,
618+ ) ;
619+ ted:: replace ( ws. syntax ( ) , & new_ws)
620+ }
621+ }
622+ }
623+ res. clone_subtree ( )
622624 }
623625}
624626
0 commit comments