Skip to content

Commit 0e5d3b4

Browse files
committed
Fix incorrect range uses in missing_fields quick fixes
1 parent d252247 commit 0e5d3b4

File tree

1 file changed

+16
-19
lines changed

1 file changed

+16
-19
lines changed

crates/ide-diagnostics/src/handlers/missing_fields.rs

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1818
use crate::{fix, Diagnostic, DiagnosticCode, DiagnosticsContext};
1919

@@ -40,12 +40,17 @@ pub(crate) fn missing_fields(ctx: &DiagnosticsContext<'_>, d: &hir::MissingField
4040
.map(SyntaxNodePtr::from)
4141
.unwrap_or_else(|| d.field_list_parent.into()),
4242
);
43+
let range = ptr.value.text_range();
4344

4445
Diagnostic::new_with_syntax_node_ptr(ctx, DiagnosticCode::RustcHardError("E0063"), message, ptr)
45-
.with_fixes(fixes(ctx, d))
46+
.with_fixes(fixes(ctx, d, range))
4647
}
4748

48-
fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Assist>> {
49+
fn fixes(
50+
ctx: &DiagnosticsContext<'_>,
51+
d: &hir::MissingFields,
52+
range: TextRange,
53+
) -> Option<Vec<Assist>> {
4954
// Note that although we could add a diagnostics to
5055
// fill the missing tuple field, e.g :
5156
// `struct A(usize);`
@@ -60,27 +65,27 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Ass
6065
let current_module =
6166
ctx.sema.scope(d.field_list_parent.to_node(&root).syntax()).map(|it| it.module());
6267

63-
let build_text_edit = |parent_syntax, new_syntax: &SyntaxNode, old_syntax| {
64-
let edit = {
68+
let build_text_edit = |new_syntax: &SyntaxNode, old_syntax| {
69+
let (file_id, edit) = {
70+
let range = ctx.sema.original_range_opt(old_syntax)?;
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)?;
7378
builder.replace(range.range, new_syntax.to_string());
7479
} else {
7580
algo::diff(old_syntax, new_syntax).into_text_edit(&mut builder);
7681
}
77-
builder.finish()
82+
(range.file_id, builder.finish())
7883
};
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(file_id, edit),
88+
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

Comments
 (0)