@@ -149,8 +149,35 @@ pub(crate) fn generate_new(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option
149149 . clone_for_update ( ) ;
150150 fn_. indent ( 1 . into ( ) ) ;
151151
152- // Add a tabstop before the name
153152 if let Some ( cap) = ctx. config . snippet_cap {
153+ match strukt. kind ( ) {
154+ StructKind :: Tuple ( _) => {
155+ let struct_args = fn_
156+ . body ( )
157+ . unwrap ( )
158+ . syntax ( )
159+ . descendants ( )
160+ . filter ( |it| syntax:: ast:: ArgList :: can_cast ( it. kind ( ) ) )
161+ . flat_map ( |args| args. children ( ) )
162+ . filter ( |it| syntax:: ast:: PathExpr :: can_cast ( it. kind ( ) ) )
163+ . enumerate ( )
164+ . filter_map ( |( i, node) | {
165+ if trivial_constructors[ i] . is_none ( ) { Some ( node) } else { None }
166+ } ) ;
167+ if let Some ( fn_params) = fn_. param_list ( ) {
168+ for ( struct_arg, fn_param) in struct_args. zip ( fn_params. params ( ) ) {
169+ if let Some ( fn_pat) = fn_param. pat ( ) {
170+ let fn_pat = fn_pat. syntax ( ) . clone ( ) ;
171+ builder
172+ . add_placeholder_snippet_group ( cap, vec ! [ struct_arg, fn_pat] ) ;
173+ }
174+ }
175+ }
176+ }
177+ _ => { }
178+ }
179+
180+ // Add a tabstop before the name
154181 if let Some ( name) = fn_. name ( ) {
155182 builder. add_tabstop_before ( cap, name) ;
156183 }
@@ -765,8 +792,8 @@ struct Empty;
765792struct Foo(String, Empty);
766793
767794impl Foo {
768- fn $0new(_0 : String) -> Self {
769- Self(_0 , Empty)
795+ fn $0new(${1:_0} : String) -> Self {
796+ Self(${1:_0} , Empty)
770797 }
771798}
772799"# ,
@@ -805,8 +832,8 @@ struct Empty {}
805832struct Foo(Empty);
806833
807834impl Foo {
808- fn $0new(_0 : Empty) -> Self {
809- Self(_0 )
835+ fn $0new(${1:empty} : Empty) -> Self {
836+ Self(${1:empty} )
810837 }
811838}
812839"# ,
@@ -824,8 +851,8 @@ enum Empty { Bar {} }
824851struct Foo(Empty);
825852
826853impl Foo {
827- fn $0new(_0 : Empty) -> Self {
828- Self(_0 )
854+ fn $0new(${1:empty} : Empty) -> Self {
855+ Self(${1:empty} )
829856 }
830857}
831858"# ,
@@ -888,23 +915,25 @@ struct Foo(String$0);
888915struct Foo(String);
889916
890917impl Foo {
891- fn $0new(_0 : String) -> Self {
892- Self(_0 )
918+ fn $0new(${1:_0} : String) -> Self {
919+ Self(${1:_0} )
893920 }
894921}
895922"# ,
896923 ) ;
897924 check_assist (
898925 generate_new,
899926 r#"
927+ struct Vec<T> { };
900928struct Foo(String, Vec<i32>$0);
901929"# ,
902930 r#"
931+ struct Vec<T> { };
903932struct Foo(String, Vec<i32>);
904933
905934impl Foo {
906- fn $0new(_0 : String, _1 : Vec<i32>) -> Self {
907- Self(_0, _1 )
935+ fn $0new(${1:_0} : String, ${2:items} : Vec<i32>) -> Self {
936+ Self(${1:_0}, ${2:items} )
908937 }
909938}
910939"# ,
@@ -916,14 +945,16 @@ impl Foo {
916945 check_assist (
917946 generate_new,
918947 r#"
948+ struct Vec<T> { };
919949struct Foo(pub String, pub Vec<i32>$0);
920950"# ,
921951 r#"
952+ struct Vec<T> { };
922953struct Foo(pub String, pub Vec<i32>);
923954
924955impl Foo {
925- fn $0new(_0 : String, _1 : Vec<i32>) -> Self {
926- Self(_0, _1 )
956+ fn $0new(${1:_0} : String, ${2:items} : Vec<i32>) -> Self {
957+ Self(${1:_0}, ${2:items} )
927958 }
928959}
929960"# ,
@@ -1013,8 +1044,8 @@ impl<N: AstNode> AstId<N> {
10131044pub struct Source<T>(pub HirFileId, pub T);
10141045
10151046impl<T> Source<T> {
1016- pub fn $0new(_0 : HirFileId, _1 : T) -> Self {
1017- Self(_0, _1 )
1047+ pub fn $0new(${1:_0} : HirFileId, ${2:_1} : T) -> Self {
1048+ Self(${1:_0}, ${2:_1} )
10181049 }
10191050
10201051 pub fn map<F: FnOnce(T) -> U, U>(self, f: F) -> Source<U> {
0 commit comments