@@ -38,7 +38,7 @@ pub fn gen_flow(
3838 let outer_env = generate ( expr_or_stmt, & env. raises_caught ( & raises) , ctx, constr) ?
3939 . raises_caught ( & raises_before) ;
4040
41- constrain_cases ( ast, cases, & outer_env, ctx, constr) ?;
41+ constrain_cases ( ast, & None , cases, & outer_env, ctx, constr) ?;
4242 Ok ( outer_env. clone ( ) )
4343 }
4444
@@ -83,7 +83,7 @@ pub fn gen_flow(
8383 Node :: Case { .. } => Err ( vec ! [ TypeErr :: new( ast. pos, "Case cannot be top level" ) ] ) ,
8484 Node :: Match { cond, cases } => {
8585 let outer_env = generate ( cond, env, ctx, constr) ?;
86- constrain_cases ( ast, cases, & outer_env, ctx, constr) ?;
86+ constrain_cases ( ast, & Some ( * cond . clone ( ) ) , cases, & outer_env, ctx, constr) ?;
8787 Ok ( env. clone ( ) )
8888 }
8989
@@ -116,7 +116,7 @@ pub fn gen_flow(
116116 }
117117}
118118
119- fn constrain_cases ( ast : & AST , cases : & Vec < AST > , env : & Environment , ctx : & Context , constr : & mut ConstrBuilder ) -> Constrained < ( ) > {
119+ fn constrain_cases ( ast : & AST , expr : & Option < AST > , cases : & Vec < AST > , env : & Environment , ctx : & Context , constr : & mut ConstrBuilder ) -> Constrained < ( ) > {
120120 let is_define_mode = env. is_def_mode ;
121121 let exp_ast = Expected :: try_from ( ( ast, & env. var_mappings ) ) ?;
122122
@@ -128,8 +128,17 @@ fn constrain_cases(ast: &AST, cases: &Vec<AST>, env: &Environment, ctx: &Context
128128 let cond_env = generate ( cond, & env. is_def_mode ( true ) , ctx, constr) ?;
129129 generate ( body, & cond_env. is_def_mode ( is_define_mode) , ctx, constr) ?;
130130
131+ if let Node :: ExpressionType { expr : ref cond, .. } = cond. node {
132+ if let Some ( expr) = expr {
133+ constr. add ( "match expression and arm condition" ,
134+ & Expected :: try_from ( ( expr, & env. var_mappings ) ) ?,
135+ & Expected :: try_from ( ( cond, & env. var_mappings ) ) ?,
136+ ) ;
137+ }
138+ }
139+
131140 let exp_body = Expected :: try_from ( ( body, & cond_env. var_mappings ) ) ?;
132- constr. add ( "handle arm body" , & exp_body, & exp_ast) ;
141+ constr. add ( "match arm body" , & exp_body, & exp_ast) ;
133142 constr. exit_set ( case. pos ) ?;
134143 }
135144 _ => return Err ( vec ! [ TypeErr :: new( case. pos, "Expected case" ) ] )
0 commit comments