@@ -15,8 +15,8 @@ use itertools::Itertools;
15
15
use syntax:: {
16
16
AstNode , Edition , SyntaxElement , SyntaxKind , SyntaxNode , T ,
17
17
ast:: {
18
- self , CallExpr , HasArgList , HasAttrs , HasGenericParams , HasName , HasVisibility ,
19
- RecordExprField ,
18
+ self , CallExpr , HasArgList , HasAttrs , HasGenericArgs , HasGenericParams , HasName ,
19
+ HasVisibility , RecordExprField ,
20
20
edit:: { AstNodeEdit , IndentLevel } ,
21
21
make,
22
22
} ,
@@ -66,6 +66,7 @@ pub(crate) fn extract_struct_from_function_signature(
66
66
// TODO: special handling for destrutered types (or maybe just don't support code action on
67
67
// destructed types yet
68
68
69
+ // TODO: don't allow if there is impl traits
69
70
let field_list = make:: record_field_list (
70
71
used_param_list
71
72
. iter ( )
@@ -118,12 +119,11 @@ pub(crate) fn extract_struct_from_function_signature(
118
119
processed. into_iter ( ) . for_each ( |( path, node, import) | {
119
120
apply_references ( ctx. config . insert_use , path, node, import, edition, used_params_range. clone ( ) , & field_list,
120
121
name. clone ( ) ,
121
- new_lifetime_count
122
+ // new_lifetime_count
122
123
) ;
123
124
} ) ;
124
125
}
125
126
126
- // TODO: update calls to the function
127
127
tracing:: info!( "extract_struct_from_function_signature: starting edit" ) ;
128
128
builder. edit_file ( ctx. vfs_file_id ( ) ) ;
129
129
let fn_ast_mut = builder. make_mut ( fn_ast. clone ( ) ) ;
@@ -144,7 +144,7 @@ pub(crate) fn extract_struct_from_function_signature(
144
144
processed. into_iter ( ) . for_each ( |( path, node, import) | {
145
145
apply_references ( ctx. config . insert_use , path, node, import, edition, used_params_range. clone ( ) , & field_list,
146
146
name. clone ( ) ,
147
- new_lifetime_count
147
+ // new_lifetime_count
148
148
) ;
149
149
} ) ;
150
150
}
@@ -207,9 +207,10 @@ fn update_function(
207
207
used_param_list : & [ ast:: Param ] ,
208
208
new_lifetime_count : usize ,
209
209
) -> Option < ( ) > {
210
- // TODO: add new generics if needed
211
- let generic_args =
212
- generics. filter ( |generics| generics. generic_params ( ) . count ( ) > 0 ) . map ( |generics| {
210
+ let generic_args = generics
211
+ . filter ( |generics| generics. generic_params ( ) . count ( ) > 0 )
212
+ . or ( ( new_lifetime_count > 0 ) . then_some ( make:: generic_param_list ( std:: iter:: empty ( ) ) ) )
213
+ . map ( |generics| {
213
214
let args = generics. to_generic_args ( ) . clone_for_update ( ) ;
214
215
( 0 ..new_lifetime_count) . for_each ( |_| {
215
216
args. add_generic_arg (
@@ -490,14 +491,14 @@ fn reference_to_node(
490
491
sema : & hir:: Semantics < ' _ , RootDatabase > ,
491
492
reference : FileReference ,
492
493
) -> Option < ( ast:: PathSegment , SyntaxNode , hir:: Module ) > {
493
- // filter out the reference in macro
494
+ // filter out the reference in macro (seems to be probalamtic with lifetimes/generics arguments)
494
495
let segment =
495
496
reference. name . as_name_ref ( ) ?. syntax ( ) . parent ( ) . and_then ( ast:: PathSegment :: cast) ?;
496
497
497
- let segment_range = segment. syntax ( ) . text_range ( ) ;
498
- if segment_range != reference. range {
499
- return None ;
500
- }
498
+ // let segment_range = segment.syntax().text_range();
499
+ // if segment_range != reference.range {
500
+ // return None;
501
+ // }
501
502
502
503
let parent = segment. parent_path ( ) . syntax ( ) . parent ( ) ?;
503
504
let expr_or_pat = match_ast ! {
@@ -523,7 +524,7 @@ fn apply_references(
523
524
used_params_range : Range < usize > ,
524
525
field_list : & ast:: RecordFieldList ,
525
526
name : ast:: Name ,
526
- new_lifetime_count : usize ,
527
+ // new_lifetime_count: usize,
527
528
) -> Option < ( ) > {
528
529
if let Some ( ( scope, path) ) = import {
529
530
insert_use ( & scope, mod_path_to_ast ( & path, edition) , & insert_use_cfg) ;
@@ -540,6 +541,10 @@ fn apply_references(
540
541
// });
541
542
// }
542
543
544
+ // current idea: the lifetimes can be inferred from the call
545
+ if let Some ( generics) = segment. generic_arg_list ( ) {
546
+ ted:: remove ( generics. syntax ( ) ) ;
547
+ }
543
548
ted:: replace ( segment. name_ref ( ) ?. syntax ( ) , name. clone_for_update ( ) . syntax ( ) ) ;
544
549
// deep clone to prevent cycle
545
550
let path = make:: path_from_segments ( std:: iter:: once ( segment. clone_subtree ( ) ) , false ) ;
@@ -735,7 +740,7 @@ fn foo($0bar: &'_ i32$0, baz: i32) {}
735
740
r#"
736
741
struct FooStruct<'a>{ bar: &'a i32 }
737
742
738
- fn foo(FooStruct { bar, .. }: FooStruct, baz: i32) {}
743
+ fn foo(FooStruct { bar, .. }: FooStruct<'_> , baz: i32) {}
739
744
"# ,
740
745
) ;
741
746
}
0 commit comments