@@ -562,10 +562,10 @@ fn analyze<'db>(
562562/// Calculate the expected type and name of the cursor position.
563563fn expected_type_and_name < ' db > (
564564 sema : & Semantics < ' db , RootDatabase > ,
565- token : & SyntaxToken ,
565+ self_token : & SyntaxToken ,
566566 name_like : & ast:: NameLike ,
567567) -> ( Option < Type < ' db > > , Option < NameOrNameRef > ) {
568- let token = prev_special_biased_token_at_trivia ( token . clone ( ) ) ;
568+ let token = prev_special_biased_token_at_trivia ( self_token . clone ( ) ) ;
569569 let mut node = match token. parent ( ) {
570570 Some ( it) => it,
571571 None => return ( None , None ) ,
@@ -755,7 +755,15 @@ fn expected_type_and_name<'db>(
755755 . map( |c| ( Some ( c. return_type( ) ) , None ) )
756756 . unwrap_or( ( None , None ) )
757757 } ,
758- ast:: ParamList ( _) => ( None , None ) ,
758+ ast:: ParamList ( it) => {
759+ let closure = it. syntax( ) . parent( ) . and_then( ast:: ClosureExpr :: cast) ;
760+ let ty = closure
761+ . filter( |_| it. syntax( ) . text_range( ) . end( ) <= self_token. text_range( ) . start( ) )
762+ . and_then( |it| sema. type_of_expr( & it. into( ) ) ) ;
763+ ty. and_then( |ty| ty. original. as_callable( sema. db) )
764+ . map( |c| ( Some ( c. return_type( ) ) , None ) )
765+ . unwrap_or( ( None , None ) )
766+ } ,
759767 ast:: Stmt ( _) => ( None , None ) ,
760768 ast:: Item ( _) => ( None , None ) ,
761769 _ => {
@@ -1940,6 +1948,7 @@ fn prev_special_biased_token_at_trivia(mut token: SyntaxToken) -> SyntaxToken {
19401948 | T ! [ |=]
19411949 | T ! [ &=]
19421950 | T ! [ ^=]
1951+ | T ! [ |]
19431952 | T ! [ return ]
19441953 | T ! [ break ]
19451954 | T ! [ continue ] = prev. kind ( )
0 commit comments