Skip to content

Commit 35a5cdb

Browse files
author
Рощупкин Никита
committed
Fixed parse_transform pt_lazy_case
1 parent c05a0c6 commit 35a5cdb

2 files changed

Lines changed: 68 additions & 13 deletions

File tree

src/pt_lazy_case.erl

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,36 @@ replace_line_ast(V1) ->
8383
parser_case([{atom, Line, '@lazy_case'} | TailAST], File) ->
8484
case TailAST of
8585
[{match, L, V, {'case', _, _, _} = CaseAST} | TailAST2] ->
86-
[{match, L, V, replace_case(parser_case(CaseAST, File), File)} | TailAST2];
86+
NewData = case replace_case(parser_case(CaseAST, File), File) of
87+
{'case', _, _, _} = Data ->
88+
Data;
89+
Data ->
90+
{'case', L, {nil, L}, [{clause, L, [{nil, L}], [], Data}]}
91+
end,
92+
[{match, L, V, NewData} | TailAST2];
8793
{match, L, V, {'case', _, _, _} = CaseAST} ->
88-
{match, L, V, replace_case(parser_case(CaseAST, File), File)};
89-
[{'case', _, _, _} | _] ->
90-
replace_case(parser_case(TailAST, File), File);
91-
{'case', _, _, _} ->
92-
replace_case(parser_case(TailAST, File), File);
94+
NewData = case replace_case(parser_case(CaseAST, File), File) of
95+
{'case', _, _, _} = Data ->
96+
Data;
97+
Data ->
98+
{'case', L, {nil, L}, [{clause, L, [{nil, L}], [], Data}]}
99+
end,
100+
{match, L, V, NewData};
101+
[{'case', L, _, _} = CaseAST | TailAST2] ->
102+
NewData = case replace_case(parser_case(CaseAST, File), File) of
103+
{'case', _, _, _} = Data ->
104+
Data;
105+
Data ->
106+
{'case', L, {nil, L}, [{clause, L, [{nil, L}], [], Data}]}
107+
end,
108+
[NewData | TailAST2];
109+
{'case', L, _, _} = CaseAST ->
110+
case replace_case(parser_case(CaseAST, File), File) of
111+
{'case', _, _, _} = Data ->
112+
Data;
113+
Data ->
114+
{'case', L, {nil, L}, [{clause, L, [{nil, L}], [], Data}]}
115+
end;
93116
_ ->
94117
{ok, Cwd} = file:get_cwd(),
95118
FullFile = filename:join(Cwd, File),
@@ -164,7 +187,7 @@ parse_clause(_, Acc, OtherAST, _, _) ->
164187
parse_tuple(HeadAstTuple, ListASTClause, [], V1, _) ->
165188
NewListASTClause = parse_clause(ListASTClause, [], []),
166189
OffRepeateASTClause = delete_repeate(NewListASTClause, []),
167-
case check_load_code(OffRepeateASTClause) of
190+
case check_load_code(OffRepeateASTClause, HeadAstTuple) of
168191
false ->
169192
{'case', V1, HeadAstTuple, OffRepeateASTClause};
170193
{true, Data} ->
@@ -179,7 +202,7 @@ parse_tuple(HeadAstTuple, ListASTClause, TailAstTuple, V1, File) ->
179202
OffRepeateASTClause = delete_repeate(create_new_case(NewListASTClause, CountElems, TailAstTuple, [], V1), []),
180203
NewCase = {'case', V1, HeadAstTuple, OffRepeateASTClause},
181204
ChangeCase = parser_case(NewCase, File),
182-
case check_load_code(ChangeCase) of
205+
case check_load_code(ChangeCase, HeadAstTuple) of
183206
false ->
184207
ChangeCase;
185208
{true, Data} ->
@@ -297,14 +320,17 @@ check_guard(Guard, [Guard | _], _) ->
297320
check_guard(Guard, [HeadGuard | TailGuard], Acc) ->
298321
check_guard(Guard, TailGuard, [HeadGuard | Acc]);
299322
check_guard(Guard, _, Acc) ->
300-
301323
{true, [Guard | Acc]}.
302324

303-
check_load_code({'case', _, _, [{clause, _, [{var, _, _}], _, D3} | _]}) ->
325+
check_load_code({'case', _, _, [{clause, _, [{var, _, '_'}], _, D3} | _]}, _HeadAstTuple) ->
304326
{true, D3};
305-
check_load_code([{clause, _, [{var, _, _}], _, D3} | _]) ->
327+
check_load_code([{clause, _, [{var, _, '_'}], _, D3} | _], _HeadAstTuple) ->
306328
{true, D3};
307-
check_load_code(_) ->
329+
check_load_code({'case', _, _, [{clause, _, [{var, Line, Var}], _, D3} | _]}, HeadAstTuple) ->
330+
{true, [{match, Line, {var, Line, Var}, HeadAstTuple} | D3]};
331+
check_load_code([{clause, _, [{var, Line, Var}], _, D3} | _], HeadAstTuple) ->
332+
{true, [{match, Line, {var, Line, Var}, HeadAstTuple} | D3]};
333+
check_load_code(_, _) ->
308334
false.
309335

310336
delete_repeate([{clause, _, Data1, Guard1, _} = HeadASTClause | TailASTClause], Acc) ->

test/pt_lazy_case_tests.erl

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ pt_lazy_case_test_() ->
1919
?_test(ok = lazy_case_test3()),
2020
?_test(ok = lazy_case_test4()),
2121
?_test(ok = lazy_case_test5()),
22-
?_test(ok = lazy_case_test6())
22+
?_test(ok = lazy_case_test6()),
23+
?_test(ok = lazy_case_test7()),
24+
?_test(ok = lazy_case_test8()),
25+
?_test(ok = lazy_case_test9())
2326
].
2427

2528
lazy_case_test1() ->
@@ -109,3 +112,29 @@ lazy_case_test6() ->
109112
{_V, _} -> ?assert(false)
110113
end,
111114
X.
115+
116+
lazy_case_test7() ->
117+
'@lazy_case',
118+
X =
119+
case {[], ok} of
120+
{[], _V} -> _V;
121+
{_V, _} -> ?assert(false)
122+
end,
123+
X.
124+
125+
lazy_case_test8() ->
126+
'@lazy_case',
127+
X =
128+
case {[], [], ok} of
129+
{_A, _V1, V2} -> V2;
130+
{_V, [], _} -> false
131+
end,
132+
X.
133+
134+
lazy_case_test9() ->
135+
'@lazy_case',
136+
case {[], [], ok} of
137+
{_A, _V1, V2} -> V2;
138+
{_V, [], _} -> false
139+
end,
140+
ok.

0 commit comments

Comments
 (0)