@@ -16,8 +16,8 @@ defmodule ESTree.Tools.Generator do
1616 @ indent " "
1717
1818 @ spec generate ( ESTree . operator | ESTree.Node . t , integer ) :: binary
19- def generate ( value , level \\ 0 ) do
20- "#{ indent ( level ) } #{ do_generate ( value , level + 1 ) } "
19+ def generate ( value , level \\ nil ) do
20+ "#{ indent ( level ) } #{ do_generate ( value , calculate_next_level ( level ) ) } "
2121 end
2222
2323 def do_generate ( nil , level ) do
@@ -63,7 +63,7 @@ defmodule ESTree.Tools.Generator do
6363 end
6464
6565 def do_generate ( % ESTree.Program { body: body } , level ) do
66- Enum . map_join ( body , " \n " , & generate ( & 1 , level + 1 ) )
66+ Enum . map_join ( body , newline ( level ) , & generate ( & 1 , calculate_next_level ( level ) ) )
6767 end
6868
6969 def do_generate ( % ESTree.FunctionDeclaration { } = ast , level ) do
@@ -73,23 +73,23 @@ defmodule ESTree.Tools.Generator do
7373 params = params_and_defaults ( ast . params , ast . defaults )
7474 id = generate ( ast . id )
7575
76- "#{ async } function#{ generator } #{ id } (#{ params } )#{ generate ( ast . body , level + 1 ) } "
76+ "#{ async } function#{ generator } #{ id } (#{ params } )#{ generate ( ast . body , calculate_next_level ( level ) ) } "
7777 end
7878
7979 def do_generate ( % ESTree.FunctionExpression { } = ast , level ) do
8080 generator = if ast . generator , do: "*" , else: ""
8181 async = if ast . async , do: "async " , else: ""
8282 params = params_and_defaults ( ast . params , ast . defaults )
8383
84- "#{ async } function#{ generator } (#{ params } )#{ generate ( ast . body , level + 1 ) } "
84+ "#{ async } function#{ generator } (#{ params } )#{ generate ( ast . body , calculate_next_level ( level ) ) } "
8585 end
8686
8787 def do_generate ( % ESTree.EmptyStatement { } , level ) do
8888 ";"
8989 end
9090
9191 def do_generate ( % ESTree.BlockStatement { body: body } , level ) do
92- "{\n #{ indent ( level + 1 ) } " <> Enum . map_join ( body , "\n #{ indent ( level + 1 ) } " , & generate ( & 1 ) ) <> "\n #{ indent ( level ) } }"
92+ "{#{ newline ( level ) } #{ indent ( calculate_next_level ( level ) ) } " <> Enum . map_join ( body , "#{ newline ( level ) } #{ indent ( calculate_next_level ( level ) ) } " , & generate ( & 1 ) ) <> "#{ newline ( level ) } #{ indent ( level ) } }"
9393 end
9494
9595 def do_generate ( % ESTree.ExpressionStatement { expression: expression } , level ) do
@@ -98,11 +98,11 @@ defmodule ESTree.Tools.Generator do
9898
9999 def do_generate ( % ESTree.IfStatement { test: test , consequent: consequent , alternate: alternate } , level ) do
100100 test = generate ( test )
101- consequent = generate ( consequent , level + 1 )
101+ consequent = generate ( consequent , calculate_next_level ( level ) )
102102 result = "if(#{ test } ) #{ consequent } "
103103
104104 if alternate do
105- result = result <> " else #{ generate ( alternate , level + 1 ) } "
105+ result = result <> " else #{ generate ( alternate , calculate_next_level ( level ) ) } "
106106 end
107107
108108 result
@@ -111,7 +111,7 @@ defmodule ESTree.Tools.Generator do
111111 def do_generate ( % ESTree.LabeledStatement { label: label , body: body } , level ) do
112112 """
113113 #{ generate ( label , level ) } :
114- #{ generate ( body , level + 1 ) }
114+ #{ generate ( body , calculate_next_level ( level ) ) }
115115 """
116116 end
117117
@@ -132,55 +132,55 @@ defmodule ESTree.Tools.Generator do
132132 end
133133
134134 def do_generate ( % ESTree.WithStatement { object: object , body: body } , level ) do
135- "with(#{ generate ( object ) } )#{ generate ( body , level + 1 ) } "
135+ "with(#{ generate ( object ) } )#{ generate ( body , calculate_next_level ( level ) ) } "
136136 end
137137
138138 def do_generate ( % ESTree.SwitchStatement { discriminant: discriminant , cases: cases } , level ) do
139- cases = Enum . map_join ( cases , " \n " , & generate ( & 1 , level + 1 ) )
139+ cases = Enum . map_join ( cases , newline ( level ) , & generate ( & 1 , calculate_next_level ( level ) ) )
140140 "switch(#{ generate ( discriminant ) } ){ #{ cases } }"
141141 end
142142
143143 def do_generate ( % ESTree.ReturnStatement { argument: argument } , level ) do
144- "return #{ generate ( argument , level + 1 ) } ;"
144+ "return #{ generate ( argument , calculate_next_level ( level ) ) } ;"
145145 end
146146
147147 def do_generate ( % ESTree.ThrowStatement { argument: argument } , level ) do
148- "throw #{ generate ( argument , level + 1 ) } ;"
148+ "throw #{ generate ( argument , calculate_next_level ( level ) ) } ;"
149149 end
150150
151151 def do_generate ( % ESTree.TryStatement { block: block , handler: handler , finalizer: nil } , level ) do
152- "try#{ generate ( block , level + 1 ) } #{ generate ( handler , level + 1 ) } "
152+ "try#{ generate ( block , calculate_next_level ( level ) ) } #{ generate ( handler , calculate_next_level ( level ) ) } "
153153 end
154154
155155 def do_generate ( % ESTree.TryStatement { block: block , handler: nil , finalizer: finalizer } , level ) do
156- "try#{ generate ( block , level + 1 ) } finally#{ generate ( finalizer , level + 1 ) } "
156+ "try#{ generate ( block , calculate_next_level ( level ) ) } finally#{ generate ( finalizer , calculate_next_level ( level ) ) } "
157157 end
158158
159159 def do_generate ( % ESTree.TryStatement { block: block , handler: handler , finalizer: finalizer } , level ) do
160- "try#{ generate ( block , level + 1 ) } #{ generate ( handler , level + 1 ) } finally#{ generate ( finalizer , level + 1 ) } "
160+ "try#{ generate ( block , calculate_next_level ( level ) ) } #{ generate ( handler , calculate_next_level ( level ) ) } finally#{ generate ( finalizer , calculate_next_level ( level ) ) } "
161161 end
162162
163163 def do_generate ( % ESTree.WhileStatement { test: test , body: body } , level ) do
164- "while(#{ generate ( test ) } ) #{ generate ( body , level + 1 ) } "
164+ "while(#{ generate ( test ) } ) #{ generate ( body , calculate_next_level ( level ) ) } "
165165 end
166166
167167 def do_generate ( % ESTree.DoWhileStatement { test: test , body: body } , level ) do
168- "do #{ generate ( body , level + 1 ) } while(#{ generate ( test , level ) } );"
168+ "do #{ generate ( body , calculate_next_level ( level ) ) } while(#{ generate ( test , level ) } );"
169169 end
170170
171171 def do_generate ( % ESTree.ForStatement { init: init , test: test , update: update , body: body } , level ) do
172172 init = generate ( init )
173173 test = generate ( test )
174174 update = generate ( update )
175- body = generate ( body , level + 1 )
175+ body = generate ( body , calculate_next_level ( level ) )
176176
177177 "for(#{ init } ; #{ test } ; #{ update } ) #{ body } "
178178 end
179179
180180 def do_generate ( % ESTree.ForInStatement { left: left , right: right , body: body } , level ) do
181181 left = generate ( left ) |> String . replace ( ";" , "" )
182182 right = generate ( right )
183- body = generate ( body , level + 1 )
183+ body = generate ( body , calculate_next_level ( level ) )
184184
185185 "for(#{ left } in #{ right } ) #{ body } "
186186 end
@@ -232,7 +232,7 @@ defmodule ESTree.Tools.Generator do
232232 end
233233
234234 def do_generate ( % ESTree.ObjectExpression { properties: properties } , level ) do
235- "{\n #{ indent ( level + 1 ) } " <> Enum . map_join ( properties , ", " , & generate ( & 1 , level + 1 ) ) <> "\n #{ indent ( level ) } }"
235+ "{#{ newline ( level ) } #{ indent ( calculate_next_level ( level ) ) } " <> Enum . map_join ( properties , ", " , & generate ( & 1 , calculate_next_level ( level ) ) ) <> "#{ newline ( level ) } #{ indent ( level ) } }"
236236 end
237237
238238 def do_generate ( % ESTree.Property { key: key , value: value , kind: :init , shorthand: false , method: false , computed: false } , level ) do
@@ -409,7 +409,7 @@ defmodule ESTree.Tools.Generator do
409409 end
410410
411411 def do_generate ( % ESTree.SwitchCase { test: nil , consequent: consequent } , level ) do
412- consequent = Enum . map_join ( consequent , " \n " , & generate ( & 1 ) )
412+ consequent = Enum . map_join ( consequent , newline ( level ) , & generate ( & 1 ) )
413413 """
414414 default:
415415 #{ consequent }
@@ -418,7 +418,7 @@ defmodule ESTree.Tools.Generator do
418418
419419 def do_generate ( % ESTree.SwitchCase { test: test , consequent: consequent } , level ) do
420420 test = generate ( test )
421- consequent = Enum . map_join ( consequent , " \n " , & generate ( & 1 ) )
421+ consequent = Enum . map_join ( consequent , newline ( level ) , & generate ( & 1 ) )
422422
423423 """
424424 case #{ test } :
@@ -523,7 +523,7 @@ defmodule ESTree.Tools.Generator do
523523 end
524524
525525 def do_generate ( % ESTree.ClassBody { body: body } , level ) do
526- body = Enum . map_join ( body , " \n " , & generate ( & 1 ) )
526+ body = Enum . map_join ( body , newline ( level ) , & generate ( & 1 ) )
527527
528528 "{ #{ body } }"
529529 end
@@ -728,8 +728,12 @@ defmodule ESTree.Tools.Generator do
728728
729729 def do_generate ( % ESTree.JSXOpeningElement { name: name , attributes: attributes , selfClosing: selfClosing } , level ) do
730730 selfClosing = if selfClosing , do: "/" , else: ""
731-
732- "<#{ generate ( name ) } #{ Enum . map ( attributes , & generate ( & 1 ) ) |> Enum . join ( " " ) } #{ selfClosing } >"
731+ attributesValue = cond do
732+ Enum . empty? ( attributes ) -> ""
733+ true ->
734+ " #{ Enum . map ( attributes , & generate ( & 1 ) ) |> Enum . join ( " " ) } "
735+ end
736+ "<#{ generate ( name ) } #{ attributesValue } #{ selfClosing } >"
733737 end
734738
735739 def do_generate ( % ESTree.JSXClosingElement { name: name } , level ) do
@@ -745,7 +749,7 @@ defmodule ESTree.Tools.Generator do
745749 end
746750
747751 def do_generate ( % ESTree.JSXElement { openingElement: openingElement , children: children , closingElement: closingElement } , level ) do
748- "#{ generate ( openingElement ) } #{ Enum . map ( children , & generate ( & 1 , level + 1 ) ) |> Enum . join ( " " ) } #{ generate ( closingElement ) } "
752+ "#{ generate ( openingElement ) } #{ Enum . map ( children , & generate ( & 1 , calculate_next_level ( level ) ) ) |> Enum . join ( " " ) } #{ generate ( closingElement ) } "
749753 end
750754
751755 defp convert_string_characters ( str ) do
@@ -765,7 +769,27 @@ defmodule ESTree.Tools.Generator do
765769 end )
766770 end
767771
772+ defp indent ( nil ) do
773+ ""
774+ end
775+
768776 defp indent ( level ) do
769777 String . duplicate ( " " , level )
770778 end
779+
780+ defp calculate_next_level ( nil ) do
781+ nil
782+ end
783+
784+ defp calculate_next_level ( level ) do
785+ level + 1
786+ end
787+
788+ defp newline ( nil ) do
789+ ""
790+ end
791+
792+ defp newline ( level ) do
793+ "\n "
794+ end
771795end
0 commit comments