1313// XXX: Resolver does not check for unused functions
1414use crate :: hir_def:: expr:: {
1515 HirArrayLiteral , HirBinaryOp , HirBlockExpression , HirCallExpression , HirCapturedVar ,
16- HirCastExpression , HirConstructorExpression , HirExpression , HirForExpression , HirIdent ,
17- HirIfExpression , HirIndexExpression , HirInfixExpression , HirLambda , HirLiteral ,
18- HirMemberAccess , HirMethodCallExpression , HirPrefixExpression ,
16+ HirCastExpression , HirConstructorExpression , HirExpression , HirIdent , HirIfExpression ,
17+ HirIndexExpression , HirInfixExpression , HirLambda , HirLiteral , HirMemberAccess ,
18+ HirMethodCallExpression , HirPrefixExpression ,
1919} ;
2020
2121use crate :: hir_def:: traits:: { Trait , TraitConstraint } ;
@@ -26,7 +26,7 @@ use std::rc::Rc;
2626
2727use crate :: graph:: CrateId ;
2828use crate :: hir:: def_map:: { LocalModuleId , ModuleDefId , TryFromModuleDefId , MAIN_FUNCTION } ;
29- use crate :: hir_def:: stmt:: { HirAssignStatement , HirLValue , HirPattern } ;
29+ use crate :: hir_def:: stmt:: { HirAssignStatement , HirForStatement , HirLValue , HirPattern } ;
3030use crate :: node_interner:: {
3131 DefinitionId , DefinitionKind , ExprId , FuncId , NodeInterner , StmtId , StructId , TraitId ,
3232} ;
@@ -957,6 +957,25 @@ impl<'a> Resolver<'a> {
957957 let stmt = HirAssignStatement { lvalue : identifier, expression } ;
958958 HirStatement :: Assign ( stmt)
959959 }
960+ Statement :: For ( for_loop) => {
961+ let start_range = self . resolve_expression ( for_loop. start_range ) ;
962+ let end_range = self . resolve_expression ( for_loop. end_range ) ;
963+ let ( identifier, block) = ( for_loop. identifier , for_loop. block ) ;
964+
965+ // TODO: For loop variables are currently mutable by default since we haven't
966+ // yet implemented syntax for them to be optionally mutable.
967+ let ( identifier, block) = self . in_new_scope ( |this| {
968+ let decl = this. add_variable_decl (
969+ identifier,
970+ false ,
971+ true ,
972+ DefinitionKind :: Local ( None ) ,
973+ ) ;
974+ ( decl, this. resolve_expression ( block) )
975+ } ) ;
976+
977+ HirStatement :: For ( HirForStatement { start_range, end_range, block, identifier } )
978+ }
960979 Statement :: Error => HirStatement :: Error ,
961980 }
962981 }
@@ -1169,30 +1188,6 @@ impl<'a> Resolver<'a> {
11691188 lhs : self . resolve_expression ( cast_expr. lhs ) ,
11701189 r#type : self . resolve_type ( cast_expr. r#type ) ,
11711190 } ) ,
1172- ExpressionKind :: For ( for_expr) => {
1173- let start_range = self . resolve_expression ( for_expr. start_range ) ;
1174- let end_range = self . resolve_expression ( for_expr. end_range ) ;
1175- let ( identifier, block) = ( for_expr. identifier , for_expr. block ) ;
1176-
1177- // TODO: For loop variables are currently mutable by default since we haven't
1178- // yet implemented syntax for them to be optionally mutable.
1179- let ( identifier, block_id) = self . in_new_scope ( |this| {
1180- let decl = this. add_variable_decl (
1181- identifier,
1182- false ,
1183- true ,
1184- DefinitionKind :: Local ( None ) ,
1185- ) ;
1186- ( decl, this. resolve_expression ( block) )
1187- } ) ;
1188-
1189- HirExpression :: For ( HirForExpression {
1190- start_range,
1191- end_range,
1192- block : block_id,
1193- identifier,
1194- } )
1195- }
11961191 ExpressionKind :: If ( if_expr) => HirExpression :: If ( HirIfExpression {
11971192 condition : self . resolve_expression ( if_expr. condition ) ,
11981193 consequence : self . resolve_expression ( if_expr. consequence ) ,
@@ -1738,7 +1733,7 @@ mod test {
17381733 let ( hir_func, _, _) = resolver. resolve_function ( func, id) ;
17391734
17401735 // Iterate over function statements and apply filtering function
1741- parse_statement_blocks (
1736+ find_lambda_captures (
17421737 hir_func. block ( & interner) . statements ( ) ,
17431738 & interner,
17441739 & mut all_captures,
@@ -1747,33 +1742,23 @@ mod test {
17471742 all_captures
17481743 }
17491744
1750- fn parse_statement_blocks (
1745+ fn find_lambda_captures (
17511746 stmts : & [ StmtId ] ,
17521747 interner : & NodeInterner ,
17531748 result : & mut Vec < Vec < String > > ,
17541749 ) {
1755- let mut expr: HirExpression ;
1756-
17571750 for stmt_id in stmts. iter ( ) {
17581751 let hir_stmt = interner. statement ( stmt_id) ;
1759- match hir_stmt {
1760- HirStatement :: Expression ( expr_id) => {
1761- expr = interner. expression ( & expr_id) ;
1762- }
1763- HirStatement :: Let ( let_stmt) => {
1764- expr = interner. expression ( & let_stmt. expression ) ;
1765- }
1766- HirStatement :: Assign ( assign_stmt) => {
1767- expr = interner. expression ( & assign_stmt. expression ) ;
1768- }
1769- HirStatement :: Constrain ( constr_stmt) => {
1770- expr = interner. expression ( & constr_stmt. 0 ) ;
1771- }
1772- HirStatement :: Semi ( semi_expr) => {
1773- expr = interner. expression ( & semi_expr) ;
1774- }
1752+ let expr_id = match hir_stmt {
1753+ HirStatement :: Expression ( expr_id) => expr_id,
1754+ HirStatement :: Let ( let_stmt) => let_stmt. expression ,
1755+ HirStatement :: Assign ( assign_stmt) => assign_stmt. expression ,
1756+ HirStatement :: Constrain ( constr_stmt) => constr_stmt. 0 ,
1757+ HirStatement :: Semi ( semi_expr) => semi_expr,
1758+ HirStatement :: For ( for_loop) => for_loop. block ,
17751759 HirStatement :: Error => panic ! ( "Invalid HirStatement!" ) ,
1776- }
1760+ } ;
1761+ let expr = interner. expression ( & expr_id) ;
17771762 get_lambda_captures ( expr, interner, result) ; // TODO: dyn filter function as parameter
17781763 }
17791764 }
@@ -1794,7 +1779,7 @@ mod test {
17941779 // Check for other captures recursively within the lambda body
17951780 let hir_body_expr = interner. expression ( & lambda_expr. body ) ;
17961781 if let HirExpression :: Block ( block_expr) = hir_body_expr {
1797- parse_statement_blocks ( block_expr. statements ( ) , interner, result) ;
1782+ find_lambda_captures ( block_expr. statements ( ) , interner, result) ;
17981783 }
17991784 }
18001785 }
0 commit comments