@@ -13,7 +13,7 @@ use syntax::{
13
13
ast:: { self , make} ,
14
14
AstNode , SyntaxNode , SyntaxNodePtr ,
15
15
} ;
16
- use text_edit:: TextEdit ;
16
+ use text_edit:: { TextEdit , TextRange } ;
17
17
18
18
use crate :: { fix, Diagnostic , DiagnosticCode , DiagnosticsContext } ;
19
19
@@ -59,18 +59,23 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Ass
59
59
60
60
let current_module =
61
61
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 ) ;
62
64
63
- let build_text_edit = |parent_syntax , new_syntax : & SyntaxNode , old_syntax| {
65
+ let build_text_edit = |new_syntax : & SyntaxNode , old_syntax| {
64
66
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
+ }
65
71
let mut builder = TextEdit :: builder ( ) ;
66
72
if d. file . is_macro ( ) {
67
73
// we can't map the diff up into the macro input unfortunately, as the macro loses all
68
74
// whitespace information so the diff wouldn't be applicable no matter what
69
75
// This has the downside that the cursor will be moved in macros by doing it without a diff
70
76
// but that is a trade off we can make.
71
77
// 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 ( ) ) ;
74
79
} else {
75
80
algo:: diff ( old_syntax, new_syntax) . into_text_edit ( & mut builder) ;
76
81
}
@@ -79,8 +84,8 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Ass
79
84
Some ( vec ! [ fix(
80
85
"fill_missing_fields" ,
81
86
"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,
84
89
) ] )
85
90
} ;
86
91
@@ -143,11 +148,7 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Ass
143
148
) ;
144
149
new_field_list. add_field ( field. clone_for_update ( ) ) ;
145
150
}
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 ( ) )
151
152
}
152
153
Either :: Right ( field_list_parent) => {
153
154
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
160
161
) ) ;
161
162
new_field_list. add_field ( field. clone_for_update ( ) ) ;
162
163
}
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 ( ) )
168
165
}
169
166
}
170
167
}
0 commit comments