@@ -16,7 +16,7 @@ use stdx::format_to;
1616use syntax:: {
1717 algo,
1818 ast:: { self , HasArgList } ,
19- match_ast, AstNode , Direction , SyntaxToken , TextRange , TextSize ,
19+ match_ast, AstNode , Direction , SyntaxElementChildren , SyntaxToken , TextRange , TextSize ,
2020} ;
2121
2222use crate :: RootDatabase ;
@@ -102,6 +102,14 @@ pub(crate) fn signature_help(db: &RootDatabase, position: FilePosition) -> Optio
102102 }
103103 return signature_help_for_record_lit( & sema, record, token) ;
104104 } ,
105+ ast:: RecordPat ( record) => {
106+ let cursor_outside = record. record_pat_field_list( ) . and_then( |list| list. r_curly_token( ) ) . as_ref( ) == Some ( & token) ;
107+ if cursor_outside {
108+ continue ;
109+ }
110+ return signature_help_for_record_pat( & sema, record, token) ;
111+ } ,
112+ ast:: TupleStructPat ( tuple_pat) => { } ,
105113 _ => ( ) ,
106114 }
107115 }
@@ -346,10 +354,27 @@ fn signature_help_for_record_lit(
346354 record : ast:: RecordExpr ,
347355 token : SyntaxToken ,
348356) -> Option < SignatureHelp > {
349- let active_parameter = record
350- . record_expr_field_list ( ) ?
351- . syntax ( )
352- . children_with_tokens ( )
357+ signature_help_for_record_ (
358+ sema,
359+ record. record_expr_field_list ( ) ?. syntax ( ) . children_with_tokens ( ) ,
360+ & record. path ( ) ?,
361+ record
362+ . record_expr_field_list ( ) ?
363+ . fields ( )
364+ . filter_map ( |field| sema. resolve_record_field ( & field) )
365+ . map ( |( field, _, ty) | ( field, ty) ) ,
366+ token,
367+ )
368+ }
369+
370+ fn signature_help_for_record_ (
371+ sema : & Semantics < ' _ , RootDatabase > ,
372+ field_list_children : SyntaxElementChildren ,
373+ path : & ast:: Path ,
374+ fields2 : impl Iterator < Item = ( hir:: Field , hir:: Type ) > ,
375+ token : SyntaxToken ,
376+ ) -> Option < SignatureHelp > {
377+ let active_parameter = field_list_children
353378 . filter_map ( syntax:: NodeOrToken :: into_token)
354379 . filter ( |t| t. kind ( ) == syntax:: T ![ , ] )
355380 . take_while ( |t| t. text_range ( ) . start ( ) <= token. text_range ( ) . start ( ) )
@@ -365,7 +390,7 @@ fn signature_help_for_record_lit(
365390 let fields;
366391
367392 let db = sema. db ;
368- let path_res = sema. resolve_path ( & record . path ( ) ? ) ?;
393+ let path_res = sema. resolve_path ( path) ?;
369394 if let PathResolution :: Def ( ModuleDef :: Variant ( variant) ) = path_res {
370395 fields = variant. fields ( db) ;
371396 let en = variant. parent_enum ( db) ;
@@ -397,8 +422,7 @@ fn signature_help_for_record_lit(
397422 let mut fields =
398423 fields. into_iter ( ) . map ( |field| ( field. name ( db) , Some ( field) ) ) . collect :: < FxIndexMap < _ , _ > > ( ) ;
399424 let mut buf = String :: new ( ) ;
400- for field in record. record_expr_field_list ( ) ?. fields ( ) {
401- let Some ( ( field, _, ty) ) = sema. resolve_record_field ( & field) else { continue } ;
425+ for ( field, ty) in fields2 {
402426 let name = field. name ( db) ;
403427 format_to ! ( buf, "{name}: {}" , ty. display_truncated( db, Some ( 20 ) ) ) ;
404428 res. push_record_field ( & buf) ;
@@ -418,6 +442,23 @@ fn signature_help_for_record_lit(
418442 Some ( res)
419443}
420444
445+ fn signature_help_for_record_pat (
446+ sema : & Semantics < ' _ , RootDatabase > ,
447+ record : ast:: RecordPat ,
448+ token : SyntaxToken ,
449+ ) -> Option < SignatureHelp > {
450+ signature_help_for_record_ (
451+ sema,
452+ record. record_pat_field_list ( ) ?. syntax ( ) . children_with_tokens ( ) ,
453+ & record. path ( ) ?,
454+ record
455+ . record_pat_field_list ( ) ?
456+ . fields ( )
457+ . filter_map ( |field| sema. resolve_record_pat_field ( & field) ) ,
458+ token,
459+ )
460+ }
461+
421462#[ cfg( test) ]
422463mod tests {
423464 use std:: iter;
@@ -1550,6 +1591,29 @@ impl S {
15501591 ) ;
15511592 }
15521593
1594+ #[ test]
1595+ fn record_pat ( ) {
1596+ check (
1597+ r#"
1598+ struct Strukt<T, U = ()> {
1599+ t: T,
1600+ u: U,
1601+ unit: (),
1602+ }
1603+ fn f() {
1604+ let Strukt {
1605+ u: 0,
1606+ $0
1607+ }
1608+ }
1609+ "# ,
1610+ expect ! [ [ r#"
1611+ struct Strukt { u: i32, t: T, unit: () }
1612+ ------ ^^^^ --------
1613+ "# ] ] ,
1614+ ) ;
1615+ }
1616+
15531617 #[ test]
15541618 fn test_enum_in_nested_method_in_lambda ( ) {
15551619 check (
0 commit comments