11use std:: { iter, mem:: discriminant} ;
22
33use crate :: {
4- doc_links:: token_as_doc_comment, navigation_target:: ToNav , FilePosition , NavigationTarget ,
5- RangeInfo , TryToNav ,
4+ doc_links:: token_as_doc_comment,
5+ navigation_target:: { self , ToNav } ,
6+ FilePosition , NavigationTarget , RangeInfo , TryToNav , UpmappingResult ,
67} ;
78use hir:: {
8- AsAssocItem , AssocItem , DescendPreference , FileRange , InFile , MacroFileIdExt , ModuleDef , Semantics
9+ AsAssocItem , AssocItem , DescendPreference , FileRange , InFile , MacroFileIdExt , ModuleDef ,
10+ Semantics ,
911} ;
1012use ide_db:: {
1113 base_db:: { AnchoredPath , FileLoader } ,
1214 defs:: { Definition , IdentClass } ,
1315 helpers:: pick_best_token,
14- FileId , RootDatabase ,
16+ RootDatabase , SymbolKind ,
1517} ;
1618use itertools:: Itertools ;
1719
20+ use span:: FileId ;
1821use syntax:: {
1922 ast:: { self , HasLoopBody } ,
2023 match_ast, AstNode , AstToken ,
@@ -299,19 +302,19 @@ fn nav_for_exit_points(
299302 ast:: ClosureExpr ( c) => {
300303 let pipe_tok = c. param_list( ) . and_then( |it| it. pipe_token( ) ) ?. text_range( ) ;
301304 let closure_in_file = InFile :: new( file_id, c. into( ) ) ;
302- Some ( NavigationTarget :: from_expr ( db, closure_in_file, Some ( pipe_tok) ) )
305+ Some ( expr_to_nav ( db, closure_in_file, Some ( pipe_tok) ) )
303306 } ,
304307 ast:: BlockExpr ( blk) => {
305308 match blk. modifier( ) {
306309 Some ( ast:: BlockModifier :: Async ( _) ) => {
307310 let async_tok = blk. async_token( ) ?. text_range( ) ;
308311 let blk_in_file = InFile :: new( file_id, blk. into( ) ) ;
309- Some ( NavigationTarget :: from_expr ( db, blk_in_file, Some ( async_tok) ) )
312+ Some ( expr_to_nav ( db, blk_in_file, Some ( async_tok) ) )
310313 } ,
311314 Some ( ast:: BlockModifier :: Try ( _) ) if token_kind != T ![ return ] => {
312315 let try_tok = blk. try_token( ) ?. text_range( ) ;
313316 let blk_in_file = InFile :: new( file_id, blk. into( ) ) ;
314- Some ( NavigationTarget :: from_expr ( db, blk_in_file, Some ( try_tok) ) )
317+ Some ( expr_to_nav ( db, blk_in_file, Some ( try_tok) ) )
315318 } ,
316319 _ => None ,
317320 }
@@ -390,7 +393,7 @@ fn nav_for_break_points(
390393 ast:: Expr :: BlockExpr ( blk) => blk. label ( ) . unwrap ( ) . syntax ( ) . text_range ( ) ,
391394 _ => return None ,
392395 } ;
393- let nav = NavigationTarget :: from_expr ( db, expr_in_file, Some ( focus_range) ) ;
396+ let nav = expr_to_nav ( db, expr_in_file, Some ( focus_range) ) ;
394397 Some ( nav)
395398 } )
396399 . flatten ( )
@@ -403,6 +406,20 @@ fn def_to_nav(db: &RootDatabase, def: Definition) -> Vec<NavigationTarget> {
403406 def. try_to_nav ( db) . map ( |it| it. collect ( ) ) . unwrap_or_default ( )
404407}
405408
409+ fn expr_to_nav (
410+ db : & RootDatabase ,
411+ InFile { file_id, value } : InFile < ast:: Expr > ,
412+ focus_range : Option < TextRange > ,
413+ ) -> UpmappingResult < NavigationTarget > {
414+ let kind = SymbolKind :: Label ;
415+
416+ let value_range = value. syntax ( ) . text_range ( ) ;
417+ let navs = navigation_target:: orig_range_with_focus_r ( db, file_id, value_range, focus_range) ;
418+ navs. map ( |( hir:: FileRangeWrapper { file_id, range } , focus_range) | {
419+ NavigationTarget :: from_syntax ( file_id, "<expr>" . into ( ) , focus_range, range, kind)
420+ } )
421+ }
422+
406423#[ cfg( test) ]
407424mod tests {
408425 use ide_db:: FileRange ;
0 commit comments