aboutsummaryrefslogtreecommitdiff
path: root/crates/assists/src/handlers/generate_new.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/assists/src/handlers/generate_new.rs')
-rw-r--r--crates/assists/src/handlers/generate_new.rs21
1 files changed, 7 insertions, 14 deletions
diff --git a/crates/assists/src/handlers/generate_new.rs b/crates/assists/src/handlers/generate_new.rs
index 84832273f..307f2e228 100644
--- a/crates/assists/src/handlers/generate_new.rs
+++ b/crates/assists/src/handlers/generate_new.rs
@@ -2,10 +2,13 @@ use itertools::Itertools;
2use stdx::format_to; 2use stdx::format_to;
3use syntax::{ 3use syntax::{
4 ast::{self, AstNode, GenericParamsOwner, NameOwner, StructKind, VisibilityOwner}, 4 ast::{self, AstNode, GenericParamsOwner, NameOwner, StructKind, VisibilityOwner},
5 SmolStr, T, 5 SmolStr,
6}; 6};
7 7
8use crate::{utils::find_struct_impl, AssistContext, AssistId, AssistKind, Assists}; 8use crate::{
9 utils::{find_impl_block, find_struct_impl},
10 AssistContext, AssistId, AssistKind, Assists,
11};
9 12
10// Assist: generate_new 13// Assist: generate_new
11// 14//
@@ -58,17 +61,7 @@ pub(crate) fn generate_new(acc: &mut Assists, ctx: &AssistContext) -> Option<()>
58 format_to!(buf, " {}fn new({}) -> Self {{ Self {{ {} }} }}", vis, params, fields); 61 format_to!(buf, " {}fn new({}) -> Self {{ Self {{ {} }} }}", vis, params, fields);
59 62
60 let start_offset = impl_def 63 let start_offset = impl_def
61 .and_then(|impl_def| { 64 .and_then(|impl_def| find_impl_block(impl_def, &mut buf))
62 buf.push('\n');
63 let start = impl_def
64 .syntax()
65 .descendants_with_tokens()
66 .find(|t| t.kind() == T!['{'])?
67 .text_range()
68 .end();
69
70 Some(start)
71 })
72 .unwrap_or_else(|| { 65 .unwrap_or_else(|| {
73 buf = generate_impl_text(&strukt, &buf); 66 buf = generate_impl_text(&strukt, &buf);
74 strukt.syntax().text_range().end() 67 strukt.syntax().text_range().end()
@@ -93,7 +86,7 @@ fn generate_impl_text(strukt: &ast::Struct, code: &str) -> String {
93 if let Some(type_params) = &type_params { 86 if let Some(type_params) = &type_params {
94 format_to!(buf, "{}", type_params.syntax()); 87 format_to!(buf, "{}", type_params.syntax());
95 } 88 }
96 buf.push_str(" "); 89 buf.push(' ');
97 buf.push_str(strukt.name().unwrap().text()); 90 buf.push_str(strukt.name().unwrap().text());
98 if let Some(type_params) = type_params { 91 if let Some(type_params) = type_params {
99 let lifetime_params = type_params 92 let lifetime_params = type_params