@@ -701,6 +701,62 @@ mod tests {
701701 expect. assert_eq ( & edit. new_root . to_string ( ) ) ;
702702 }
703703
704+ #[ test]
705+ fn test_dependent_change_prefers_nearest_changed_ancestor ( ) {
706+ let root = make:: block_expr (
707+ [ ] ,
708+ Some (
709+ make:: block_expr (
710+ [ make:: let_stmt (
711+ make:: ext:: simple_ident_pat ( make:: name ( "second" ) ) . into ( ) ,
712+ None ,
713+ Some ( make:: expr_literal ( "2" ) . into ( ) ) ,
714+ )
715+ . into ( ) ] ,
716+ None ,
717+ )
718+ . into ( ) ,
719+ ) ,
720+ ) ;
721+
722+ let ( editor, root) = SyntaxEditor :: with_ast_node ( & root) ;
723+ let make = editor. make ( ) ;
724+
725+ let inner_block =
726+ root. syntax ( ) . descendants ( ) . flat_map ( ast:: BlockExpr :: cast) . nth ( 1 ) . unwrap ( ) ;
727+
728+ let outer_replacement = make. block_expr ( [ ] , Some ( ast:: Expr :: BlockExpr ( root. clone ( ) ) ) ) ;
729+ let inner_replacement =
730+ make. block_expr ( [ ] , Some ( ast:: Expr :: BlockExpr ( inner_block. clone ( ) ) ) ) ;
731+
732+ let first_let = make. let_stmt (
733+ make:: ext:: simple_ident_pat ( make:: name ( "first" ) ) . into ( ) ,
734+ None ,
735+ Some ( make:: expr_literal ( "1" ) . into ( ) ) ,
736+ ) ;
737+
738+ editor. insert (
739+ Position :: first_child_of ( inner_block. stmt_list ( ) . unwrap ( ) . syntax ( ) ) ,
740+ first_let. syntax ( ) ,
741+ ) ;
742+ editor. replace ( inner_block. syntax ( ) , inner_replacement. syntax ( ) ) ;
743+ editor. replace ( root. syntax ( ) , outer_replacement. syntax ( ) ) ;
744+
745+ let edit = editor. finish ( ) ;
746+
747+ let expect = expect ! [ [ r#"
748+ {
749+ {
750+ {
751+ let first = 1;{
752+ let second = 2;
753+ }
754+ }
755+ }
756+ }"# ] ] ;
757+ expect. assert_eq ( & edit. new_root . to_string ( ) ) ;
758+ }
759+
704760 #[ test]
705761 fn test_replace_root_with_dependent ( ) {
706762 let root = make:: block_expr (
0 commit comments