Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80657 views
1
/*
2
Copyright (C) 2012 Ariya Hidayat <[email protected]>
3
Copyright (C) 2012 Mathias Bynens <[email protected]>
4
Copyright (C) 2012 Joost-Wim Boekesteijn <[email protected]>
5
Copyright (C) 2012 Kris Kowal <[email protected]>
6
Copyright (C) 2012 Yusuke Suzuki <[email protected]>
7
Copyright (C) 2012 Arpad Borsos <[email protected]>
8
Copyright (C) 2011 Ariya Hidayat <[email protected]>
9
10
Redistribution and use in source and binary forms, with or without
11
modification, are permitted provided that the following conditions are met:
12
13
* Redistributions of source code must retain the above copyright
14
notice, this list of conditions and the following disclaimer.
15
* Redistributions in binary form must reproduce the above copyright
16
notice, this list of conditions and the following disclaimer in the
17
documentation and/or other materials provided with the distribution.
18
19
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
23
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
*/
30
31
/*jslint bitwise:true */
32
/*global escodegen:true, exports:true, generateStatement: true*/
33
34
(function (exports) {
35
'use strict';
36
37
var Syntax,
38
Precedence,
39
BinaryPrecedence,
40
base,
41
indent,
42
extra,
43
parse;
44
45
Syntax = {
46
AssignmentExpression: 'AssignmentExpression',
47
ArrayExpression: 'ArrayExpression',
48
BlockStatement: 'BlockStatement',
49
BinaryExpression: 'BinaryExpression',
50
BreakStatement: 'BreakStatement',
51
CallExpression: 'CallExpression',
52
CatchClause: 'CatchClause',
53
ConditionalExpression: 'ConditionalExpression',
54
ContinueStatement: 'ContinueStatement',
55
DoWhileStatement: 'DoWhileStatement',
56
DebuggerStatement: 'DebuggerStatement',
57
EmptyStatement: 'EmptyStatement',
58
ExpressionStatement: 'ExpressionStatement',
59
ForStatement: 'ForStatement',
60
ForInStatement: 'ForInStatement',
61
FunctionDeclaration: 'FunctionDeclaration',
62
FunctionExpression: 'FunctionExpression',
63
Identifier: 'Identifier',
64
IfStatement: 'IfStatement',
65
Literal: 'Literal',
66
LabeledStatement: 'LabeledStatement',
67
LogicalExpression: 'LogicalExpression',
68
MemberExpression: 'MemberExpression',
69
NewExpression: 'NewExpression',
70
ObjectExpression: 'ObjectExpression',
71
Program: 'Program',
72
Property: 'Property',
73
ReturnStatement: 'ReturnStatement',
74
SequenceExpression: 'SequenceExpression',
75
SwitchStatement: 'SwitchStatement',
76
SwitchCase: 'SwitchCase',
77
ThisExpression: 'ThisExpression',
78
ThrowStatement: 'ThrowStatement',
79
TryStatement: 'TryStatement',
80
UnaryExpression: 'UnaryExpression',
81
UpdateExpression: 'UpdateExpression',
82
VariableDeclaration: 'VariableDeclaration',
83
VariableDeclarator: 'VariableDeclarator',
84
WhileStatement: 'WhileStatement',
85
WithStatement: 'WithStatement'
86
};
87
88
Precedence = {
89
Sequence: 0,
90
Assignment: 1,
91
Conditional: 2,
92
LogicalOR: 3,
93
LogicalAND: 4,
94
LogicalXOR: 5,
95
BitwiseOR: 6,
96
BitwiseAND: 7,
97
Equality: 8,
98
Relational: 9,
99
BitwiseSHIFT: 10,
100
Additive: 11,
101
Multiplicative: 12,
102
Unary: 13,
103
Postfix: 14,
104
Call: 15,
105
New: 16,
106
Member: 17,
107
Primary: 18
108
};
109
110
BinaryPrecedence = {
111
'||': Precedence.LogicalOR,
112
'&&': Precedence.LogicalAND,
113
'^': Precedence.LogicalXOR,
114
'|': Precedence.BitwiseOR,
115
'&': Precedence.BitwiseAND,
116
'==': Precedence.Equality,
117
'!=': Precedence.Equality,
118
'===': Precedence.Equality,
119
'!==': Precedence.Equality,
120
'<': Precedence.Relational,
121
'>': Precedence.Relational,
122
'<=': Precedence.Relational,
123
'>=': Precedence.Relational,
124
'in': Precedence.Relational,
125
'instanceof': Precedence.Relational,
126
'<<': Precedence.BitwiseSHIFT,
127
'>>': Precedence.BitwiseSHIFT,
128
'>>>': Precedence.BitwiseSHIFT,
129
'+': Precedence.Additive,
130
'-': Precedence.Additive,
131
'*': Precedence.Multiplicative,
132
'%': Precedence.Multiplicative,
133
'/': Precedence.Multiplicative
134
};
135
136
if (typeof Object.freeze === 'function') {
137
Object.freeze(Syntax);
138
Object.freeze(Precedence);
139
Object.freeze(BinaryPrecedence);
140
}
141
142
function unicodeEscape(ch) {
143
var result, i;
144
result = ch.charCodeAt(0).toString(16);
145
for (i = result.length; i < 4; i += 1) {
146
result = '0' + result;
147
}
148
return '\\u' + result;
149
}
150
151
function stringToArray(str) {
152
var length = str.length,
153
result = [],
154
i;
155
for (i = 0; i < length; i += 1) {
156
result[i] = str.charAt(i);
157
}
158
return result;
159
}
160
161
function escapeString(str) {
162
var result = '', i, len, ch;
163
164
if (typeof str[0] === 'undefined') {
165
str = stringToArray(str);
166
}
167
168
for (i = 0, len = str.length; i < len; i += 1) {
169
ch = str[i];
170
if ('\'\\\b\f\n\r\t'.indexOf(ch) >= 0) {
171
result += '\\';
172
switch (ch) {
173
case '\'':
174
result += '\'';
175
break;
176
case '\\':
177
result += '\\';
178
break;
179
case '\b':
180
result += 'b';
181
break;
182
case '\f':
183
result += 'f';
184
break;
185
case '\n':
186
result += 'n';
187
break;
188
case '\r':
189
result += 'r';
190
break;
191
case '\t':
192
result += 't';
193
break;
194
}
195
} else if (ch < ' ' || ch.charCodeAt(0) >= 0x80) {
196
result += unicodeEscape(ch);
197
} else {
198
result += ch;
199
}
200
}
201
202
return '\'' + result + '\'';
203
}
204
205
function addIndent(stmt) {
206
return base + stmt;
207
}
208
209
function parenthesize(text, current, should) {
210
return (current < should) ? '(' + text + ')' : text;
211
}
212
213
function maybeBlock(stmt, suffix) {
214
var previousBase, result;
215
216
if (stmt.type === Syntax.BlockStatement) {
217
result = ' ' + generateStatement(stmt);
218
if (suffix) {
219
return result + ' ';
220
}
221
return result;
222
}
223
224
if (stmt.type === Syntax.EmptyStatement) {
225
result = ';';
226
} else {
227
previousBase = base;
228
base += indent;
229
result = '\n' + addIndent(generateStatement(stmt));
230
base = previousBase;
231
}
232
233
if (suffix) {
234
return result + '\n' + addIndent('');
235
}
236
return result;
237
}
238
239
function generateFunctionBody(node) {
240
var result, i, len;
241
result = '(';
242
for (i = 0, len = node.params.length; i < len; i += 1) {
243
result += node.params[i].name;
244
if ((i + 1) < len) {
245
result += ', ';
246
}
247
}
248
return result + ')' + maybeBlock(node.body);
249
}
250
251
function generateExpression(expr, precedence) {
252
var result, currentPrecedence, previousBase, i, len, raw;
253
254
if (!precedence) {
255
precedence = Precedence.Sequence;
256
}
257
258
switch (expr.type) {
259
case Syntax.SequenceExpression:
260
result = '';
261
for (i = 0, len = expr.expressions.length; i < len; i += 1) {
262
result += generateExpression(expr.expressions[i], Precedence.Assignment);
263
if ((i + 1) < len) {
264
result += ', ';
265
}
266
}
267
result = parenthesize(result, Precedence.Sequence, precedence);
268
break;
269
270
case Syntax.AssignmentExpression:
271
result = parenthesize(
272
generateExpression(expr.left, Precedence.Call) + ' ' + expr.operator + ' ' +
273
generateExpression(expr.right, Precedence.Assignment),
274
Precedence.Assignment,
275
precedence
276
);
277
break;
278
279
case Syntax.ConditionalExpression:
280
result = parenthesize(
281
generateExpression(expr.test, Precedence.LogicalOR) + ' ? ' +
282
generateExpression(expr.consequent, Precedence.Assignment) + ' : ' +
283
generateExpression(expr.alternate, Precedence.Assignment),
284
Precedence.Conditional,
285
precedence
286
);
287
break;
288
289
case Syntax.LogicalExpression:
290
case Syntax.BinaryExpression:
291
currentPrecedence = BinaryPrecedence[expr.operator];
292
293
result = generateExpression(expr.left, currentPrecedence) +
294
' ' + expr.operator + ' ' +
295
generateExpression(expr.right, currentPrecedence + 1);
296
if (expr.operator === 'in') {
297
// TODO parenthesize only in allowIn = false case
298
result = '(' + result + ')';
299
} else {
300
result = parenthesize(result, currentPrecedence, precedence);
301
}
302
break;
303
304
case Syntax.CallExpression:
305
result = '';
306
for (i = 0, len = expr['arguments'].length; i < len; i += 1) {
307
result += generateExpression(expr['arguments'][i], Precedence.Assignment);
308
if ((i + 1) < len) {
309
result += ', ';
310
}
311
}
312
result = parenthesize(
313
generateExpression(expr.callee, Precedence.Call) + '(' + result + ')',
314
Precedence.Call,
315
precedence
316
);
317
break;
318
319
case Syntax.NewExpression:
320
result = '';
321
for (i = 0, len = expr['arguments'].length; i < len; i += 1) {
322
result += generateExpression(expr['arguments'][i], Precedence.Assignment);
323
if ((i + 1) < len) {
324
result += ', ';
325
}
326
}
327
result = parenthesize(
328
'new ' + generateExpression(expr.callee, Precedence.New) + '(' + result + ')',
329
Precedence.New,
330
precedence
331
);
332
break;
333
334
case Syntax.MemberExpression:
335
result = generateExpression(expr.object, Precedence.Call);
336
if (expr.computed) {
337
result += '[' + generateExpression(expr.property) + ']';
338
} else {
339
if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') {
340
if (result.indexOf('.') < 0) {
341
if (!/[eExX]/.test(result) && !(result.length >= 2 && result[0] === '0')) {
342
result += '.';
343
}
344
}
345
}
346
result += '.' + expr.property.name;
347
}
348
result = parenthesize(result, Precedence.Member, precedence);
349
break;
350
351
case Syntax.UnaryExpression:
352
result = expr.operator;
353
if (result.length > 2) {
354
result += ' ';
355
}
356
result = parenthesize(
357
result + generateExpression(expr.argument, Precedence.Unary +
358
(
359
expr.argument.type === Syntax.UnaryExpression &&
360
expr.operator.length < 3 &&
361
expr.argument.operator === expr.operator ? 1 : 0
362
)
363
),
364
Precedence.Unary,
365
precedence
366
);
367
break;
368
369
case Syntax.UpdateExpression:
370
if (expr.prefix) {
371
result = parenthesize(
372
expr.operator +
373
generateExpression(expr.argument, Precedence.Unary),
374
Precedence.Unary,
375
precedence
376
);
377
} else {
378
result = parenthesize(
379
generateExpression(expr.argument, Precedence.Postfix) +
380
expr.operator,
381
Precedence.Postfix,
382
precedence
383
);
384
}
385
break;
386
387
case Syntax.FunctionExpression:
388
result = 'function ';
389
if (expr.id) {
390
result += expr.id.name;
391
}
392
result += generateFunctionBody(expr);
393
break;
394
395
case Syntax.ArrayExpression:
396
if (!expr.elements.length) {
397
result = '[]';
398
break;
399
}
400
result = '[\n';
401
previousBase = base;
402
base += indent;
403
for (i = 0, len = expr.elements.length; i < len; i += 1) {
404
if (!expr.elements[i]) {
405
result += addIndent('');
406
if ((i + 1) === len) {
407
result += ',';
408
}
409
} else {
410
result += addIndent(generateExpression(expr.elements[i], Precedence.Assignment));
411
}
412
if ((i + 1) < len) {
413
result += ',\n';
414
}
415
}
416
base = previousBase;
417
result += '\n' + addIndent(']');
418
break;
419
420
case Syntax.Property:
421
if (expr.kind === 'get' || expr.kind === 'set') {
422
result = expr.kind + ' ' + generateExpression(expr.key) +
423
generateFunctionBody(expr.value);
424
} else {
425
result = generateExpression(expr.key) + ': ' +
426
generateExpression(expr.value, Precedence.Assignment);
427
}
428
break;
429
430
case Syntax.ObjectExpression:
431
if (!expr.properties.length) {
432
result = '{}';
433
break;
434
}
435
result = '{\n';
436
previousBase = base;
437
base += indent;
438
for (i = 0, len = expr.properties.length; i < len; i += 1) {
439
result += addIndent(generateExpression(expr.properties[i]));
440
if ((i + 1) < len) {
441
result += ',\n';
442
}
443
}
444
base = previousBase;
445
result += '\n' + addIndent('}');
446
break;
447
448
case Syntax.ThisExpression:
449
result = 'this';
450
break;
451
452
case Syntax.Identifier:
453
result = expr.name;
454
break;
455
456
case Syntax.Literal:
457
if (expr.hasOwnProperty('raw') && parse) {
458
try {
459
raw = parse(expr.raw).body[0].expression;
460
if (raw.type === Syntax.Literal) {
461
if (raw.value === expr.value) {
462
result = expr.raw;
463
break;
464
}
465
}
466
} catch (e) {
467
// not use raw property
468
}
469
}
470
471
if (expr.value === null) {
472
result = 'null';
473
break;
474
}
475
476
if (typeof expr.value === 'string') {
477
result = escapeString(expr.value);
478
break;
479
}
480
481
if (typeof expr.value === 'number' && expr.value === Infinity) {
482
// Infinity is variable
483
result = '1e+1000';
484
break;
485
}
486
487
result = expr.value.toString();
488
break;
489
490
default:
491
break;
492
}
493
494
if (result === undefined) {
495
throw new Error('Unknown expression type: ' + expr.type);
496
}
497
return result;
498
}
499
500
function generateStatement(stmt) {
501
var i, len, result, previousBase;
502
503
switch (stmt.type) {
504
case Syntax.BlockStatement:
505
result = '{\n';
506
507
previousBase = base;
508
base += indent;
509
for (i = 0, len = stmt.body.length; i < len; i += 1) {
510
result += addIndent(generateStatement(stmt.body[i])) + '\n';
511
}
512
base = previousBase;
513
514
result += addIndent('}');
515
break;
516
517
case Syntax.BreakStatement:
518
if (stmt.label) {
519
result = 'break ' + stmt.label.name + ';';
520
} else {
521
result = 'break;';
522
}
523
break;
524
525
case Syntax.ContinueStatement:
526
if (stmt.label) {
527
result = 'continue ' + stmt.label.name + ';';
528
} else {
529
result = 'continue;';
530
}
531
break;
532
533
case Syntax.DoWhileStatement:
534
result = 'do' + maybeBlock(stmt.body, true) + 'while (' + generateExpression(stmt.test) + ');';
535
break;
536
537
case Syntax.CatchClause:
538
previousBase = base;
539
base += indent;
540
result = ' catch (' + generateExpression(stmt.param) + ')';
541
base = previousBase;
542
result += maybeBlock(stmt.body);
543
break;
544
545
case Syntax.DebuggerStatement:
546
result = 'debugger;';
547
break;
548
549
case Syntax.EmptyStatement:
550
result = ';';
551
break;
552
553
case Syntax.ExpressionStatement:
554
result = generateExpression(stmt.expression);
555
// 12.4 '{', 'function' is not allowed in this position.
556
// wrap espression with parentheses
557
if (result[0] === '{' || result.indexOf('function ') === 0) {
558
result = '(' + result + ');';
559
} else {
560
result += ';';
561
}
562
break;
563
564
case Syntax.VariableDeclarator:
565
if (stmt.init) {
566
result = stmt.id.name + ' = ' + generateExpression(stmt.init, Precedence.Assignment);
567
} else {
568
result = stmt.id.name;
569
}
570
break;
571
572
case Syntax.VariableDeclaration:
573
result = stmt.kind + ' ';
574
// special path for
575
// var x = function () {
576
// };
577
if (stmt.declarations.length === 1 && stmt.declarations[0].init &&
578
stmt.declarations[0].init.type === Syntax.FunctionExpression) {
579
result += generateStatement(stmt.declarations[0]);
580
} else {
581
previousBase = base;
582
base += indent;
583
for (i = 0, len = stmt.declarations.length; i < len; i += 1) {
584
result += generateStatement(stmt.declarations[i]);
585
if ((i + 1) < len) {
586
result += ', ';
587
}
588
}
589
base = previousBase;
590
}
591
result += ';';
592
break;
593
594
case Syntax.ThrowStatement:
595
result = 'throw ' + generateExpression(stmt.argument) + ';';
596
break;
597
598
case Syntax.TryStatement:
599
result = 'try' + maybeBlock(stmt.block);
600
for (i = 0, len = stmt.handlers.length; i < len; i += 1) {
601
result += generateStatement(stmt.handlers[i]);
602
}
603
if (stmt.finalizer) {
604
result += ' finally' + maybeBlock(stmt.finalizer);
605
}
606
break;
607
608
case Syntax.SwitchStatement:
609
previousBase = base;
610
base += indent;
611
result = 'switch (' + generateExpression(stmt.discriminant) + ') {\n';
612
base = previousBase;
613
if (stmt.cases) {
614
for (i = 0, len = stmt.cases.length; i < len; i += 1) {
615
result += addIndent(generateStatement(stmt.cases[i])) + '\n';
616
}
617
}
618
result += addIndent('}');
619
break;
620
621
case Syntax.SwitchCase:
622
previousBase = base;
623
base += indent;
624
if (stmt.test) {
625
result = 'case ' + generateExpression(stmt.test) + ':';
626
} else {
627
result = 'default:';
628
}
629
630
i = 0;
631
len = stmt.consequent.length;
632
if (len && stmt.consequent[0].type === Syntax.BlockStatement) {
633
result += maybeBlock(stmt.consequent[0]);
634
i = 1;
635
}
636
637
for (; i < len; i += 1) {
638
result += '\n' + addIndent(generateStatement(stmt.consequent[i]));
639
}
640
641
base = previousBase;
642
break;
643
644
case Syntax.IfStatement:
645
if (stmt.alternate) {
646
if (stmt.alternate.type === Syntax.IfStatement) {
647
previousBase = base;
648
base += indent;
649
result = 'if (' + generateExpression(stmt.test) + ')';
650
base = previousBase;
651
result += maybeBlock(stmt.consequent, true) + 'else ' + generateStatement(stmt.alternate);
652
} else {
653
previousBase = base;
654
base += indent;
655
result = 'if (' + generateExpression(stmt.test) + ')';
656
base = previousBase;
657
result += maybeBlock(stmt.consequent, true) + 'else' + maybeBlock(stmt.alternate);
658
}
659
} else {
660
previousBase = base;
661
base += indent;
662
result = 'if (' + generateExpression(stmt.test) + ')';
663
base = previousBase;
664
result += maybeBlock(stmt.consequent);
665
}
666
break;
667
668
case Syntax.ForStatement:
669
previousBase = base;
670
base += indent;
671
result = 'for (';
672
if (stmt.init) {
673
if (stmt.init.type === Syntax.VariableDeclaration) {
674
result += generateStatement(stmt.init);
675
} else {
676
result += generateExpression(stmt.init) + ';';
677
}
678
} else {
679
result += ';';
680
}
681
682
if (stmt.test) {
683
result += ' ' + generateExpression(stmt.test) + ';';
684
} else {
685
result += ';';
686
}
687
688
if (stmt.update) {
689
result += ' ' + generateExpression(stmt.update) + ')';
690
} else {
691
result += ')';
692
}
693
base = previousBase;
694
695
result += maybeBlock(stmt.body);
696
break;
697
698
case Syntax.ForInStatement:
699
result = 'for (';
700
if (stmt.left.type === Syntax.VariableDeclaration) {
701
previousBase = base;
702
base += indent + indent;
703
result += stmt.left.kind + ' ' + generateStatement(stmt.left.declarations[0]);
704
base = previousBase;
705
} else {
706
previousBase = base;
707
base += indent;
708
result += generateExpression(stmt.left, Precedence.Call);
709
base = previousBase;
710
}
711
712
previousBase = base;
713
base += indent;
714
result += ' in ' + generateExpression(stmt.right) + ')';
715
base = previousBase;
716
result += maybeBlock(stmt.body);
717
break;
718
719
case Syntax.LabeledStatement:
720
result = stmt.label.name + ':' + maybeBlock(stmt.body);
721
break;
722
723
case Syntax.Program:
724
result = '';
725
for (i = 0, len = stmt.body.length; i < len; i += 1) {
726
result += generateStatement(stmt.body[i]);
727
if ((i + 1) < len) {
728
result += '\n';
729
}
730
}
731
break;
732
733
case Syntax.FunctionDeclaration:
734
result = 'function ';
735
if (stmt.id) {
736
result += stmt.id.name;
737
}
738
result += generateFunctionBody(stmt);
739
break;
740
741
case Syntax.ReturnStatement:
742
if (stmt.argument) {
743
result = 'return ' + generateExpression(stmt.argument) + ';';
744
} else {
745
result = 'return;';
746
}
747
break;
748
749
case Syntax.WhileStatement:
750
previousBase = base;
751
base += indent;
752
result = 'while (' + generateExpression(stmt.test) + ')';
753
base = previousBase;
754
result += maybeBlock(stmt.body);
755
break;
756
757
case Syntax.WithStatement:
758
previousBase = base;
759
base += indent;
760
result = 'with (' + generateExpression(stmt.object) + ')';
761
base = previousBase;
762
result += maybeBlock(stmt.body);
763
break;
764
765
default:
766
break;
767
}
768
769
if (result === undefined) {
770
throw new Error('Unknown statement type: ' + stmt.type);
771
}
772
return result;
773
}
774
775
function generate(node, options) {
776
if (typeof options !== 'undefined') {
777
base = options.base || '';
778
indent = options.indent || ' ';
779
parse = options.parse;
780
} else {
781
base = '';
782
indent = ' ';
783
parse = null;
784
}
785
786
switch (node.type) {
787
case Syntax.BlockStatement:
788
case Syntax.BreakStatement:
789
case Syntax.CatchClause:
790
case Syntax.ContinueStatement:
791
case Syntax.DoWhileStatement:
792
case Syntax.DebuggerStatement:
793
case Syntax.EmptyStatement:
794
case Syntax.ExpressionStatement:
795
case Syntax.ForStatement:
796
case Syntax.ForInStatement:
797
case Syntax.FunctionDeclaration:
798
case Syntax.IfStatement:
799
case Syntax.LabeledStatement:
800
case Syntax.Program:
801
case Syntax.ReturnStatement:
802
case Syntax.SwitchStatement:
803
case Syntax.SwitchCase:
804
case Syntax.ThrowStatement:
805
case Syntax.TryStatement:
806
case Syntax.VariableDeclaration:
807
case Syntax.VariableDeclarator:
808
case Syntax.WhileStatement:
809
case Syntax.WithStatement:
810
return generateStatement(node);
811
812
case Syntax.AssignmentExpression:
813
case Syntax.ArrayExpression:
814
case Syntax.BinaryExpression:
815
case Syntax.CallExpression:
816
case Syntax.ConditionalExpression:
817
case Syntax.FunctionExpression:
818
case Syntax.Identifier:
819
case Syntax.Literal:
820
case Syntax.LogicalExpression:
821
case Syntax.MemberExpression:
822
case Syntax.NewExpression:
823
case Syntax.ObjectExpression:
824
case Syntax.Property:
825
case Syntax.SequenceExpression:
826
case Syntax.ThisExpression:
827
case Syntax.UnaryExpression:
828
case Syntax.UpdateExpression:
829
return generateExpression(node);
830
831
default:
832
break;
833
}
834
throw new Error('Unknown node type: ' + node.type);
835
}
836
837
// Sync with package.json.
838
exports.version = '0.0.3-dev';
839
840
exports.generate = generate;
841
842
}(typeof exports === 'undefined' ? (escodegen = {}) : exports));
843
/* vim: set sw=4 ts=4 et tw=80 : */
844