@@ -480,18 +480,30 @@ impl<'a> CompletionContext<'a> {
480
480
} )
481
481
. unwrap_or( ( None , None ) )
482
482
} ,
483
- ast:: RecordExprFieldList ( _it) => {
484
- cov_mark:: hit!( expected_type_struct_field_without_leading_char) ;
483
+ ast:: RecordExprFieldList ( it) => {
485
484
// wouldn't try {} be nice...
486
485
( || {
487
- let expr_field = self . token. prev_sibling_or_token( ) ?
488
- . into_node( )
489
- . and_then( ast:: RecordExprField :: cast) ?;
490
- let ( _, _, ty) = self . sema. resolve_record_field( & expr_field) ?;
491
- Some ( (
492
- Some ( ty) ,
493
- expr_field. field_name( ) . map( NameOrNameRef :: NameRef ) ,
494
- ) )
486
+ if self . token. kind( ) == T ![ ..]
487
+ || self . token. prev_token( ) . map( |t| t. kind( ) ) == Some ( T ![ ..] )
488
+ {
489
+ cov_mark:: hit!( expected_type_struct_func_update) ;
490
+ let record_expr = it. syntax( ) . parent( ) . and_then( ast:: RecordExpr :: cast) ?;
491
+ let ty = self . sema. type_of_expr( & record_expr. into( ) ) ?;
492
+ Some ( (
493
+ Some ( ty. original) ,
494
+ None
495
+ ) )
496
+ } else {
497
+ cov_mark:: hit!( expected_type_struct_field_without_leading_char) ;
498
+ let expr_field = self . token. prev_sibling_or_token( ) ?
499
+ . into_node( )
500
+ . and_then( ast:: RecordExprField :: cast) ?;
501
+ let ( _, _, ty) = self . sema. resolve_record_field( & expr_field) ?;
502
+ Some ( (
503
+ Some ( ty) ,
504
+ expr_field. field_name( ) . map( NameOrNameRef :: NameRef ) ,
505
+ ) )
506
+ }
495
507
} ) ( ) . unwrap_or( ( None , None ) )
496
508
} ,
497
509
ast:: RecordExprField ( it) => {
@@ -533,6 +545,7 @@ impl<'a> CompletionContext<'a> {
533
545
. unwrap_or( ( None , None ) )
534
546
} ,
535
547
ast:: Stmt ( _it) => ( None , None ) ,
548
+ ast:: Item ( __) => ( None , None ) ,
536
549
_ => {
537
550
match node. parent( ) {
538
551
Some ( n) => {
@@ -1091,4 +1104,20 @@ impl<T> S<T> {
1091
1104
expect ! [ [ r#"ty: u32, name: t"# ] ] ,
1092
1105
) ;
1093
1106
}
1107
+
1108
+ #[ test]
1109
+ fn expected_type_functional_update ( ) {
1110
+ cov_mark:: check!( expected_type_struct_func_update) ;
1111
+ check_expected_type_and_name (
1112
+ r#"
1113
+ struct Foo { field: u32 }
1114
+ fn foo() {
1115
+ Foo {
1116
+ ..$0
1117
+ }
1118
+ }
1119
+ "# ,
1120
+ expect ! [ [ r#"ty: Foo, name: ?"# ] ] ,
1121
+ ) ;
1122
+ }
1094
1123
}
0 commit comments