File tree Expand file tree Collapse file tree 2 files changed +51
-1
lines changed 
src/tools/rust-analyzer/crates/ide-completion/src Expand file tree Collapse file tree 2 files changed +51
-1
lines changed Original file line number Diff line number Diff line change @@ -269,6 +269,46 @@ fn main() {
269269"# , 
270270        ) ; 
271271
272+         check_edit ( 
273+             "else if" , 
274+             r#" 
275+ fn main() { 
276+     let x = if true { 
277+         () 
278+     } $0 else {}; 
279+ } 
280+ "# , 
281+             r#" 
282+ fn main() { 
283+     let x = if true { 
284+         () 
285+     } else if $1 { 
286+     $0 
287+ } else {}; 
288+ } 
289+ "# , 
290+         ) ; 
291+ 
292+         check_edit ( 
293+             "else if" , 
294+             r#" 
295+ fn main() { 
296+     let x = if true { 
297+         () 
298+     } $0 else if true {}; 
299+ } 
300+ "# , 
301+             r#" 
302+ fn main() { 
303+     let x = if true { 
304+         () 
305+     } else if $1 { 
306+     $0 
307+ } else if true {}; 
308+ } 
309+ "# , 
310+         ) ; 
311+ 
272312        check_edit ( 
273313            "else" , 
274314            r#" 
Original file line number Diff line number Diff line change @@ -970,6 +970,16 @@ fn classify_name_ref<'db>(
970970    let  after_incomplete_let = |node :  SyntaxNode | { 
971971        prev_expr ( node) . and_then ( |it| it. syntax ( ) . parent ( ) ) . and_then ( ast:: LetStmt :: cast) 
972972    } ; 
973+     let  before_else_kw = |node :  & SyntaxNode | { 
974+         node. parent ( ) 
975+             . and_then ( ast:: ExprStmt :: cast) 
976+             . filter ( |stmt| stmt. semicolon_token ( ) . is_none ( ) ) 
977+             . and_then ( |stmt| non_trivia_sibling ( stmt. syntax ( ) . clone ( ) . into ( ) ,  Direction :: Next ) ) 
978+             . and_then ( NodeOrToken :: into_node) 
979+             . filter ( |next| next. kind ( )  == SyntaxKind :: ERROR ) 
980+             . and_then ( |next| next. first_token ( ) ) 
981+             . is_some_and ( |token| token. kind ( )  == SyntaxKind :: ELSE_KW ) 
982+     } ; 
973983
974984    // We do not want to generate path completions when we are sandwiched between an item decl signature and its body. 
975985    // ex. trait Foo $0 {} 
@@ -1276,7 +1286,7 @@ fn classify_name_ref<'db>(
12761286            . parent ( ) 
12771287            . and_then ( ast:: LetStmt :: cast) 
12781288            . is_some_and ( |it| it. semicolon_token ( ) . is_none ( ) ) 
1279-             || after_incomplete_let && incomplete_expr_stmt. unwrap_or ( true ) ; 
1289+             || after_incomplete_let && incomplete_expr_stmt. unwrap_or ( true )  && ! before_else_kw ( it ) ; 
12801290        let  in_value = it. parent ( ) . and_then ( Either :: < ast:: LetStmt ,  ast:: ArgList > :: cast) . is_some ( ) ; 
12811291        let  impl_ = fetch_immediate_impl ( sema,  original_file,  expr. syntax ( ) ) ; 
12821292
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments