@@ -16,15 +16,12 @@ use ide_db::{
1616 defs:: { Definition , IdentClass } ,
1717 famous_defs:: FamousDefs ,
1818 helpers:: pick_best_token,
19+ syntax_helpers:: node_ext:: find_loops,
1920} ;
2021use itertools:: Itertools ;
2122use span:: FileId ;
2223use syntax:: {
23- AstNode , AstToken ,
24- SyntaxKind :: * ,
25- SyntaxNode , SyntaxToken , T , TextRange ,
26- ast:: { self , HasLoopBody } ,
27- match_ast,
24+ AstNode , AstToken , SyntaxKind :: * , SyntaxNode , SyntaxToken , T , TextRange , ast, match_ast,
2825} ;
2926
3027#[ derive( Debug ) ]
@@ -510,59 +507,13 @@ fn nav_for_branch_exit_points(
510507 Some ( navs)
511508}
512509
513- pub ( crate ) fn find_loops (
514- sema : & Semantics < ' _ , RootDatabase > ,
515- token : & SyntaxToken ,
516- ) -> Option < Vec < ast:: Expr > > {
517- let parent = token. parent ( ) ?;
518- let lbl = match_ast ! {
519- match parent {
520- ast:: BreakExpr ( break_) => break_. lifetime( ) ,
521- ast:: ContinueExpr ( continue_) => continue_. lifetime( ) ,
522- _ => None ,
523- }
524- } ;
525- let label_matches =
526- |it : Option < ast:: Label > | match ( lbl. as_ref ( ) , it. and_then ( |it| it. lifetime ( ) ) ) {
527- ( Some ( lbl) , Some ( it) ) => lbl. text ( ) == it. text ( ) ,
528- ( None , _) => true ,
529- ( Some ( _) , None ) => false ,
530- } ;
531-
532- let find_ancestors = |token : SyntaxToken | {
533- for anc in sema. token_ancestors_with_macros ( token) . filter_map ( ast:: Expr :: cast) {
534- let node = match & anc {
535- ast:: Expr :: LoopExpr ( loop_) if label_matches ( loop_. label ( ) ) => anc,
536- ast:: Expr :: WhileExpr ( while_) if label_matches ( while_. label ( ) ) => anc,
537- ast:: Expr :: ForExpr ( for_) if label_matches ( for_. label ( ) ) => anc,
538- ast:: Expr :: BlockExpr ( blk)
539- if blk. label ( ) . is_some ( ) && label_matches ( blk. label ( ) ) =>
540- {
541- anc
542- }
543- _ => continue ,
544- } ;
545-
546- return Some ( node) ;
547- }
548- None
549- } ;
550-
551- sema. descend_into_macros ( token. clone ( ) )
552- . into_iter ( )
553- . filter_map ( find_ancestors)
554- . collect_vec ( )
555- . into ( )
556- }
557-
558510fn nav_for_break_points (
559511 sema : & Semantics < ' _ , RootDatabase > ,
560512 token : & SyntaxToken ,
561513) -> Option < Vec < NavigationTarget > > {
562514 let db = sema. db ;
563515
564516 let navs = find_loops ( sema, token) ?
565- . into_iter ( )
566517 . filter_map ( |expr| {
567518 let file_id = sema. hir_file_for ( expr. syntax ( ) ) ;
568519 let expr_in_file = InFile :: new ( file_id, expr. clone ( ) ) ;
0 commit comments