1defmodule ESTree.Tools.Builder do
2  @moduledoc """
3  Functions to make building the Nodes easier
4  """
5
6  @spec array_expression(
7    [ESTree.Expression.t | nil],
8    ESTree.SourceLocation.t | nil
9  ) :: ESTree.ArrayExpression.t
10  def array_expression(elements, loc \\ nil) do
11    %ESTree.ArrayExpression{ elements: elements, loc: loc }
12  end
13
14  @spec array_pattern(
15    [ESTree.Pattern.t | nil],
16    ESTree.SourceLocation.t | nil
17  ) :: ESTree.ArrayPattern.t
18  def array_pattern(elements, loc \\ nil) do
19    %ESTree.ArrayPattern{ elements: elements, loc: loc }
20  end
21
22  @spec arrow_function_expression(
23    [ESTree.Pattern.t],
24    [ESTree.Expression.t],
25    ESTree.BlockStatement.t | ESTree.Expression.t,
26    boolean,
27    boolean,
28    ESTree.SourceLocation.t | nil
29  ) :: ESTree.ArrowFunctionExpression.t
30  def arrow_function_expression(params, defaults, body, generator \\ false, expression \\ false, async \\ false, loc \\ nil) do
31    %ESTree.ArrowFunctionExpression{
32      params: params, defaults: defaults,
33      body: body, generator: generator, expression: expression, loc: loc,
34      async: async
35    }
36  end
37
38  @spec assignment_expression(
39    ESTree.assignment_operator,
40    ESTree.Pattern.t,
41    ESTree.Expression.t,
42    ESTree.SourceLocation.t | nil
43  ) :: ESTree.AssignmentExpression.t
44  def assignment_expression(operator, left, right, loc \\ nil) do
45    %ESTree.AssignmentExpression{
46      operator: operator, left: left, right: right, loc: loc
47    }
48  end
49
50  @spec assignment_property(
51    ESTree.Pattern.t,
52    ESTree.SourceLocation.t | nil
53  ) :: ESTree.AssignmentProperty.t
54  def assignment_property(value, loc \\ nil) do
55    %ESTree.AssignmentProperty{
56      value: value, loc: loc
57    }
58  end
59
60
61  @spec await_expression(
62    ESTree.Expression.t | nil,
63    boolean,
64    ESTree.SourceLocation.t | nil
65  ) :: ESTree.AwaitExpression.t
66  def await_expression(argument, all \\ false, loc \\ nil) do
67    %ESTree.AwaitExpression{
68      argument: argument, all: all, loc: loc
69    }
70  end
71
72  @spec binary_expression(
73    ESTree.binary_operator,
74    ESTree.Expression.t,
75    ESTree.Expression.t,
76    ESTree.SourceLocation.t | nil
77  ) :: ESTree.BinaryExpression.t
78  def binary_expression(operator, left, right, loc \\ nil) do
79    %ESTree.BinaryExpression{
80      operator: operator, left: left, right: right, loc: loc
81    }
82  end
83
84  @spec block_statement(
85    [ESTree.Statement.t],
86    ESTree.SourceLocation.t | nil
87  ) :: ESTree.BlockStatement.t
88  def block_statement(body, loc \\ nil) do
89    %ESTree.BlockStatement{
90      body: body, loc: loc
91    }
92  end
93
94  @spec break_statement(
95    ESTree.Identifier.t | nil,
96    ESTree.SourceLocation.t | nil
97  ) :: ESTree.BreakStatement.t
98  def break_statement(label \\ nil, loc \\ nil) do
99    %ESTree.BreakStatement{
100      label: label, loc: loc
101    }
102  end
103
104  @spec call_expression(
105    ESTree.Expression.t,
106    [ESTree.Expression.t],
107    ESTree.SourceLocation.t | nil
108  ) :: ESTree.CallExpression.t
109  def call_expression(callee, arguments, loc \\ nil) do
110    %ESTree.CallExpression{
111      callee: callee, arguments: arguments, loc: loc
112    }
113  end
114
115  @spec catch_clause(
116    ESTree.Pattern.t,
117    ESTree.BlockStatement.t,
118    ESTree.SourceLocation.t | nil
119  ) :: ESTree.CatchClause.t
120  def catch_clause(param, body, loc \\ nil) do
121    %ESTree.CatchClause{
122      param: param, body: body, loc: loc
123    }
124  end
125
126  @spec class_body(
127    [ESTree.MethodDefinition.t],
128    ESTree.SourceLocation.t | nil
129  ) :: ESTree.ClassBody.t
130  def class_body(body, loc \\ nil) do
131    %ESTree.ClassBody{
132      body: body, loc: loc
133    }
134  end
135
136  @spec class_declaration(
137    ESTree.Identifier.t,
138    ESTree.ClassBody.t,
139    ESTree.Expression.t | nil,
140    ESTree.SourceLocation.t | nil
141  ) :: ESTree.ClassDeclaration.t
142  def class_declaration(id, body, superClass \\ nil, loc \\ nil) do
143    %ESTree.ClassDeclaration{
144      id: id, body: body, loc: loc, superClass: superClass
145    }
146  end
147
148  @spec class_expression(
149    ESTree.ClassBody.t,
150    ESTree.Expression.t | nil,
151    ESTree.SourceLocation.t | nil
152  ) :: ESTree.ClassExpression.t
153  def class_expression(body, superClass \\ nil,  loc \\ nil) do
154    %ESTree.ClassExpression{
155      body: body, loc: loc, superClass: superClass
156    }
157  end
158
159  @spec conditional_statement(
160    ESTree.Expression.t,
161    ESTree.Expression.t,
162    ESTree.Expression.t,
163    ESTree.SourceLocation.t | nil
164  ) :: ESTree.ConditionalStatement.t
165  def conditional_statement(test, alternate, consequent, loc \\ nil) do
166    %ESTree.ConditionalStatement{
167      test: test, alternate: alternate, consequent: consequent, loc: loc
168    }
169  end
170
171  @spec continue_statement(
172    ESTree.Identifier.t,
173    ESTree.SourceLocation.t | nil
174  ) :: ESTree.ContinueStatement.t
175  def continue_statement(label, loc \\ nil) do
176    %ESTree.ContinueStatement{
177      label: label, loc: loc
178    }
179  end
180
181  @spec debugger_statement(
182    ESTree.SourceLocation.t | nil
183  ) :: ESTree.DebuggerStatement.t
184  def debugger_statement(loc \\ nil) do
185    %ESTree.DebuggerStatement{
186      loc: loc
187    }
188  end
189
190  @spec do_while_statement(
191    ESTree.Statement.t,
192    ESTree.Expression.t,
193    ESTree.SourceLocation.t | nil
194  ) :: ESTree.DoWhileStatement.t
195  def do_while_statement(body, test, loc \\ nil) do
196    %ESTree.DoWhileStatement{
197      body: body, test: test, loc: loc
198    }
199  end
200
201  @spec empty_expression(
202    ESTree.SourceLocation.t | nil
203  ) :: ESTree.EmptyExpression.t
204  def empty_expression(loc \\ nil) do
205    %ESTree.EmptyExpression{
206      loc: loc
207    }
208  end
209
210  @spec empty_statement(
211    ESTree.SourceLocation.t | nil
212  ) :: ESTree.EmptyStatement.t
213  def empty_statement(loc \\ nil) do
214    %ESTree.EmptyStatement{
215      loc: loc
216    }
217  end
218
219  @spec export_all_declaration(
220    ESTree.Identifier.t | nil,
221    ESTree.SourceLocation.t | nil
222  ) :: ESTree.ExportAllDeclaration.t
223  def export_all_declaration(source \\ nil, loc \\ nil) do
224    %ESTree.ExportAllDeclaration{
225      loc: loc, source: source
226    }
227  end
228
229  @spec export_default_declaration(
230    ESTree.Declaration.t | ESTree.Expression.t | nil,
231    ESTree.SourceLocation.t | nil
232  ) :: ESTree.ExportDefaultDeclaration.t
233  def export_default_declaration(declaration \\ nil, loc \\ nil) do
234    %ESTree.ExportDefaultDeclaration{
235      loc: loc, declaration: declaration
236    }
237  end
238
239  @spec export_named_declaration(
240    ESTree.Declaration.t | nil,
241    [ESTree.ExportSpecifier],
242    ESTree.Literal.t | nil,
243    ESTree.SourceLocation.t | nil
244  ) :: ESTree.ExportNamedDeclaration.t
245  def export_named_declaration(declaration, specifiers \\ [], source \\ nil, loc \\ nil) do
246    %ESTree.ExportNamedDeclaration{
247      declaration: declaration, specifiers: specifiers,
248      source: source, loc: loc
249    }
250  end
251
252  @spec export_specifier(
253    ESTree.Identifier.t,
254    ESTree.Identifier.t | nil,
255    ESTree.SourceLocation.t | nil
256  ) :: ESTree.ExportSpecifier.t
257  def export_specifier(exported, local \\ nil, loc \\ nil) do
258    %ESTree.ExportSpecifier{
259      local: local, exported: exported, loc: loc
260    }
261  end
262
263  @spec expression_statement(
264    ESTree.Expression.t,
265    ESTree.SourceLocation.t | nil
266  ) :: ESTree.ExpressionStatement.t
267  def expression_statement(expression, loc \\ nil) do
268    %ESTree.ExpressionStatement{
269      expression: expression, loc: loc
270    }
271  end
272
273  @spec for_in_statement(
274    ESTree.VariableDeclaration.t | ESTree.Pattern.t,
275    ESTree.Expression.t,
276    ESTree.Statement.t,
277    ESTree.SourceLocation.t | nil
278  ) :: ESTree.ForInStatement.t
279  def for_in_statement(left, right, body, loc \\ nil) do
280    %ESTree.ForInStatement{
281      left: left, right: right, body: body, loc: loc
282    }
283  end
284
285  @spec for_of_statement(
286    ESTree.VariableDeclaration.t | ESTree.Pattern.t,
287    ESTree.Expression.t,
288    ESTree.Statement.t,
289    ESTree.SourceLocation.t | nil
290  ) :: ESTree.ForOfStatement.t
291  def for_of_statement(left, right, body, loc \\ nil) do
292    %ESTree.ForOfStatement{
293      left: left, right: right, body: body, loc: loc
294    }
295  end
296
297  @spec for_statement(
298    ESTree.VariableDeclaration.t | ESTree.Expression.t,
299    ESTree.Expression.t | nil,
300    ESTree.Expression.t | nil,
301    ESTree.Statement.t,
302    ESTree.SourceLocation.t | nil
303  ) :: ESTree.ForStatement.t
304  def for_statement(init, test, update, body, loc \\ nil) do
305    %ESTree.ForStatement{
306      init: init, test: test, update: update, body: body, loc: loc
307    }
308  end
309
310  @spec function_declaration(
311    ESTree.Identifier.t,
312    [ESTree.Pattern.t],
313    [ESTree.Expression.t],
314    ESTree.BlockStatement.t,
315    boolean,
316    boolean,
317    boolean,
318    ESTree.SourceLocation.t | nil
319  ) :: ESTree.FunctionDeclaration.t
320  def function_declaration(id, params, defaults, body, generator \\ false, expression \\ false, async \\ false, loc \\ nil) do
321    %ESTree.FunctionDeclaration{
322      id: id, params: params, defaults: defaults,
323      body: body, generator: generator, async: async,
324      expression: expression, loc: loc
325    }
326  end
327
328  @spec function_expression(
329    [ESTree.Pattern.t],
330    [ ESTree.Expression.t ],
331    ESTree.BlockStatement.t,
332    boolean,
333    boolean,
334    boolean,
335    ESTree.SourceLocation.t | nil
336  ) :: ESTree.FunctionExpression.t
337  def function_expression(params, defaults, body, generator \\ false, expression \\ false, async \\ false, loc \\ nil) do
338    %ESTree.FunctionExpression{
339      params: params, defaults: defaults,
340      body: body, generator: generator, async: async,
341      expression: expression, loc: loc
342    }
343  end
344
345  @spec identifier(
346    binary,
347    ESTree.SourceLocation.t | nil
348  ) :: ESTree.Identifier.t
349  def identifier(name, loc \\ nil) do
350    %ESTree.Identifier{
351      name: name, loc: loc
352    }
353  end
354
355  @spec if_statement(
356    ESTree.Expression.t,
357    ESTree.Statement.t,
358    ESTree.Statement.t | nil,
359    ESTree.SourceLocation.t | nil
360  ) :: ESTree.IfStatement.t
361  def if_statement(test, consequent, alternate \\ nil, loc \\ nil) do
362    %ESTree.IfStatement{
363      test: test, consequent: consequent, alternate: alternate, loc: loc
364    }
365  end
366
367  @spec import_declaration(
368    [ESTree.ImportSpecifier.t | ESTree.ImportNamespaceSpecifier.t | ESTree.ImportDefaultSpecifier.t],
369    ESTree.Identifier.t | nil,
370    ESTree.SourceLocation.t | nil
371  ) :: ESTree.ImportDeclaration.t
372  def import_declaration(specifiers, source \\ nil, loc \\ nil) do
373    %ESTree.ImportDeclaration{
374      specifiers: specifiers, source: source, loc: loc
375    }
376  end
377
378  @spec import_default_specifier(
379    ESTree.Identifier.t,
380    ESTree.SourceLocation.t | nil
381  ) :: ESTree.ImportDefaultSpecifier.t
382  def import_default_specifier(local, loc \\ nil) do
383    %ESTree.ImportDefaultSpecifier{
384      local: local, loc: loc
385    }
386  end
387
388  @spec import_namespace_specifier(
389    ESTree.Identifier.t,
390    ESTree.SourceLocation.t | nil
391  ) :: ESTree.ImportNamespaceSpecifier.t
392  def import_namespace_specifier(local, loc \\ nil) do
393    %ESTree.ImportNamespaceSpecifier{
394      local: local, loc: loc
395    }
396  end
397
398  @spec import_specifier(
399    ESTree.Identifier.t,
400    ESTree.Identifier.t | nil,
401    ESTree.SourceLocation.t | nil
402  ) :: ESTree.ImportSpecifier.t
403  def import_specifier(imported, local \\ nil, loc \\ nil) do
404    %ESTree.ImportSpecifier{
405      local: local, imported: imported, loc: loc
406    }
407  end
408
409  @spec labeled_statement(
410    ESTree.Identifier.t,
411    ESTree.Statement.t,
412    ESTree.SourceLocation.t | nil
413  ) :: ESTree.LabeledStatement.t
414  def labeled_statement(label, body, loc \\ nil) do
415    %ESTree.LabeledStatement{
416      label: label, body: body, loc: loc
417    }
418  end
419
420  @spec literal(
421    binary | boolean | number | nil,
422    ESTree.Regex.t | nil,
423    ESTree.SourceLocation.t | nil
424  ) :: ESTree.Literal.t
425  def literal(value, regex \\ nil, loc \\ nil) do
426    %ESTree.Literal{
427      value: value, regex: regex, loc: loc
428    }
429  end
430
431  @spec logical_expression(
432    ESTree.logical_operator,
433    ESTree.Expression.t,
434    ESTree.Expression.t,
435    ESTree.SourceLocation.t | nil
436  ) :: ESTree.LogicalExpression.t
437  def logical_expression(operator, left, right, loc \\ nil) do
438    %ESTree.LogicalExpression{
439      operator: operator, left: left, right: right, loc: loc
440    }
441  end
442
443  @spec member_expression(
444     ESTree.Expression.t | ESTree.Super.t,
445    ESTree.Identifier.t | ESTree.Expression.t,
446    boolean,
447    ESTree.SourceLocation.t | nil
448  ) :: ESTree.MemberExpression.t
449  def member_expression(object, property, computed \\ false, loc \\ nil) do
450    %ESTree.MemberExpression{
451      object: object, property: property, computed: computed, loc: loc
452    }
453  end
454
455  @spec meta_property(
456    ESTree.Identifier.t,
457    ESTree.Identifier.t,
458    ESTree.SourceLocation.t | nil
459  ) :: ESTree.MetaProperty.t
460  def meta_property(meta, property, loc \\ nil) do
461    %ESTree.MetaProperty{
462      meta: meta, property: property, loc: loc
463    }
464  end
465
466  @spec method_definition(
467    ESTree.Identifier.t,
468    ESTree.FunctionExpression.t,
469    :constructor | :method | :get | :set,
470    boolean,
471    boolean,
472    ESTree.SourceLocation.t | nil
473  ) :: ESTree.MethodDefinition.t
474  def method_definition(key, value, kind \\ :method, computed \\ false, static \\ false, loc \\ nil) do
475    %ESTree.MethodDefinition{
476      key: key, value: value, kind: kind, computed: computed, static: static, loc: loc
477    }
478  end
479
480  @spec new_expression(
481    ESTree.Expression.t,
482    [ESTree.Expression.t],
483    ESTree.SourceLocation.t | nil
484  ) :: ESTree.NewExpression.t
485  def new_expression(callee, arguments, loc \\ nil) do
486    %ESTree.NewExpression{
487      callee: callee, arguments: arguments, loc: loc
488    }
489  end
490
491  @spec object_expression(
492    [ESTree.Property.t],
493    ESTree.SourceLocation.t | nil
494  ) :: ESTree.ObjectExpression.t
495  def object_expression(properties, loc \\ nil) do
496    %ESTree.ObjectExpression{
497      properties: properties, loc: loc
498    }
499  end
500
501  @spec object_pattern(
502    [ESTree.Property.t],
503    ESTree.SourceLocation.t | nil
504  ) :: ESTree.ObjectPattern.t
505  def object_pattern(properties, loc \\ nil) do
506    %ESTree.ObjectPattern{
507      properties: properties, loc: loc
508    }
509  end
510
511  @spec position(
512    pos_integer,
513    non_neg_integer
514  ) :: ESTree.Position.t
515  def position(line, column) do
516    %ESTree.Position{
517      line: line, column: column
518    }
519  end
520
521  @spec program(
522    [ESTree.Statement.t],
523    :script | :module,
524    ESTree.SourceLocation.t | nil
525  ) :: ESTree.Program.t
526  def program(body, sourceType \\ :script, loc \\ nil) do
527    %ESTree.Program{
528      body: body, loc: loc, sourceType: sourceType
529    }
530  end
531
532  @spec property(
533    ESTree.Expression.t,
534    ESTree.Expression.t ,
535    :init | :get | :set,
536    boolean,
537    boolean,
538    boolean,
539    ESTree.SourceLocation.t | nil
540  ) :: ESTree.Property.t
541  def property(key, value, kind \\ :init, shorthand \\ false, method \\ false, computed \\false, loc \\ nil) do
542    %ESTree.Property{
543      key: key, value: value,
544      kind: kind, shorthand: shorthand, method: method,
545      loc: loc, computed: computed
546    }
547  end
548
549  @spec regex(
550    binary,
551    binary
552  ) :: ESTree.Regex.t
553  def regex(pattern, flags) do
554    %ESTree.Regex{
555      pattern: pattern, flags: flags
556    }
557  end
558
559  @spec rest_element(
560    ESTree.Expression.t | nil,
561    ESTree.SourceLocation.t | nil
562  ) :: ESTree.RestElement.t
563  def rest_element(argument, loc \\ nil) do
564    %ESTree.RestElement{
565      argument: argument, loc: loc
566    }
567  end
568
569  @spec return_statement(
570    ESTree.Expression.t | nil,
571    ESTree.SourceLocation.t | nil
572  ) :: ESTree.ReturnStatement.t
573  def return_statement(argument, loc \\ nil) do
574    %ESTree.ReturnStatement{
575      argument: argument, loc: loc
576    }
577  end
578
579  @spec sequence_expression(
580    [ESTree.Expression.t],
581    ESTree.SourceLocation.t | nil
582  ) :: ESTree.SequenceExpression.t
583  def sequence_expression(expressions, loc \\ nil) do
584    %ESTree.SequenceExpression{
585      expressions: expressions, loc: loc
586    }
587  end
588
589  @spec source_location(
590    binary | nil,
591    ESTree.Position.t,
592    ESTree.Position.t
593  ) :: ESTree.SourceLocation.t
594  def source_location(source, start, the_end) do
595    %ESTree.SourceLocation{
596      source: source, start: start, end: the_end
597    }
598  end
599
600  @spec spread_element(
601    ESTree.Expression.t | nil,
602    ESTree.SourceLocation.t | nil
603  ) :: ESTree.SpreadElement.t
604  def spread_element(argument, loc \\ nil) do
605    %ESTree.SpreadElement{
606      argument: argument, loc: loc
607    }
608  end
609
610  @spec super(
611    ESTree.SourceLocation.t | nil
612  ) :: ESTree.Super.t
613  def super(loc \\ nil) do
614    %ESTree.Super{
615      loc: loc
616    }
617  end
618
619  @spec switch_case(
620    ESTree.Expression.t | nil,
621    [ESTree.Statement.t],
622    ESTree.SourceLocation.t | nil
623  ) :: ESTree.SwitchCase.t
624  def switch_case(test, consequent, loc \\ nil) do
625    %ESTree.SwitchCase{
626      test: test, consequent: consequent, loc: loc
627    }
628  end
629
630  @spec switch_statement(
631    ESTree.Expression.t,
632    [ESTree.SwitchCase.t],
633    ESTree.SourceLocation.t | nil
634  ) :: ESTree.SwitchStatement.t
635  def switch_statement(discriminant, cases, loc \\ nil) do
636    %ESTree.SwitchStatement{
637      discriminant: discriminant, cases: cases, loc: loc
638    }
639  end
640
641  @spec tagged_template_expression(
642    ESTree.Expression.t,
643    ESTree.TemplateLiteral.t,
644    ESTree.SourceLocation.t | nil
645  ) :: ESTree.TaggedTemplateExpression.t
646  def tagged_template_expression(tag, quasi, loc \\ nil) do
647    %ESTree.TaggedTemplateExpression{
648      tag: tag, quasi: quasi, loc: loc
649    }
650  end
651
652  @spec template_element(
653    binary,
654    binary,
655    boolean,
656    ESTree.SourceLocation.t | nil
657  ) :: ESTree.TemplateElement.t
658  def template_element(raw, cooked_value, tail, loc \\ nil) do
659    %ESTree.TemplateElement{
660      value: %{cooked: cooked_value, raw: raw}, tail: tail, loc: loc
661    }
662  end
663
664  @spec template_literal(
665    [ESTree.TemplateElement.t],
666    [ESTree.Expression.t],
667    ESTree.SourceLocation.t | nil
668  ) :: ESTree.TemplateLiteral.t
669  def template_literal(quasis, expressions, loc \\ nil) do
670    %ESTree.TemplateLiteral{
671      quasis: quasis, expressions: expressions, loc: loc
672    }
673  end
674
675  @spec this_expression(
676    ESTree.SourceLocation.t | nil
677  ) :: ESTree.ThisExpression.t
678  def this_expression(loc \\ nil) do
679    %ESTree.ThisExpression{
680      loc: loc
681    }
682  end
683
684  @spec throw_statement(
685    ESTree.Expression.t,
686    ESTree.SourceLocation.t | nil
687  ) :: ESTree.ThrowStatement.t
688  def throw_statement(argument, loc \\ nil) do
689    %ESTree.ThrowStatement{
690      argument: argument, loc: loc
691    }
692  end
693
694  @spec try_statement(
695    ESTree.BlockStatement.t,
696    ESTree.CatchClause.t | nil,
697    ESTree.BlockStatement.t | nil,
698    ESTree.SourceLocation.t | nil
699  ) :: ESTree.TryStatement.t
700  def try_statement(block, handler, finalizer \\ nil, loc \\ nil) do
701    %ESTree.TryStatement{
702      block: block, handler: handler, finalizer: finalizer, loc: loc
703    }
704  end
705
706  @spec unary_expression(
707    ESTree.unary_operator,
708    boolean,
709    ESTree.Expression.t,
710    ESTree.SourceLocation.t | nil
711  ) :: ESTree.UnaryExpression.t
712  def unary_expression(operator, prefix, argument, loc \\ nil) do
713    %ESTree.UnaryExpression{
714      operator: operator, prefix: prefix, argument: argument, loc: loc
715    }
716  end
717
718  @spec update_expression(
719    ESTree.update_operator,
720    ESTree.Expression.t,
721    boolean,
722    ESTree.SourceLocation.t | nil
723  ) :: ESTree.UpdateExpression.t
724  def update_expression(operator, argument, prefix, loc \\ nil) do
725    %ESTree.UpdateExpression{
726      operator: operator, prefix: prefix, argument: argument, loc: loc
727    }
728  end
729
730
731  @spec variable_declaration(
732    [ESTree.VariableDeclarator.t],
733    :var | :let | :const,
734    ESTree.SourceLocation.t | nil
735  ) :: ESTree.VariableDeclaration.t
736  def variable_declaration(declarations, kind \\ :var, loc \\ nil) do
737    %ESTree.VariableDeclaration{
738      declarations: declarations, kind: kind, loc: loc
739    }
740  end
741
742  @spec variable_declarator(
743    ESTree.Pattern.t,
744    ESTree.Expression.t | nil,
745    ESTree.SourceLocation.t | nil
746  ) :: ESTree.VariableDeclarator.t
747  def variable_declarator(id, init \\ nil, loc \\ nil) do
748    %ESTree.VariableDeclarator{
749      id: id, init: init, loc: loc
750    }
751  end
752
753  @spec while_statement(
754    ESTree.Expression.t,
755    ESTree.Statement.t,
756    ESTree.SourceLocation.t | nil
757  ) :: ESTree.WhileStatement.t
758  def while_statement(test, body, loc \\ nil) do
759    %ESTree.WhileStatement{
760      test: test, body: body, loc: loc
761    }
762  end
763
764  @spec with_statement(
765    ESTree.Expression.t,
766    ESTree.Statement.t,
767    ESTree.SourceLocation.t | nil
768  ) :: ESTree.WithStatement.t
769  def with_statement(object, body, loc \\ nil) do
770    %ESTree.WithStatement{
771      object: object, body: body, loc: loc
772    }
773  end
774
775  @spec yield_expression(
776    ESTree.Expression.t | nil,
777    boolean,
778    ESTree.SourceLocation.t | nil
779  ) :: ESTree.YieldExpression.t
780  def yield_expression(argument \\ nil, delegate \\ false,  loc \\ nil) do
781    %ESTree.YieldExpression{
782      argument: argument, loc: loc, delegate: delegate
783    }
784  end
785
786
787  @spec jsx_identifier(
788    binary,
789    ESTree.SourceLocation.t | nil
790  ) :: ESTree.JSXIdentifier.t
791  def jsx_identifier(name, loc \\ nil) do
792    %ESTree.JSXIdentifier{
793      name: name, loc: loc
794    }
795  end
796
797
798  @spec jsx_member_expression(
799    ESTree.JSXMemberExpression.t | ESTree.JSXIdentifier.t,
800    ESTree.JSXIdentifier.t,
801    ESTree.SourceLocation.t | nil
802  ) :: ESTree.MemberExpression.t
803  def jsx_member_expression(object, property, loc \\ nil) do
804    %ESTree.JSXMemberExpression{
805      object: object, property: property, loc: loc
806    }
807  end
808
809  @spec jsx_namespaced_name(
810    ESTree.JSXIdentifier.t,
811    ESTree.JSXIdentifier.t,
812    ESTree.SourceLocation.t | nil
813  ) :: ESTree.JSXNamespacedName.t
814  def jsx_namespaced_name(namespace, name, loc \\ nil) do
815    %ESTree.JSXNamespacedName{
816      namespace: namespace, name: name, loc: loc
817    }
818  end
819
820  @spec jsx_empty_expression(
821    ESTree.SourceLocation.t | nil
822  ) :: ESTree.JSXEmptyExpression.t
823  def jsx_empty_expression(loc \\ nil) do
824    %ESTree.JSXEmptyExpression{
825      loc: loc
826    }
827  end
828
829  @spec jsx_expression_container(
830    ESTree.Expression.t | ESTree.JSXEmptyExpression.t,
831    ESTree.SourceLocation.t | nil
832  ) :: ESTree.JSXExpressionContainer.t
833  def jsx_expression_container(expression, loc \\ nil) do
834    %ESTree.JSXExpressionContainer{
835      expression: expression, loc: loc
836    }
837  end
838
839
840  @spec jsx_opening_element(
841    ESTree.JSXIdentifier.t | ESTree.JSXMemberExpression.t | ESTree.JSXNamespacedName.t,
842    [ ESTree.JSXAttribute.t | ESTree.JSXSpreadAttribute.t ],
843    boolean,
844    ESTree.SourceLocation.t | nil
845  ) :: ESTree.JSXOpeningElement.t
846  def jsx_opening_element(name, attributes \\ [], selfClosing \\ false, loc \\ nil) do
847    %ESTree.JSXOpeningElement{
848      name: name, attributes: attributes, selfClosing: selfClosing, loc: loc
849    }
850  end
851
852
853  @spec jsx_closing_element(
854    ESTree.JSXIdentifier.t | ESTree.JSXMemberExpression.t | ESTree.JSXNamespacedName.t,
855    ESTree.SourceLocation.t | nil
856  ) :: ESTree.JSXClosingElement.t
857  def jsx_closing_element(name, loc \\ nil) do
858    %ESTree.JSXClosingElement{
859      name: name, loc: loc
860    }
861  end
862
863
864  @spec jsx_attribute(
865    ESTree.JSXIdentifier.t | ESTree.JSXNamespacedName.t,
866    ESTree.Literal.t | ESTree.JSXExpressionContainer.t | ESTree.JSXElement.t | nil,
867    ESTree.SourceLocation.t | nil
868  ) :: ESTree.JSXAttribute.t
869  def jsx_attribute(name, value \\ nil, loc \\ nil) do
870    %ESTree.JSXAttribute{
871      name: name, value: value, loc: loc
872    }
873  end
874
875  @spec jsx_spread_attribute(
876    ESTree.Expression.t | nil,
877    ESTree.SourceLocation.t | nil
878  ) :: ESTree.SpreadElement.t
879  def jsx_spread_attribute(argument, loc \\ nil) do
880    %ESTree.JSXSpreadAttribute{
881      argument: argument, loc: loc
882    }
883  end
884
885  @spec jsx_element(
886    ESTree.JSXOpeningElement.t,
887    [ESTree.Literal.t | ESTree.JSXExpressionContainer.t | ESTree.JSXElement.t],
888    ESTree.JSXClosingElement.t | nil,
889    ESTree.SourceLocation.t | nil
890  ) :: ESTree.JSXElement.t
891  def jsx_element(openingElement, children \\ [], closingElement \\ nil, loc \\ nil) do
892    %ESTree.JSXElement{
893      openingElement: openingElement, children: children, closingElement: closingElement, loc: loc
894    }
895  end
896end
897