@@ -13,7 +13,7 @@ use syntax::{
1313 ast:: { self , make} ,
1414 AstNode , SyntaxNode , SyntaxNodePtr ,
1515} ;
16- use text_edit:: TextEdit ;
16+ use text_edit:: { TextEdit , TextRange } ;
1717
1818use crate :: { fix, Diagnostic , DiagnosticCode , DiagnosticsContext } ;
1919
@@ -59,18 +59,23 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Ass
5959
6060 let current_module =
6161 ctx. sema . scope ( d. field_list_parent . to_node ( & root) . syntax ( ) ) . map ( |it| it. module ( ) ) ;
62+ let range = InFile :: new ( d. file , d. field_list_parent . text_range ( ) )
63+ . original_node_file_range_rooted ( ctx. sema . db ) ;
6264
63- let build_text_edit = |parent_syntax , new_syntax : & SyntaxNode , old_syntax| {
65+ let build_text_edit = |new_syntax : & SyntaxNode , old_syntax| {
6466 let edit = {
67+ let old_range = ctx. sema . original_range_opt ( old_syntax) ?;
68+ if old_range. file_id != range. file_id {
69+ return None ;
70+ }
6571 let mut builder = TextEdit :: builder ( ) ;
6672 if d. file . is_macro ( ) {
6773 // we can't map the diff up into the macro input unfortunately, as the macro loses all
6874 // whitespace information so the diff wouldn't be applicable no matter what
6975 // This has the downside that the cursor will be moved in macros by doing it without a diff
7076 // but that is a trade off we can make.
7177 // FIXME: this also currently discards a lot of whitespace in the input... we really need a formatter here
72- let range = ctx. sema . original_range_opt ( old_syntax) ?;
73- builder. replace ( range. range , new_syntax. to_string ( ) ) ;
78+ builder. replace ( old_range. range , new_syntax. to_string ( ) ) ;
7479 } else {
7580 algo:: diff ( old_syntax, new_syntax) . into_text_edit ( & mut builder) ;
7681 }
@@ -79,8 +84,8 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Ass
7984 Some ( vec ! [ fix(
8085 "fill_missing_fields" ,
8186 "Fill struct fields" ,
82- SourceChange :: from_text_edit( d . file . original_file ( ctx . sema . db ) , edit) ,
83- ctx . sema . original_range ( parent_syntax ) . range,
87+ SourceChange :: from_text_edit( range . file_id , edit) ,
88+ range . range,
8489 ) ] )
8590 } ;
8691
@@ -143,11 +148,7 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Ass
143148 ) ;
144149 new_field_list. add_field ( field. clone_for_update ( ) ) ;
145150 }
146- build_text_edit (
147- field_list_parent. syntax ( ) ,
148- new_field_list. syntax ( ) ,
149- old_field_list. syntax ( ) ,
150- )
151+ build_text_edit ( new_field_list. syntax ( ) , old_field_list. syntax ( ) )
151152 }
152153 Either :: Right ( field_list_parent) => {
153154 let missing_fields = ctx. sema . record_pattern_missing_fields ( field_list_parent) ;
@@ -160,11 +161,7 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Ass
160161 ) ) ;
161162 new_field_list. add_field ( field. clone_for_update ( ) ) ;
162163 }
163- build_text_edit (
164- field_list_parent. syntax ( ) ,
165- new_field_list. syntax ( ) ,
166- old_field_list. syntax ( ) ,
167- )
164+ build_text_edit ( new_field_list. syntax ( ) , old_field_list. syntax ( ) )
168165 }
169166 }
170167}
0 commit comments