@@ -7,7 +7,7 @@ use hir::{HirDisplay, Semantics};
7
7
use ide_db:: { FileRange , RootDatabase } ;
8
8
use span:: EditionedFileId ;
9
9
use syntax:: {
10
- ast:: { self , AstNode , HasName } ,
10
+ ast:: { self , AstNode , HasLoopBody , HasName } ,
11
11
match_ast, SyntaxKind , SyntaxNode , T ,
12
12
} ;
13
13
@@ -57,9 +57,30 @@ pub(super) fn hints(
57
57
// the actual number of lines in this case should be the line count of the parent BlockExpr,
58
58
// which the `min_lines` config cares about
59
59
node = node. parent ( ) ?;
60
- let block = label. syntax ( ) . parent ( ) . and_then ( ast:: BlockExpr :: cast) ?;
61
- closing_token = block. stmt_list ( ) ?. r_curly_token ( ) ?;
60
+
61
+ let parent = label. syntax ( ) . parent ( ) ?;
62
+ let block;
63
+ match_ast ! {
64
+ match parent {
65
+ ast:: BlockExpr ( block_expr) => {
66
+ block = block_expr. stmt_list( ) ?;
67
+ } ,
68
+ ast:: LoopExpr ( loop_expr) => {
69
+ block = loop_expr. loop_body( ) ?. stmt_list( ) ?;
70
+ } ,
71
+ ast:: WhileExpr ( while_expr) => {
72
+ block = while_expr. loop_body( ) ?. stmt_list( ) ?;
73
+ } ,
74
+ ast:: ForExpr ( for_expr) => {
75
+ block = for_expr. loop_body( ) ?. stmt_list( ) ?;
76
+ } ,
77
+ _ => return None ,
78
+ }
79
+ }
80
+ closing_token = block. r_curly_token ( ) ?;
81
+
62
82
let lifetime = label. lifetime ( ) . map_or_else ( String :: new, |it| it. to_string ( ) ) ;
83
+
63
84
( lifetime, Some ( label. syntax ( ) . text_range ( ) ) )
64
85
} else if let Some ( block) = ast:: BlockExpr :: cast ( node. clone ( ) ) {
65
86
closing_token = block. stmt_list ( ) ?. r_curly_token ( ) ?;
0 commit comments