|
1 | 1 | use either::Either; |
2 | 2 | use hir::{db::AstDatabase, InFile}; |
3 | 3 | use ide_db::{assists::Assist, source_change::SourceChange}; |
| 4 | +use rustc_hash::FxHashMap; |
4 | 5 | use stdx::format_to; |
5 | 6 | use syntax::{algo, ast::make, AstNode, SyntaxNodePtr}; |
6 | 7 | use text_edit::TextEdit; |
@@ -54,9 +55,26 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Ass |
54 | 55 | }; |
55 | 56 | let old_field_list = field_list_parent.record_expr_field_list()?; |
56 | 57 | let new_field_list = old_field_list.clone_for_update(); |
57 | | - for f in d.missed_fields.iter() { |
| 58 | + let mut locals = FxHashMap::default(); |
| 59 | + ctx.sema.scope(field_list_parent.syntax()).process_all_names(&mut |name, def| { |
| 60 | + if let hir::ScopeDef::Local(local) = def { |
| 61 | + locals.insert(name.clone(), local); |
| 62 | + } |
| 63 | + }); |
| 64 | + let missing_fields = ctx.sema.record_literal_missing_fields(&field_list_parent); |
| 65 | + for (f, ty) in missing_fields.iter() { |
| 66 | + let field_expr = if let Some(local_candidate) = locals.get(&f.name(ctx.sema.db)) { |
| 67 | + let candidate_ty = local_candidate.ty(ctx.sema.db); |
| 68 | + if ty.could_unify_with(ctx.sema.db, &candidate_ty) { |
| 69 | + None |
| 70 | + } else { |
| 71 | + Some(make::expr_unit()) |
| 72 | + } |
| 73 | + } else { |
| 74 | + Some(make::expr_unit()) |
| 75 | + }; |
58 | 76 | let field = |
59 | | - make::record_expr_field(make::name_ref(&f.to_string()), Some(make::expr_unit())) |
| 77 | + make::record_expr_field(make::name_ref(&f.name(ctx.sema.db).to_string()), field_expr) |
60 | 78 | .clone_for_update(); |
61 | 79 | new_field_list.add_field(field); |
62 | 80 | } |
|
0 commit comments