Skip to content

Commit 0e2211b

Browse files
committed
Support strict generators
Reference: erlang/otp#8625
1 parent ec46f67 commit 0e2211b

File tree

5 files changed

+31
-16
lines changed

5 files changed

+31
-16
lines changed

src/erlfmt_format.erl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,8 @@ do_expr_to_algebra({mc, _Meta, Expr, LcExprs}) ->
186186
comprehension_to_algebra(Expr, LcExprs, <<"#{">>, <<"}">>);
187187
do_expr_to_algebra({bc, _Meta, Expr, LcExprs}) ->
188188
comprehension_to_algebra(Expr, LcExprs, <<"<<">>, <<">>">>);
189-
do_expr_to_algebra({generate, _Meta, Left, Right}) ->
190-
field_to_algebra(<<"<-">>, Left, Right);
191-
do_expr_to_algebra({b_generate, _Meta, Left, Right}) ->
192-
field_to_algebra(<<"<=">>, Left, Right);
189+
do_expr_to_algebra({generate, _Meta, Op, Left, Right}) ->
190+
field_to_algebra(atom_to_binary(Op), Left, Right);
193191
do_expr_to_algebra({call, Meta, Name, Args}) ->
194192
concat(expr_to_algebra(Name), call(Meta, Args, <<"(">>, <<")">>));
195193
do_expr_to_algebra({macro_call, _Meta, Name, none}) ->

src/erlfmt_parse.yrl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,14 @@ macro_name macro_def_expr macro_def_expr_body macro_def_type macro_def_clause.
5151
Terminals
5252
char integer float atom string var
5353

54-
'(' ')' ',' '->' '{' '}' '[' ']' '|' '||' '<-' ';' ':' '#' '.' '?='
54+
'(' ')' ',' '->' '{' '}' '[' ']' '|' '||' '<-' '<:-' ';' ':' '#' '.' '?='
5555
'after' 'begin' 'case' 'try' 'catch' 'end' 'fun' 'if' 'of' 'receive' 'when' 'maybe' 'else'
5656
'andalso' 'orelse'
5757
'bnot' 'not'
5858
'*' '/' 'div' 'rem' 'band' 'and'
5959
'+' '-' 'bor' 'bxor' 'bsl' 'bsr' 'or' 'xor'
6060
'++' '--'
61-
'==' '/=' '=<' '<' '>=' '>' '=:=' '=/=' '<=' '=>' ':='
61+
'==' '/=' '=<' '<' '>=' '>' '=:=' '=/=' '<=' '<:=' '=>' ':='
6262
'<<' '>>'
6363
'?' '!' '=' '::' '..' '...'
6464
spec callback define_expr define_type define_clause standalone_exprs % helper
@@ -348,8 +348,10 @@ lc_exprs -> lc_expr ',' : ['$1'].
348348
lc_exprs -> lc_expr ',' lc_exprs : ['$1'|'$3'].
349349

350350
lc_expr -> expr : '$1'.
351-
lc_expr -> expr '<-' expr : {generate,?range_anno('$1', '$3'),'$1','$3'}.
352-
lc_expr -> binary '<=' expr : {b_generate,?range_anno('$1', '$3'),'$1','$3'}.
351+
lc_expr -> expr '<-' expr : {generate, ?range_anno('$1', '$3'), '<-', '$1', '$3'}.
352+
lc_expr -> expr '<:-' expr : {generate, ?range_anno('$1', '$3'), '<:-', '$1', '$3'}.
353+
lc_expr -> binary '<=' expr : {generate, ?range_anno('$1', '$3'),'<=', '$1', '$3'}.
354+
lc_expr -> binary '<:=' expr : {generate, ?range_anno('$1', '$3'),'<:=', '$1', '$3'}.
353355

354356
tuple -> '{' '}' : {tuple,?range_anno('$1', '$2'),[]}.
355357
tuple -> '{' exprs '}' : {tuple,?range_anno('$1', '$3'),'$2'}.
@@ -804,9 +806,7 @@ Erlang code.
804806

805807
-type af_qualifier() :: af_generator() | af_filter().
806808

807-
-type af_generator() ::
808-
{'generate', anno(), af_pattern(), abstract_expr()}
809-
| {'b_generate', anno(), af_pattern(), abstract_expr()}.
809+
-type af_generator() :: {'generate', anno(), Op :: atom(), af_pattern(), abstract_expr()}.
810810

811811
-type af_filter() :: abstract_expr().
812812

src/erlfmt_recomment.erl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,15 @@ insert_nested({Comprehension, Meta, Expr0, LcExprs0}, Comments0) when
181181
insert_nested({Field, Meta, Key0, Value0}, Comments0) when
182182
Field =:= map_field_assoc;
183183
Field =:= map_field_exact;
184-
Field =:= record_field;
185-
Field =:= generate;
186-
Field =:= b_generate
184+
Field =:= record_field
187185
->
188186
{Key, Comments1} = insert_expr(Key0, Comments0),
189187
{Value, Comments} = insert_expr(Value0, Comments1),
190188
{{Field, Meta, Key, Value}, Comments};
189+
insert_nested({generate, Meta, Op, Key0, Value0}, Comments0) ->
190+
{Key, Comments1} = insert_expr(Key0, Comments0),
191+
{Value, Comments} = insert_expr(Value0, Comments1),
192+
{{generate, Meta, Op, Key, Value}, Comments};
191193
%% no internal comments in record_indexm record_field, or bin_element
192194
insert_nested({record_index, _, _, _} = Node, Comments) ->
193195
{put_pre_comments(Node, Comments), []};

test/erlfmt_SUITE.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1012,7 +1012,7 @@ dotted(Config) when is_list(Config) ->
10121012
map_comprehension(Config) when is_list(Config) ->
10131013
?assertMatch(
10141014
{mc, _, {map_field_assoc, _, {var, _, 'A'}, {var, _, 'B'}}, [
1015-
{generate, _, {map_field_exact, _, {var, _, 'A'}, {var, _, 'B'}}, {var, _, 'M'}}
1015+
{generate, _, '<-', {map_field_exact, _, {var, _, 'A'}, {var, _, 'B'}}, {var, _, 'M'}}
10161016
]},
10171017
parse_expr("#{A => B || A := B <- M}")
10181018
).

test/erlfmt_format_SUITE.erl

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@
7575
doc_attributes/1,
7676
doc_macros/1,
7777
incomplete/1,
78-
maybe_incomplete/1
78+
maybe_incomplete/1,
79+
strict_generators/1
7980
]).
8081

8182
suite() ->
@@ -93,6 +94,11 @@ init_per_group(otp_27_features, Config) ->
9394
true -> Config;
9495
false -> {skip, "Skipping tests for features from OTP >= 27"}
9596
end;
97+
init_per_group(otp_28_features, Config) ->
98+
case erlang:system_info(otp_release) >= "28" of
99+
true -> Config;
100+
false -> {skip, "Skipping tests for features from OTP >= 28"}
101+
end;
96102
init_per_group(_GroupName, Config) ->
97103
Config.
98104

@@ -174,6 +180,9 @@ groups() ->
174180
{otp_27_features, [parallel], [
175181
sigils,
176182
doc_attributes
183+
]},
184+
{otp_28_features, [parallel], [
185+
strict_generators
177186
]}
178187
].
179188

@@ -182,6 +191,7 @@ all() ->
182191
{group, expressions},
183192
{group, forms},
184193
{group, otp_27_features},
194+
{group, otp_28_features},
185195
comment
186196
].
187197

@@ -4460,3 +4470,8 @@ maybe_incomplete(Config) when is_list(Config) ->
44604470
" ok -> ok\n"
44614471
"end.\n"
44624472
).
4473+
4474+
strict_generators(Config) when is_list(Config) ->
4475+
?assertSame("[X || X <:- Xs]\n"),
4476+
?assertSame("[{K, V} || K := V <:- M]\n"),
4477+
?assertSame("[X || <<X>> <:= Xs]\n").

0 commit comments

Comments
 (0)