@@ -412,45 +412,30 @@ pub(crate) fn find_branch_root(
412
412
sema : & Semantics < ' _ , RootDatabase > ,
413
413
token : & SyntaxToken ,
414
414
) -> Vec < SyntaxNode > {
415
- fn find_root (
416
- sema : & Semantics < ' _ , RootDatabase > ,
417
- token : & SyntaxToken ,
418
- pred : impl Fn ( SyntaxNode ) -> Option < SyntaxNode > ,
419
- ) -> Vec < SyntaxNode > {
420
- let mut result = Vec :: new ( ) ;
421
- for token in sema. descend_into_macros ( token. clone ( ) ) {
422
- for node in sema. token_ancestors_with_macros ( token) {
423
- if ast:: MacroCall :: can_cast ( node. kind ( ) ) {
424
- break ;
425
- }
426
-
427
- if let Some ( node) = pred ( node) {
428
- result. push ( node) ;
429
- break ;
430
- }
431
- }
432
- }
433
- result
434
- }
415
+ let find_nodes = |node_filter : fn ( SyntaxNode ) -> Option < SyntaxNode > | {
416
+ sema. descend_into_macros ( token. clone ( ) )
417
+ . into_iter ( )
418
+ . filter_map ( |token| node_filter ( token. parent ( ) ?) )
419
+ . collect_vec ( )
420
+ } ;
435
421
436
422
match token. kind ( ) {
437
- T ! [ match ] => {
438
- find_root ( sema, token, |node| Some ( ast:: MatchExpr :: cast ( node) ?. syntax ( ) . clone ( ) ) )
439
- }
440
- T ! [ =>] => find_root ( sema, token, |node| Some ( ast:: MatchArm :: cast ( node) ?. syntax ( ) . clone ( ) ) ) ,
441
- T ! [ if ] => find_root ( sema, token, |node| {
423
+ T ! [ match ] => find_nodes ( |node| Some ( ast:: MatchExpr :: cast ( node) ?. syntax ( ) . clone ( ) ) ) ,
424
+ T ! [ =>] => find_nodes ( |node| Some ( ast:: MatchArm :: cast ( node) ?. syntax ( ) . clone ( ) ) ) ,
425
+ T ! [ if ] => find_nodes ( |node| {
442
426
let if_expr = ast:: IfExpr :: cast ( node) ?;
443
427
444
- iter:: successors ( Some ( if_expr. clone ( ) ) , |if_expr| {
428
+ let root_if = iter:: successors ( Some ( if_expr. clone ( ) ) , |if_expr| {
445
429
let parent_if = if_expr. syntax ( ) . parent ( ) . and_then ( ast:: IfExpr :: cast) ?;
446
- if let ast:: ElseBranch :: IfExpr ( nested_if ) = parent_if. else_branch ( ) ? {
447
- ( nested_if . syntax ( ) == if_expr . syntax ( ) ) . then_some ( parent_if )
448
- } else {
449
- None
450
- }
430
+ let ast:: ElseBranch :: IfExpr ( else_branch ) = parent_if. else_branch ( ) ? else {
431
+ return None ;
432
+ } ;
433
+
434
+ ( else_branch . syntax ( ) == if_expr . syntax ( ) ) . then_some ( parent_if )
451
435
} )
452
- . last ( )
453
- . map ( |if_expr| if_expr. syntax ( ) . clone ( ) )
436
+ . last ( ) ?;
437
+
438
+ Some ( root_if. syntax ( ) . clone ( ) )
454
439
} ) ,
455
440
_ => vec ! [ ] ,
456
441
}
0 commit comments