Skip to content

Commit b19e8bd

Browse files
author
Mikalai Seva
authored
Merge pull request #18 from agevio/feature/indentation
Correct indentation for if statements
2 parents 6f8c745 + 036e4cd commit b19e8bd

File tree

2 files changed

+182
-29
lines changed

2 files changed

+182
-29
lines changed

lib/es_tree/tools/generator.ex

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -619,65 +619,76 @@ defmodule ESTree.Tools.Generator do
619619
""
620620
end
621621

622-
sep_end = if opts.beauty do
623-
"\n"
624-
else
625-
""
626-
end
627-
628622
consequent =
629623
case consequent do
630624
%BlockStatement{} ->
631625
[wh_sep, do_generate(consequent, opts)]
632626

633627
_ ->
634-
[sep_c, do_generate(consequent, opts), sep_end]
628+
[sep_c, do_generate(consequent, opts)]
635629
end
636630

637631
["if", wh_sep, "(", test, ")", consequent]
638632
end
639633

640634
defp do_generate(%IfStatement{test: test, consequent: consequent, alternate: alternate}, %{wh_sep: wh_sep} = opts) do
641-
test = do_generate(test, opts)
642-
643-
sep_c = if opts.beauty do
644-
["\n", indent(next_indent(opts))]
645-
else
646-
""
647-
end
635+
is_cons_block = consequent.__struct__ == BlockStatement
648636

649-
sep_end = if opts.beauty do
650-
"\n"
651-
else
652-
""
653-
end
637+
i_1 = indent(opts)
638+
i_2 = indent(next_indent(opts))
654639

655-
{consequent, sep_if} =
640+
consequent =
656641
case consequent do
657642
%BlockStatement{} ->
658-
{[wh_sep, do_generate(consequent, opts)], wh_sep}
643+
[wh_sep, do_generate(consequent, opts)]
659644

660645
_ ->
661-
{[sep_c, do_generate(consequent, opts), sep_end], ""}
646+
indent = if opts.beauty do
647+
["\n", i_2]
648+
else
649+
""
650+
end
651+
652+
[indent, do_generate(consequent, opts)]
662653
end
663654

664-
sep_a = if opts.beauty do
665-
["\n", indent(next_indent(opts))]
655+
alternate_indent = if opts.beauty do
656+
["\n", i_2]
666657
else
667658
" "
668659
end
669660

670-
alternate =
661+
alternate = if is_cons_block do
671662
case alternate do
672663
%BlockStatement{} ->
673664
[wh_sep, "else", wh_sep, do_generate(alternate, opts)]
674665

675666
%IfStatement{} ->
676-
[sep_if, "else ", do_generate(alternate, opts)]
667+
[wh_sep, "else ", do_generate(alternate, opts)]
668+
669+
_ ->
670+
[wh_sep, "else", alternate_indent, do_generate(alternate, opts)]
671+
end
672+
else
673+
indent = if opts.beauty do
674+
["\n", i_1]
675+
else
676+
""
677+
end
678+
679+
case alternate do
680+
%BlockStatement{} ->
681+
[indent, "else", wh_sep, do_generate(alternate, opts)]
682+
683+
%IfStatement{} ->
684+
[indent, "else ", do_generate(alternate, opts)]
677685

678686
_ ->
679-
["else", sep_a, do_generate(alternate, opts)]
687+
[indent, "else", alternate_indent, do_generate(alternate, opts)]
680688
end
689+
end
690+
691+
test = do_generate(test, opts)
681692

682693
["if", wh_sep, "(", test, ")", consequent, alternate]
683694
end

test/tools/generator/formatting_test.exs

Lines changed: 144 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,43 @@ defmodule ESTree.Tools.Generator.Formatting.Test do
3535
Builder.literal(-1)
3636
)
3737
)
38-
])
38+
]),
39+
Builder.if_statement(
40+
Builder.literal(false),
41+
Builder.block_statement([
42+
Builder.expression_statement(
43+
Builder.assignment_expression(
44+
:=,
45+
Builder.identifier(:a),
46+
Builder.literal(-2)
47+
)
48+
)
49+
]),
50+
Builder.block_statement([
51+
Builder.expression_statement(
52+
Builder.assignment_expression(
53+
:=,
54+
Builder.identifier(:a),
55+
Builder.literal(-3)
56+
)
57+
)
58+
])
59+
)
60+
),
61+
Builder.if_statement(
62+
Builder.literal(false),
63+
Builder.return_statement(
64+
Builder.literal(-1)
65+
),
66+
Builder.if_statement(
67+
Builder.literal(false),
68+
Builder.return_statement(
69+
Builder.literal(-2)
70+
),
71+
Builder.return_statement(
72+
Builder.literal(-3)
73+
)
74+
)
3975
),
4076
Builder.switch_statement(
4177
Builder.literal(false),
@@ -103,8 +139,19 @@ function test() {
103139
104140
if (true) {
105141
a = -1;
142+
} else if (false) {
143+
a = -2;
144+
} else {
145+
a = -3;
106146
}
107147
148+
if (false)
149+
return -1;
150+
else if (false)
151+
return -2;
152+
else
153+
return -3;
154+
108155
switch (false) {
109156
default:
110157
b = 0;
@@ -123,7 +170,102 @@ test();
123170

124171
assert_gen ast, String.trim(str)
125172

126-
str = "function test(){var a,b,c=function(){return 1;};if(true){a=-1;}switch(false){default:b=0;break;}return {a:a+1,b:b+2,c:c+3};}test();"
173+
str = "function test(){var a,b,c=function(){return 1;};if(true){a=-1;}else if(false){a=-2;}else{a=-3;}if(false)return -1;else if(false)return -2;else return -3;switch(false){default:b=0;break;}return {a:a+1,b:b+2,c:c+3};}test();"
174+
175+
assert_gen ast, str, beauty: false
176+
end
177+
178+
should "format if statements correct" do
179+
ast = Builder.program([
180+
Builder.function_declaration(
181+
Builder.identifier(:test),
182+
[],
183+
[],
184+
Builder.block_statement([
185+
Builder.if_statement(
186+
Builder.literal(true),
187+
Builder.block_statement([
188+
Builder.return_statement(Builder.literal(1))
189+
])
190+
),
191+
Builder.if_statement(
192+
Builder.literal(true),
193+
Builder.return_statement(Builder.literal(1))
194+
),
195+
Builder.if_statement(
196+
Builder.literal(true),
197+
Builder.block_statement([
198+
Builder.return_statement(Builder.literal(1))
199+
]),
200+
Builder.return_statement(Builder.literal(2))
201+
),
202+
Builder.if_statement(
203+
Builder.literal(true),
204+
Builder.return_statement(Builder.literal(1)),
205+
Builder.block_statement([
206+
Builder.return_statement(Builder.literal(2))
207+
])
208+
),
209+
Builder.if_statement(
210+
Builder.literal(true),
211+
Builder.block_statement([
212+
Builder.return_statement(Builder.literal(1))
213+
]),
214+
Builder.if_statement(
215+
Builder.literal(false),
216+
Builder.return_statement(Builder.literal(2))
217+
)
218+
),
219+
Builder.if_statement(
220+
Builder.literal(true),
221+
Builder.return_statement(Builder.literal(1)),
222+
Builder.if_statement(
223+
Builder.literal(false),
224+
Builder.block_statement([
225+
Builder.return_statement(Builder.literal(2))
226+
])
227+
)
228+
)
229+
])
230+
)
231+
])
232+
233+
str = """
234+
function test() {
235+
if (true) {
236+
return 1;
237+
}
238+
239+
if (true)
240+
return 1;
241+
242+
if (true) {
243+
return 1;
244+
} else
245+
return 2;
246+
247+
if (true)
248+
return 1;
249+
else {
250+
return 2;
251+
}
252+
253+
if (true) {
254+
return 1;
255+
} else if (false)
256+
return 2;
257+
258+
if (true)
259+
return 1;
260+
else if (false) {
261+
return 2;
262+
}
263+
}
264+
"""
265+
266+
assert_gen ast, String.trim(str)
267+
268+
str = "function test(){if(true){return 1;}if(true)return 1;if(true){return 1;}else return 2;if(true)return 1;else{return 2;}if(true){return 1;}else if(false)return 2;if(true)return 1;else if(false){return 2;}}"
127269

128270
assert_gen ast, str, beauty: false
129271
end

0 commit comments

Comments
 (0)