diff --git a/crates/ide-assists/src/handlers/generate_new.rs b/crates/ide-assists/src/handlers/generate_new.rs index 85d450f7c93..4ed241f1af5 100644 --- a/crates/ide-assists/src/handlers/generate_new.rs +++ b/crates/ide-assists/src/handlers/generate_new.rs @@ -1,4 +1,6 @@ -use ide_db::imports::import_assets::item_for_path_search; +use ide_db::{ + imports::import_assets::item_for_path_search, use_trivial_contructor::use_trivial_constructor, +}; use itertools::Itertools; use stdx::format_to; use syntax::ast::{self, AstNode, HasName, HasVisibility, StructKind}; @@ -8,51 +10,6 @@ AssistContext, AssistId, AssistKind, Assists, }; -// FIXME: how to depupicate with `ide-diagnostics/mssing_fields` -fn use_trivial_constructor( - db: &ide_db::RootDatabase, - path: ast::Path, - ty: &hir::Type, -) -> Option { - match ty.as_adt() { - Some(hir::Adt::Enum(x)) => { - let variants = x.variants(db); - - if variants.len() == 1 { - let variant = variants[0]; - - if variant.fields(db).is_empty() { - let path = ast::make::path_qualified( - path, - syntax::ast::make::path_segment(ast::make::name_ref( - &variant.name(db).to_smol_str(), - )), - ); - - let is_record = variant.kind(db) == hir::StructKind::Record; - - return Some(if is_record { - ast::Expr::RecordExpr(syntax::ast::make::record_expr( - path, - ast::make::record_expr_field_list(std::iter::empty()), - )) - } else { - syntax::ast::make::expr_path(path) - }); - } - } - } - Some(hir::Adt::Struct(x)) => { - if x.fields(db).is_empty() { - return Some(syntax::ast::make::expr_path(path)); - } - } - _ => {} - } - - None -} - // Assist: generate_new // // Adds a new inherent impl for a type. @@ -84,6 +41,8 @@ pub(crate) fn generate_new(acc: &mut Assists, ctx: &AssistContext) -> Option<()> // Return early if we've found an existing new fn let impl_def = find_struct_impl(ctx, &ast::Adt::Struct(strukt.clone()), "new")?; + let current_module = ctx.sema.scope(strukt.syntax())?.module(); + let target = strukt.syntax().text_range(); acc.add(AssistId("generate_new", AssistKind::Generate), "Generate `new`", target, |builder| { let mut buf = String::with_capacity(512); @@ -94,8 +53,6 @@ pub(crate) fn generate_new(acc: &mut Assists, ctx: &AssistContext) -> Option<()> let vis = strukt.visibility().map_or(String::new(), |v| format!("{} ", v)); - let current_module = ctx.sema.scope(strukt.syntax()).unwrap().module(); - let trivial_constructors = field_list .fields() .map(|f| { diff --git a/crates/ide-db/src/lib.rs b/crates/ide-db/src/lib.rs index 8fad4ac0f3c..165b98d72ed 100644 --- a/crates/ide-db/src/lib.rs +++ b/crates/ide-db/src/lib.rs @@ -20,6 +20,7 @@ pub mod symbol_index; pub mod traits; pub mod ty_filter; +pub mod use_trivial_contructor; pub mod imports { pub mod import_assets; diff --git a/crates/ide-diagnostics/src/handlers/missing_fields.rs b/crates/ide-diagnostics/src/handlers/missing_fields.rs index a27b3273bcc..828d9229821 100644 --- a/crates/ide-diagnostics/src/handlers/missing_fields.rs +++ b/crates/ide-diagnostics/src/handlers/missing_fields.rs @@ -5,7 +5,7 @@ }; use ide_db::{ assists::Assist, famous_defs::FamousDefs, imports::import_assets::item_for_path_search, - source_change::SourceChange, FxHashMap, + source_change::SourceChange, use_trivial_contructor::use_trivial_constructor, FxHashMap, }; use stdx::format_to; use syntax::{ @@ -17,51 +17,6 @@ use crate::{fix, Diagnostic, DiagnosticsContext}; -// FIXME: how to depupicate with `ide-assists/generate_new` -fn use_trivial_constructor( - db: &ide_db::RootDatabase, - path: ast::Path, - ty: &hir::Type, -) -> Option { - match ty.as_adt() { - Some(hir::Adt::Enum(x)) => { - let variants = x.variants(db); - - if variants.len() == 1 { - let variant = variants[0]; - - if variant.fields(db).is_empty() { - let path = ast::make::path_qualified( - path, - syntax::ast::make::path_segment(ast::make::name_ref( - &variant.name(db).to_smol_str(), - )), - ); - - let is_record = variant.kind(db) == hir::StructKind::Record; - - return Some(if is_record { - ast::Expr::RecordExpr(syntax::ast::make::record_expr( - path, - ast::make::record_expr_field_list(std::iter::empty()), - )) - } else { - syntax::ast::make::expr_path(path) - }); - } - } - } - Some(hir::Adt::Struct(x)) => { - if x.fields(db).is_empty() { - return Some(syntax::ast::make::expr_path(path)); - } - } - _ => {} - } - - None -} - // Diagnostic: missing-fields // // This diagnostic is triggered if record lacks some fields that exist in the corresponding structure. @@ -104,8 +59,8 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option ctx.sema.scope(ptr.to_node(&root).syntax()).unwrap().module(), - Either::Right(ptr) => ctx.sema.scope(ptr.to_node(&root).syntax()).unwrap().module(), + Either::Left(ptr) => ctx.sema.scope(ptr.to_node(&root).syntax()).map(|it| it.module()), + Either::Right(ptr) => ctx.sema.scope(ptr.to_node(&root).syntax()).map(|it| it.module()), }; let build_text_edit = |parent_syntax, new_syntax: &SyntaxNode, old_syntax| { @@ -166,7 +121,7 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option Option { let item_in_ns = hir::ItemInNs::from(hir::ModuleDef::from(ty.as_adt()?)); - let type_path = current_module.find_use_path( + let type_path = current_module?.find_use_path( ctx.sema.db, item_for_path_search(ctx.sema.db, item_in_ns)?, )?;