@@ -169,7 +169,11 @@ impl Document {
169169 } ;
170170
171171 Affected {
172- affected_range : TextRange :: new ( start, end. min ( content_size) ) ,
172+ affected_range : {
173+ let end = end. min ( content_size) ;
174+ TextRange :: new ( start. min ( end) , end)
175+ } ,
176+ // affected_range: TextRange::new(start, end.min(content_size)),
173177 affected_indices,
174178 prev_index,
175179 next_index,
@@ -273,7 +277,7 @@ impl Document {
273277 new_stmt_text : changed_content[ new_ranges[ 0 ] ] . to_string ( ) ,
274278 // change must be relative to the statement
275279 change_text : change. text . clone ( ) ,
276- change_range,
280+ change_range : change_range . sub ( old_range . start ( ) ) ,
277281 } ) ) ;
278282
279283 self . content = new_content;
@@ -863,4 +867,64 @@ mod tests {
863867
864868 assert_document_integrity ( & doc) ;
865869 }
870+
871+ #[ test]
872+ fn remove_outside_of_content ( ) {
873+ let path = PgLspPath :: new ( "test.sql" ) ;
874+ let input = "select id from contacts;\n \n select * from contacts;" ;
875+
876+ let mut d = Document :: new ( path. clone ( ) , input. to_string ( ) , 1 ) ;
877+
878+ assert_eq ! ( d. positions. len( ) , 2 ) ;
879+
880+ let change1 = ChangeFileParams {
881+ path : path. clone ( ) ,
882+ version : 2 ,
883+ changes : vec ! [ ChangeParams {
884+ text: "\n " . to_string( ) ,
885+ range: Some ( TextRange :: new( 49 . into( ) , 49 . into( ) ) ) ,
886+ } ] ,
887+ } ;
888+
889+ d. apply_file_change ( & change1) ;
890+
891+ assert_eq ! (
892+ d. content,
893+ "select id from contacts;\n \n select * from contacts;\n "
894+ ) ;
895+
896+ let change2 = ChangeFileParams {
897+ path : path. clone ( ) ,
898+ version : 3 ,
899+ changes : vec ! [ ChangeParams {
900+ text: "\n " . to_string( ) ,
901+ range: Some ( TextRange :: new( 50 . into( ) , 50 . into( ) ) ) ,
902+ } ] ,
903+ } ;
904+
905+ d. apply_file_change ( & change2) ;
906+
907+ assert_eq ! (
908+ d. content,
909+ "select id from contacts;\n \n select * from contacts;\n \n "
910+ ) ;
911+
912+ let change5 = ChangeFileParams {
913+ path : path. clone ( ) ,
914+ version : 6 ,
915+ changes : vec ! [ ChangeParams {
916+ text: "" . to_string( ) ,
917+ range: Some ( TextRange :: new( 51 . into( ) , 52 . into( ) ) ) ,
918+ } ] ,
919+ } ;
920+
921+ assert_eq ! ( d. apply_file_change( & change5) . len( ) , 0 ) ;
922+
923+ assert_eq ! (
924+ d. content,
925+ "select id from contacts;\n \n select * from contacts;\n \n "
926+ ) ;
927+
928+ assert_document_integrity ( & d) ;
929+ }
866930}
0 commit comments