Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/generate_new.rs')
-rw-r--r--crates/ide-assists/src/handlers/generate_new.rs53
1 files changed, 5 insertions, 48 deletions
diff --git a/crates/ide-assists/src/handlers/generate_new.rs b/crates/ide-assists/src/handlers/generate_new.rs
index 85d450f7c9..4ed241f1af 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 @@ use crate::{
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<ast::Expr> {
- 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| {