@@ -559,7 +559,7 @@ fn expected_type_and_name<'db>(
559559 token : & SyntaxToken ,
560560 name_like : & ast:: NameLike ,
561561) -> ( Option < Type < ' db > > , Option < NameOrNameRef > ) {
562- let token = prev_assign_token_at_trivia ( token. clone ( ) ) ;
562+ let token = prev_special_biased_token_at_trivia ( token. clone ( ) ) ;
563563 let mut node = match token. parent ( ) {
564564 Some ( it) => it,
565565 None => return ( None , None ) ,
@@ -724,6 +724,18 @@ fn expected_type_and_name<'db>(
724724 let def = sema. to_def( & it) ;
725725 ( def. map( |def| def. ret_type( sema. db) ) , None )
726726 } ,
727+ ast:: ReturnExpr ( it) => {
728+ let fn_ = sema. ancestors_with_macros( it. syntax( ) . clone( ) )
729+ . find_map( Either :: <ast:: Fn , ast:: ClosureExpr >:: cast) ;
730+ let ty = fn_. and_then( |f| match f {
731+ Either :: Left ( f) => Some ( sema. to_def( & f) ?. ret_type( sema. db) ) ,
732+ Either :: Right ( f) => {
733+ let ty = sema. type_of_expr( & f. into( ) ) ?. original. as_callable( sema. db) ?;
734+ Some ( ty. return_type( ) )
735+ } ,
736+ } ) ;
737+ ( ty, None )
738+ } ,
727739 ast:: ClosureExpr ( it) => {
728740 let ty = sema. type_of_expr( & it. into( ) ) ;
729741 ty. and_then( |ty| ty. original. as_callable( sema. db) )
@@ -1877,7 +1889,7 @@ fn next_non_trivia_sibling(ele: SyntaxElement) -> Option<SyntaxElement> {
18771889 None
18781890}
18791891
1880- fn prev_assign_token_at_trivia ( mut token : SyntaxToken ) -> SyntaxToken {
1892+ fn prev_special_biased_token_at_trivia ( mut token : SyntaxToken ) -> SyntaxToken {
18811893 while token. kind ( ) . is_trivia ( )
18821894 && let Some ( prev) = token. prev_token ( )
18831895 && let T ! [ =]
@@ -1890,7 +1902,10 @@ fn prev_assign_token_at_trivia(mut token: SyntaxToken) -> SyntaxToken {
18901902 | T ! [ -=]
18911903 | T ! [ |=]
18921904 | T ! [ &=]
1893- | T ! [ ^=] = prev. kind ( )
1905+ | T ! [ ^=]
1906+ | T ! [ return ]
1907+ | T ! [ break ]
1908+ | T ! [ continue ] = prev. kind ( )
18941909 {
18951910 token = prev
18961911 }
0 commit comments