diff --git a/lib/es_tree/tools/generator.ex b/lib/es_tree/tools/generator.ex index 41132da..d59cbfd 100644 --- a/lib/es_tree/tools/generator.ex +++ b/lib/es_tree/tools/generator.ex @@ -619,65 +619,76 @@ defmodule ESTree.Tools.Generator do "" end - sep_end = if opts.beauty do - "\n" - else - "" - end - consequent = case consequent do %BlockStatement{} -> [wh_sep, do_generate(consequent, opts)] _ -> - [sep_c, do_generate(consequent, opts), sep_end] + [sep_c, do_generate(consequent, opts)] end ["if", wh_sep, "(", test, ")", consequent] end defp do_generate(%IfStatement{test: test, consequent: consequent, alternate: alternate}, %{wh_sep: wh_sep} = opts) do - test = do_generate(test, opts) - - sep_c = if opts.beauty do - ["\n", indent(next_indent(opts))] - else - "" - end + is_cons_block = consequent.__struct__ == BlockStatement - sep_end = if opts.beauty do - "\n" - else - "" - end + i_1 = indent(opts) + i_2 = indent(next_indent(opts)) - {consequent, sep_if} = + consequent = case consequent do %BlockStatement{} -> - {[wh_sep, do_generate(consequent, opts)], wh_sep} + [wh_sep, do_generate(consequent, opts)] _ -> - {[sep_c, do_generate(consequent, opts), sep_end], ""} + indent = if opts.beauty do + ["\n", i_2] + else + "" + end + + [indent, do_generate(consequent, opts)] end - sep_a = if opts.beauty do - ["\n", indent(next_indent(opts))] + alternate_indent = if opts.beauty do + ["\n", i_2] else " " end - alternate = + alternate = if is_cons_block do case alternate do %BlockStatement{} -> [wh_sep, "else", wh_sep, do_generate(alternate, opts)] %IfStatement{} -> - [sep_if, "else ", do_generate(alternate, opts)] + [wh_sep, "else ", do_generate(alternate, opts)] + + _ -> + [wh_sep, "else", alternate_indent, do_generate(alternate, opts)] + end + else + indent = if opts.beauty do + ["\n", i_1] + else + "" + end + + case alternate do + %BlockStatement{} -> + [indent, "else", wh_sep, do_generate(alternate, opts)] + + %IfStatement{} -> + [indent, "else ", do_generate(alternate, opts)] _ -> - ["else", sep_a, do_generate(alternate, opts)] + [indent, "else", alternate_indent, do_generate(alternate, opts)] end + end + + test = do_generate(test, opts) ["if", wh_sep, "(", test, ")", consequent, alternate] end diff --git a/test/tools/generator/formatting_test.exs b/test/tools/generator/formatting_test.exs index ee28cd2..85a8737 100644 --- a/test/tools/generator/formatting_test.exs +++ b/test/tools/generator/formatting_test.exs @@ -35,7 +35,43 @@ defmodule ESTree.Tools.Generator.Formatting.Test do Builder.literal(-1) ) ) - ]) + ]), + Builder.if_statement( + Builder.literal(false), + Builder.block_statement([ + Builder.expression_statement( + Builder.assignment_expression( + :=, + Builder.identifier(:a), + Builder.literal(-2) + ) + ) + ]), + Builder.block_statement([ + Builder.expression_statement( + Builder.assignment_expression( + :=, + Builder.identifier(:a), + Builder.literal(-3) + ) + ) + ]) + ) + ), + Builder.if_statement( + Builder.literal(false), + Builder.return_statement( + Builder.literal(-1) + ), + Builder.if_statement( + Builder.literal(false), + Builder.return_statement( + Builder.literal(-2) + ), + Builder.return_statement( + Builder.literal(-3) + ) + ) ), Builder.switch_statement( Builder.literal(false), @@ -103,8 +139,19 @@ function test() { 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; @@ -123,7 +170,102 @@ test(); assert_gen ast, String.trim(str) - 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();" + 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();" + + assert_gen ast, str, beauty: false + end + + should "format if statements correct" do + ast = Builder.program([ + Builder.function_declaration( + Builder.identifier(:test), + [], + [], + Builder.block_statement([ + Builder.if_statement( + Builder.literal(true), + Builder.block_statement([ + Builder.return_statement(Builder.literal(1)) + ]) + ), + Builder.if_statement( + Builder.literal(true), + Builder.return_statement(Builder.literal(1)) + ), + Builder.if_statement( + Builder.literal(true), + Builder.block_statement([ + Builder.return_statement(Builder.literal(1)) + ]), + Builder.return_statement(Builder.literal(2)) + ), + Builder.if_statement( + Builder.literal(true), + Builder.return_statement(Builder.literal(1)), + Builder.block_statement([ + Builder.return_statement(Builder.literal(2)) + ]) + ), + Builder.if_statement( + Builder.literal(true), + Builder.block_statement([ + Builder.return_statement(Builder.literal(1)) + ]), + Builder.if_statement( + Builder.literal(false), + Builder.return_statement(Builder.literal(2)) + ) + ), + Builder.if_statement( + Builder.literal(true), + Builder.return_statement(Builder.literal(1)), + Builder.if_statement( + Builder.literal(false), + Builder.block_statement([ + Builder.return_statement(Builder.literal(2)) + ]) + ) + ) + ]) + ) + ]) + + 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; + } +} +""" + + assert_gen ast, String.trim(str) + + 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;}}" assert_gen ast, str, beauty: false end