Proper emit diagnostic without fix

This commit is contained in:
Edwin Cheng 2020-01-08 02:17:58 +08:00
parent e55e6da13a
commit a4c9babedb

View file

@ -64,30 +64,36 @@ pub(crate) fn diagnostics(db: &RootDatabase, file_id: FileId) -> Vec<Diagnostic>
}) })
}) })
.on::<hir::diagnostics::MissingFields, _>(|d| { .on::<hir::diagnostics::MissingFields, _>(|d| {
let mut field_list = d.ast(db);
for f in d.missed_fields.iter() {
// Note that although we could add a diagnostics to // Note that although we could add a diagnostics to
// fill the missing tuple field, e.g : // fill the missing tuple field, e.g :
// `struct A(usize);` // `struct A(usize);`
// `let a = A { 0: () }` // `let a = A { 0: () }`
// but it is uncommon usage and it should not be encouraged. // but it is uncommon usage and it should not be encouraged.
if f.as_tuple_index().is_some() { let fix = if d.missed_fields.iter().any(|it| it.as_tuple_index().is_some()) {
continue; None
} } else {
let field = make::record_field(make::name_ref(&f.to_string()), Some(make::expr_unit())); let mut field_list = d.ast(db);
for f in d.missed_fields.iter() {
let field =
make::record_field(make::name_ref(&f.to_string()), Some(make::expr_unit()));
field_list = field_list.append_field(&field); field_list = field_list.append_field(&field);
} }
let mut builder = TextEditBuilder::default(); let mut builder = TextEditBuilder::default();
algo::diff(&d.ast(db).syntax(), &field_list.syntax()).into_text_edit(&mut builder); algo::diff(&d.ast(db).syntax(), &field_list.syntax()).into_text_edit(&mut builder);
let fix = Some(SourceChange::source_file_edit_from(
SourceChange::source_file_edit_from("fill struct fields", file_id, builder.finish()); "fill struct fields",
file_id,
builder.finish(),
))
};
res.borrow_mut().push(Diagnostic { res.borrow_mut().push(Diagnostic {
range: d.highlight_range(), range: d.highlight_range(),
message: d.message(), message: d.message(),
severity: Severity::Error, severity: Severity::Error,
fix: Some(fix), fix,
}) })
}) })
.on::<hir::diagnostics::MissingOkInTailExpr, _>(|d| { .on::<hir::diagnostics::MissingOkInTailExpr, _>(|d| {