Set fann for switches

This commit is contained in:
Gaith Hallak 2023-04-05 16:53:28 +03:00
parent f41e05928b
commit b69af9a499

View File

@ -1554,7 +1554,7 @@ simplify(Env, {proj, _, Var = {var, _, _}, I} = Expr) ->
end; end;
simplify(Env, {switch, FAnn, Split}) -> simplify(Env, {switch, FAnn, Split}) ->
case simpl_switch(Env, [], Split) of case simpl_switch(Env, FAnn, [], Split) of
nomatch -> {builtin, FAnn, abort, [{lit, FAnn, {string, <<"Incomplete patterns">>}}]}; nomatch -> {builtin, FAnn, abort, [{lit, FAnn, {string, <<"Incomplete patterns">>}}]};
Expr -> Expr Expr -> Expr
end; end;
@ -1605,11 +1605,11 @@ nest_catchalls([C = {'case', {var, _}, {nosplit, _}} | _]) -> C;
nest_catchalls([{'case', P = {var, _}, {split, Type, X, Alts}} | Catchalls]) -> nest_catchalls([{'case', P = {var, _}, {split, Type, X, Alts}} | Catchalls]) ->
{'case', P, {split, Type, X, add_catchalls(Alts, Catchalls)}}. {'case', P, {split, Type, X, add_catchalls(Alts, Catchalls)}}.
-spec simpl_switch(expr_env(), [fcase()], fsplit()) -> fexpr() | nomatch. -spec simpl_switch(expr_env(), fann(), [fcase()], fsplit()) -> fexpr() | nomatch.
simpl_switch(_Env, _, {nosplit, E}) -> E; simpl_switch(_Env, _FAnn, _, {nosplit, E}) -> E;
simpl_switch(Env, Catchalls, {split, Type, X, Alts}) -> simpl_switch(Env, FAnn, Catchalls, {split, Type, X, Alts}) ->
Alts1 = add_catchalls(Alts, Catchalls), Alts1 = add_catchalls(Alts, Catchalls),
Stuck = {switch, [], {split, Type, X, Alts1}}, Stuck = {switch, FAnn, {split, Type, X, Alts1}},
case constructor_form(Env, {var, [], X}) of case constructor_form(Env, {var, [], X}) of
false -> Stuck; false -> Stuck;
E -> simpl_case(Env, E, Alts1) E -> simpl_case(Env, E, Alts1)
@ -1622,7 +1622,7 @@ simpl_case(Env, E, [{'case', Pat, Body} | Alts]) ->
false -> simpl_case(Env, E, Alts); false -> simpl_case(Env, E, Alts);
Binds -> Binds ->
Env1 = maps:merge(Env, maps:from_list(Binds)), Env1 = maps:merge(Env, maps:from_list(Binds)),
case simpl_switch(Env1, get_catchalls(Alts), Body) of case simpl_switch(Env1, get_fann(E), get_catchalls(Alts), Body) of
nomatch -> simpl_case(Env, E, Alts); nomatch -> simpl_case(Env, E, Alts);
Body1 -> let_bind(Binds, Body1) Body1 -> let_bind(Binds, Body1)
end end