@@ -285,7 +285,7 @@ fn peel_parens(mut expr: ast::Expr) -> ast::Expr {
285285/// In general that's true for any expression, but in some cases that would produce invalid code.
286286fn valid_target_expr ( node : SyntaxNode ) -> Option < ast:: Expr > {
287287 match node. kind ( ) {
288- SyntaxKind :: PATH_EXPR | SyntaxKind :: LOOP_EXPR => None ,
288+ SyntaxKind :: PATH_EXPR | SyntaxKind :: LOOP_EXPR | SyntaxKind :: LET_EXPR => None ,
289289 SyntaxKind :: BREAK_EXPR => ast:: BreakExpr :: cast ( node) . and_then ( |e| e. expr ( ) ) ,
290290 SyntaxKind :: RETURN_EXPR => ast:: ReturnExpr :: cast ( node) . and_then ( |e| e. expr ( ) ) ,
291291 SyntaxKind :: BLOCK_EXPR => {
@@ -1403,6 +1403,25 @@ fn main() {
14031403 ) ;
14041404 }
14051405
1406+ #[ test]
1407+ fn extract_var_let_expr ( ) {
1408+ check_assist_by_label (
1409+ extract_variable,
1410+ r#"
1411+ fn main() {
1412+ if $0let$0 Some(x) = Some(2+2) {}
1413+ }
1414+ "# ,
1415+ r#"
1416+ fn main() {
1417+ let $0var_name = Some(2+2);
1418+ if let Some(x) = var_name {}
1419+ }
1420+ "# ,
1421+ "Extract into variable" ,
1422+ ) ;
1423+ }
1424+
14061425 #[ test]
14071426 fn extract_var_for_cast ( ) {
14081427 check_assist_by_label (
@@ -1738,6 +1757,14 @@ fn main() {
17381757 check_assist_not_applicable ( extract_variable, "fn main() { loop { $0break$0; }; }" ) ;
17391758 }
17401759
1760+ #[ test]
1761+ fn extract_var_for_let_expr_not_applicable ( ) {
1762+ check_assist_not_applicable (
1763+ extract_variable,
1764+ "fn main() { if $0let Some(x) = Some(2+2) {} }" ,
1765+ ) ;
1766+ }
1767+
17411768 #[ test]
17421769 fn extract_var_unit_expr_not_applicable ( ) {
17431770 check_assist_not_applicable (
0 commit comments