diff --git a/src/pt_lazy_case.erl b/src/pt_lazy_case.erl index a939dd8..71f349c 100644 --- a/src/pt_lazy_case.erl +++ b/src/pt_lazy_case.erl @@ -83,13 +83,16 @@ replace_line_ast(V1) -> parser_case([{atom, Line, '@lazy_case'} | TailAST], File) -> case TailAST of [{match, L, V, {'case', _, _, _} = CaseAST} | TailAST2] -> - [{match, L, V, replace_case(parser_case(CaseAST, File), File)} | TailAST2]; + NewData = create_case(replace_case(parser_case(CaseAST, File), File), L), + [{match, L, V, NewData} | TailAST2]; {match, L, V, {'case', _, _, _} = CaseAST} -> - {match, L, V, replace_case(parser_case(CaseAST, File), File)}; - [{'case', _, _, _} | _] -> - replace_case(parser_case(TailAST, File), File); - {'case', _, _, _} -> - replace_case(parser_case(TailAST, File), File); + NewData = create_case(replace_case(parser_case(CaseAST, File), File), L), + {match, L, V, NewData}; + [{'case', L, _, _} = CaseAST | TailAST2] -> + NewData = create_case(replace_case(parser_case(CaseAST, File), File), L), + [NewData | TailAST2]; + {'case', L, _, _} = CaseAST -> + create_case(replace_case(parser_case(CaseAST, File), File), L); _ -> {ok, Cwd} = file:get_cwd(), FullFile = filename:join(Cwd, File), @@ -117,6 +120,11 @@ parser_case([V1 | TailAST], File) -> parser_case(Data, _) -> Data. +create_case({'case', _, _, _} = Data, _) -> + Data; +create_case(Data, L) -> + {'case', L, {nil, L}, [{clause, L, [{nil, L}], [], Data}]}. + parse_clause([{clause, V1, [{var, V2, D1}], Guard, _} = Data | TailASTClause], OtherAST, AccGuard) -> case {TailASTClause, Guard} of {[], []} -> @@ -164,7 +172,7 @@ parse_clause(_, Acc, OtherAST, _, _) -> parse_tuple(HeadAstTuple, ListASTClause, [], V1, _) -> NewListASTClause = parse_clause(ListASTClause, [], []), OffRepeateASTClause = delete_repeate(NewListASTClause, []), - case check_load_code(OffRepeateASTClause) of + case check_load_code(OffRepeateASTClause, HeadAstTuple) of false -> {'case', V1, HeadAstTuple, OffRepeateASTClause}; {true, Data} -> @@ -179,7 +187,7 @@ parse_tuple(HeadAstTuple, ListASTClause, TailAstTuple, V1, File) -> OffRepeateASTClause = delete_repeate(create_new_case(NewListASTClause, CountElems, TailAstTuple, [], V1), []), NewCase = {'case', V1, HeadAstTuple, OffRepeateASTClause}, ChangeCase = parser_case(NewCase, File), - case check_load_code(ChangeCase) of + case check_load_code(ChangeCase, HeadAstTuple) of false -> ChangeCase; {true, Data} -> @@ -297,14 +305,17 @@ check_guard(Guard, [Guard | _], _) -> check_guard(Guard, [HeadGuard | TailGuard], Acc) -> check_guard(Guard, TailGuard, [HeadGuard | Acc]); check_guard(Guard, _, Acc) -> - {true, [Guard | Acc]}. -check_load_code({'case', _, _, [{clause, _, [{var, _, _}], _, D3} | _]}) -> +check_load_code({'case', _, _, [{clause, _, [{var, _, '_'}], _, D3} | _]}, _HeadAstTuple) -> {true, D3}; -check_load_code([{clause, _, [{var, _, _}], _, D3} | _]) -> +check_load_code([{clause, _, [{var, _, '_'}], _, D3} | _], _HeadAstTuple) -> {true, D3}; -check_load_code(_) -> +check_load_code({'case', _, _, [{clause, _, [{var, Line, Var}], _, D3} | _]}, HeadAstTuple) -> + {true, [{match, Line, {var, Line, Var}, HeadAstTuple} | D3]}; +check_load_code([{clause, _, [{var, Line, Var}], _, D3} | _], HeadAstTuple) -> + {true, [{match, Line, {var, Line, Var}, HeadAstTuple} | D3]}; +check_load_code(_, _) -> false. delete_repeate([{clause, _, Data1, Guard1, _} = HeadASTClause | TailASTClause], Acc) -> diff --git a/test/pt_lazy_case_tests.erl b/test/pt_lazy_case_tests.erl index 0bdd2f9..ebddec6 100644 --- a/test/pt_lazy_case_tests.erl +++ b/test/pt_lazy_case_tests.erl @@ -19,7 +19,10 @@ pt_lazy_case_test_() -> ?_test(ok = lazy_case_test3()), ?_test(ok = lazy_case_test4()), ?_test(ok = lazy_case_test5()), - ?_test(ok = lazy_case_test6()) + ?_test(ok = lazy_case_test6()), + ?_test(ok = lazy_case_test7()), + ?_test(ok = lazy_case_test8()), + ?_test(ok = lazy_case_test9()) ]. lazy_case_test1() -> @@ -109,3 +112,29 @@ lazy_case_test6() -> {_V, _} -> ?assert(false) end, X. + +lazy_case_test7() -> + '@lazy_case', + X = + case {[], ok} of + {[], _V} -> _V; + {_V, _} -> ?assert(false) + end, + X. + +lazy_case_test8() -> + '@lazy_case', + X = + case {[], [], ok} of + {_A, _V1, V2} -> V2; + {_V, [], _} -> false + end, + X. + +lazy_case_test9() -> + '@lazy_case', + case {[], [], ok} of + {_A, _V1, V2} -> V2; + {_V, [], _} -> false + end, + ok.