mirror of
				https://github.com/rust-lang/rust-analyzer.git
				synced 2025-11-03 13:13:18 +00:00 
			
		
		
		
	Use struct init shorthand in fill struct fields assist
This commit is contained in:
		
							parent
							
								
									97409e5fc8
								
							
						
					
					
						commit
						dcd4157420
					
				@ -1,6 +1,7 @@
 | 
				
			|||||||
use either::Either;
 | 
					use either::Either;
 | 
				
			||||||
use hir::{db::AstDatabase, InFile};
 | 
					use hir::{db::AstDatabase, InFile};
 | 
				
			||||||
use ide_db::{assists::Assist, source_change::SourceChange};
 | 
					use ide_db::{assists::Assist, source_change::SourceChange};
 | 
				
			||||||
 | 
					use rustc_hash::FxHashMap;
 | 
				
			||||||
use stdx::format_to;
 | 
					use stdx::format_to;
 | 
				
			||||||
use syntax::{algo, ast::make, AstNode, SyntaxNodePtr};
 | 
					use syntax::{algo, ast::make, AstNode, SyntaxNodePtr};
 | 
				
			||||||
use text_edit::TextEdit;
 | 
					use text_edit::TextEdit;
 | 
				
			||||||
@ -54,9 +55,26 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Ass
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    let old_field_list = field_list_parent.record_expr_field_list()?;
 | 
					    let old_field_list = field_list_parent.record_expr_field_list()?;
 | 
				
			||||||
    let new_field_list = old_field_list.clone_for_update();
 | 
					    let new_field_list = old_field_list.clone_for_update();
 | 
				
			||||||
    for f in d.missed_fields.iter() {
 | 
					    let mut locals = FxHashMap::default();
 | 
				
			||||||
 | 
					    ctx.sema.scope(field_list_parent.syntax()).process_all_names(&mut |name, def| {
 | 
				
			||||||
 | 
					        if let hir::ScopeDef::Local(local) = def {
 | 
				
			||||||
 | 
					            locals.insert(name.clone(), local);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    let missing_fields = ctx.sema.record_literal_missing_fields(&field_list_parent);
 | 
				
			||||||
 | 
					    for (f, ty) in missing_fields.iter() {
 | 
				
			||||||
 | 
					        let field_expr = if let Some(local_candidate) = locals.get(&f.name(ctx.sema.db)) {
 | 
				
			||||||
 | 
					            let candidate_ty = local_candidate.ty(ctx.sema.db);
 | 
				
			||||||
 | 
					            if ty.could_unify_with(ctx.sema.db, &candidate_ty) {
 | 
				
			||||||
 | 
					                None
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                Some(make::expr_unit())
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            Some(make::expr_unit())
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
        let field =
 | 
					        let field =
 | 
				
			||||||
            make::record_expr_field(make::name_ref(&f.to_string()), Some(make::expr_unit()))
 | 
					            make::record_expr_field(make::name_ref(&f.name(ctx.sema.db).to_string()), field_expr)
 | 
				
			||||||
                .clone_for_update();
 | 
					                .clone_for_update();
 | 
				
			||||||
        new_field_list.add_field(field);
 | 
					        new_field_list.add_field(field);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user