json-as 1.0.0-alpha.2 → 1.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/.prettierignore +6 -0
  2. package/.prettierrc.json +0 -1
  3. package/CHANGELOG +23 -1
  4. package/README.md +33 -21
  5. package/as-test.config.json +1 -1
  6. package/asconfig.json +1 -29
  7. package/assembly/__tests__/array.spec.ts +67 -0
  8. package/assembly/__tests__/bool.spec.ts +4 -12
  9. package/assembly/__tests__/box.spec.ts +37 -0
  10. package/assembly/__tests__/date.spec.ts +38 -0
  11. package/assembly/__tests__/float.spec.ts +11 -21
  12. package/assembly/__tests__/integer.spec.ts +7 -9
  13. package/assembly/__tests__/null.spec.ts +12 -0
  14. package/assembly/__tests__/obj.spec.ts +137 -3
  15. package/assembly/__tests__/simd/string.spec.ts +21 -21
  16. package/assembly/__tests__/string.spec.ts +6 -4
  17. package/assembly/__tests__/test.spec.ts +120 -191
  18. package/assembly/deserialize/simple/bool.ts +5 -8
  19. package/assembly/deserialize/simple/date.ts +2 -2
  20. package/assembly/deserialize/simple/map.ts +1 -1
  21. package/assembly/deserialize/simple/object.ts +3 -1
  22. package/assembly/deserialize/simple/string.ts +4 -3
  23. package/assembly/globals/tables.ts +74 -416
  24. package/assembly/index.ts +48 -25
  25. package/assembly/serialize/simd/string.ts +11 -11
  26. package/assembly/serialize/simple/array.ts +5 -4
  27. package/assembly/serialize/simple/bool.ts +2 -2
  28. package/assembly/serialize/simple/date.ts +1 -1
  29. package/assembly/serialize/simple/integer.ts +6 -1
  30. package/assembly/serialize/simple/map.ts +6 -6
  31. package/assembly/serialize/simple/string.ts +3 -3
  32. package/assembly/test.ts +30 -15
  33. package/assembly/util/bytes.ts +1 -1
  34. package/assembly/util/snp.ts +2 -2
  35. package/modules/as-bs/assembly/index.ts +73 -92
  36. package/modules/test/assembly/index.ts +22 -0
  37. package/package.json +6 -10
  38. package/run-tests.sh +15 -0
  39. package/transform/lib/builder.js +1340 -1262
  40. package/transform/lib/index.js +582 -512
  41. package/transform/lib/index.js.map +1 -1
  42. package/transform/lib/linker.js +12 -10
  43. package/transform/lib/types.js +19 -19
  44. package/transform/lib/util.js +34 -34
  45. package/transform/lib/visitor.js +529 -526
  46. package/transform/src/index.ts +22 -16
@@ -1,1275 +1,1353 @@
1
1
  import { isTypeOmitted, operatorTokenToString, util } from "assemblyscript/dist/assemblyscript.js";
2
2
  import { Visitor } from "./visitor.js";
3
3
  function assert(isTruish, message = "assertion error") {
4
- if (!isTruish) throw new Error(message);
5
- return isTruish;
4
+ if (!isTruish)
5
+ throw new Error(message);
6
+ return isTruish;
6
7
  }
7
8
  export class ASTBuilder extends Visitor {
8
- static build(node) {
9
- var builder = new ASTBuilder();
10
- builder.visitNode(node);
11
- return builder.finish();
12
- }
13
- sb = [];
14
- indentLevel = 0;
15
- visitNode(node) {
16
- return this.visit(node);
17
- }
18
- visitSource(source) {
19
- var statements = source.statements;
20
- for (let i = 0, k = statements.length; i < k; ++i) {
21
- this.visitNodeAndTerminate(statements[i]);
22
- }
23
- }
24
- visitTypeNode(node) {
25
- switch (node.kind) {
26
- case 1: {
27
- this.visitNamedTypeNode(node);
28
- break;
29
- }
30
- case 2: {
31
- this.visitFunctionTypeNode(node);
32
- break;
33
- }
34
- default:
35
- assert(false);
36
- }
37
- }
38
- visitTypeName(node) {
39
- this.visitIdentifierExpression(node.identifier);
40
- var sb = this.sb;
41
- var current = node.next;
42
- while (current) {
43
- sb.push(".");
44
- this.visitIdentifierExpression(current.identifier);
45
- current = current.next;
46
- }
47
- }
48
- visitNamedTypeNode(node) {
49
- this.visitTypeName(node.name);
50
- var typeArguments = node.typeArguments;
51
- if (typeArguments) {
52
- let numTypeArguments = typeArguments.length;
53
- let sb = this.sb;
54
- if (numTypeArguments) {
55
- sb.push("<");
56
- this.visitTypeNode(typeArguments[0]);
57
- for (let i = 1; i < numTypeArguments; ++i) {
58
- sb.push(", ");
59
- this.visitTypeNode(typeArguments[i]);
60
- }
61
- sb.push(">");
62
- }
63
- if (node.isNullable) sb.push(" | null");
64
- }
65
- }
66
- visitFunctionTypeNode(node) {
67
- var isNullable = node.isNullable;
68
- var sb = this.sb;
69
- sb.push(isNullable ? "((" : "(");
70
- var explicitThisType = node.explicitThisType;
71
- if (explicitThisType) {
72
- sb.push("this: ");
73
- this.visitTypeNode(explicitThisType);
74
- }
75
- var parameters = node.parameters;
76
- var numParameters = parameters.length;
77
- if (numParameters) {
78
- if (explicitThisType) sb.push(", ");
79
- this.serializeParameter(parameters[0]);
80
- for (let i = 1; i < numParameters; ++i) {
81
- sb.push(", ");
82
- this.serializeParameter(parameters[i]);
83
- }
84
- }
85
- var returnType = node.returnType;
86
- if (returnType) {
87
- sb.push(") => ");
88
- this.visitTypeNode(returnType);
89
- } else {
90
- sb.push(") => void");
91
- }
92
- if (isNullable) sb.push(") | null");
93
- }
94
- visitTypeParameter(node) {
95
- this.visitIdentifierExpression(node.name);
96
- var extendsType = node.extendsType;
97
- if (extendsType) {
98
- this.sb.push(" extends ");
99
- this.visitTypeNode(extendsType);
100
- }
101
- var defaultType = node.defaultType;
102
- if (defaultType) {
103
- this.sb.push("=");
104
- this.visitTypeNode(defaultType);
105
- }
106
- }
107
- visitIdentifierExpression(node) {
108
- if (node.isQuoted) this.visitStringLiteral(node.text);
109
- else this.sb.push(node.text);
110
- }
111
- visitArrayLiteralExpression(node) {
112
- var sb = this.sb;
113
- sb.push("[");
114
- var elements = node.elementExpressions;
115
- var numElements = elements.length;
116
- if (numElements) {
117
- let element = elements[0];
118
- if (element) this.visitNode(element);
119
- for (let i = 1; i < numElements; ++i) {
120
- element = elements[i];
121
- sb.push(", ");
122
- if (element) this.visitNode(element);
123
- }
124
- }
125
- sb.push("]");
126
- }
127
- visitObjectLiteralExpression(node) {
128
- var sb = this.sb;
129
- var names = node.names;
130
- var values = node.values;
131
- var numElements = names.length;
132
- assert(numElements == values.length);
133
- if (numElements) {
134
- sb.push("{\n");
135
- util.indent(sb, ++this.indentLevel);
136
- this.visitNode(names[0]);
137
- sb.push(": ");
138
- this.visitNode(values[0]);
139
- for (let i = 1; i < numElements; ++i) {
140
- sb.push(",\n");
141
- util.indent(sb, this.indentLevel);
142
- let name = names[i];
143
- let value = values[i];
144
- if (name == value) {
145
- this.visitNode(name);
146
- } else {
147
- this.visitNode(name);
148
- sb.push(": ");
149
- this.visitNode(value);
150
- }
151
- }
152
- sb.push("\n");
153
- util.indent(sb, --this.indentLevel);
154
- sb.push("}");
155
- } else {
156
- sb.push("{}");
157
- }
158
- }
159
- visitAssertionExpression(node) {
160
- var sb = this.sb;
161
- switch (node.assertionKind) {
162
- case 0: {
163
- sb.push("<");
164
- if (node.toType) this.visitTypeNode(node.toType);
165
- sb.push(">");
9
+ static build(node) {
10
+ var builder = new ASTBuilder();
11
+ builder.visitNode(node);
12
+ return builder.finish();
13
+ }
14
+ sb = [];
15
+ indentLevel = 0;
16
+ visitNode(node) {
17
+ return this.visit(node);
18
+ }
19
+ visitSource(source) {
20
+ var statements = source.statements;
21
+ for (let i = 0, k = statements.length; i < k; ++i) {
22
+ this.visitNodeAndTerminate(statements[i]);
23
+ }
24
+ }
25
+ visitTypeNode(node) {
26
+ switch (node.kind) {
27
+ case 1: {
28
+ this.visitNamedTypeNode(node);
29
+ break;
30
+ }
31
+ case 2: {
32
+ this.visitFunctionTypeNode(node);
33
+ break;
34
+ }
35
+ default:
36
+ assert(false);
37
+ }
38
+ }
39
+ visitTypeName(node) {
40
+ this.visitIdentifierExpression(node.identifier);
41
+ var sb = this.sb;
42
+ var current = node.next;
43
+ while (current) {
44
+ sb.push(".");
45
+ this.visitIdentifierExpression(current.identifier);
46
+ current = current.next;
47
+ }
48
+ }
49
+ visitNamedTypeNode(node) {
50
+ this.visitTypeName(node.name);
51
+ var typeArguments = node.typeArguments;
52
+ if (typeArguments) {
53
+ let numTypeArguments = typeArguments.length;
54
+ let sb = this.sb;
55
+ if (numTypeArguments) {
56
+ sb.push("<");
57
+ this.visitTypeNode(typeArguments[0]);
58
+ for (let i = 1; i < numTypeArguments; ++i) {
59
+ sb.push(", ");
60
+ this.visitTypeNode(typeArguments[i]);
61
+ }
62
+ sb.push(">");
63
+ }
64
+ if (node.isNullable)
65
+ sb.push(" | null");
66
+ }
67
+ }
68
+ visitFunctionTypeNode(node) {
69
+ var isNullable = node.isNullable;
70
+ var sb = this.sb;
71
+ sb.push(isNullable ? "((" : "(");
72
+ var explicitThisType = node.explicitThisType;
73
+ if (explicitThisType) {
74
+ sb.push("this: ");
75
+ this.visitTypeNode(explicitThisType);
76
+ }
77
+ var parameters = node.parameters;
78
+ var numParameters = parameters.length;
79
+ if (numParameters) {
80
+ if (explicitThisType)
81
+ sb.push(", ");
82
+ this.serializeParameter(parameters[0]);
83
+ for (let i = 1; i < numParameters; ++i) {
84
+ sb.push(", ");
85
+ this.serializeParameter(parameters[i]);
86
+ }
87
+ }
88
+ var returnType = node.returnType;
89
+ if (returnType) {
90
+ sb.push(") => ");
91
+ this.visitTypeNode(returnType);
92
+ }
93
+ else {
94
+ sb.push(") => void");
95
+ }
96
+ if (isNullable)
97
+ sb.push(") | null");
98
+ }
99
+ visitTypeParameter(node) {
100
+ this.visitIdentifierExpression(node.name);
101
+ var extendsType = node.extendsType;
102
+ if (extendsType) {
103
+ this.sb.push(" extends ");
104
+ this.visitTypeNode(extendsType);
105
+ }
106
+ var defaultType = node.defaultType;
107
+ if (defaultType) {
108
+ this.sb.push("=");
109
+ this.visitTypeNode(defaultType);
110
+ }
111
+ }
112
+ visitIdentifierExpression(node) {
113
+ if (node.isQuoted)
114
+ this.visitStringLiteral(node.text);
115
+ else
116
+ this.sb.push(node.text);
117
+ }
118
+ visitArrayLiteralExpression(node) {
119
+ var sb = this.sb;
120
+ sb.push("[");
121
+ var elements = node.elementExpressions;
122
+ var numElements = elements.length;
123
+ if (numElements) {
124
+ let element = elements[0];
125
+ if (element)
126
+ this.visitNode(element);
127
+ for (let i = 1; i < numElements; ++i) {
128
+ element = elements[i];
129
+ sb.push(", ");
130
+ if (element)
131
+ this.visitNode(element);
132
+ }
133
+ }
134
+ sb.push("]");
135
+ }
136
+ visitObjectLiteralExpression(node) {
137
+ var sb = this.sb;
138
+ var names = node.names;
139
+ var values = node.values;
140
+ var numElements = names.length;
141
+ assert(numElements == values.length);
142
+ if (numElements) {
143
+ sb.push("{\n");
144
+ util.indent(sb, ++this.indentLevel);
145
+ this.visitNode(names[0]);
146
+ sb.push(": ");
147
+ this.visitNode(values[0]);
148
+ for (let i = 1; i < numElements; ++i) {
149
+ sb.push(",\n");
150
+ util.indent(sb, this.indentLevel);
151
+ let name = names[i];
152
+ let value = values[i];
153
+ if (name == value) {
154
+ this.visitNode(name);
155
+ }
156
+ else {
157
+ this.visitNode(name);
158
+ sb.push(": ");
159
+ this.visitNode(value);
160
+ }
161
+ }
162
+ sb.push("\n");
163
+ util.indent(sb, --this.indentLevel);
164
+ sb.push("}");
165
+ }
166
+ else {
167
+ sb.push("{}");
168
+ }
169
+ }
170
+ visitAssertionExpression(node) {
171
+ var sb = this.sb;
172
+ switch (node.assertionKind) {
173
+ case 0: {
174
+ sb.push("<");
175
+ if (node.toType)
176
+ this.visitTypeNode(node.toType);
177
+ sb.push(">");
178
+ this.visitNode(node.expression);
179
+ break;
180
+ }
181
+ case 1: {
182
+ this.visitNode(node.expression);
183
+ sb.push(" as ");
184
+ if (node.toType)
185
+ this.visitTypeNode(node.toType);
186
+ break;
187
+ }
188
+ case 2: {
189
+ this.visitNode(node.expression);
190
+ sb.push("!");
191
+ break;
192
+ }
193
+ case 3: {
194
+ this.visitNode(node.expression);
195
+ sb.push(" as const");
196
+ break;
197
+ }
198
+ default:
199
+ assert(false);
200
+ }
201
+ }
202
+ visitBinaryExpression(node) {
203
+ var sb = this.sb;
204
+ this.visitNode(node.left);
205
+ sb.push(" ");
206
+ sb.push(operatorTokenToString(node.operator));
207
+ sb.push(" ");
208
+ this.visitNode(node.right);
209
+ }
210
+ visitCallExpression(node) {
166
211
  this.visitNode(node.expression);
167
- break;
168
- }
169
- case 1: {
212
+ this.visitArguments(node.typeArguments, node.args);
213
+ }
214
+ visitArguments(typeArguments, args) {
215
+ var sb = this.sb;
216
+ if (typeArguments) {
217
+ let numTypeArguments = typeArguments.length;
218
+ if (numTypeArguments) {
219
+ sb.push("<");
220
+ this.visitTypeNode(typeArguments[0]);
221
+ for (let i = 1; i < numTypeArguments; ++i) {
222
+ sb.push(", ");
223
+ this.visitTypeNode(typeArguments[i]);
224
+ }
225
+ sb.push(">(");
226
+ }
227
+ }
228
+ else {
229
+ sb.push("(");
230
+ }
231
+ var numArgs = args.length;
232
+ if (numArgs) {
233
+ this.visitNode(args[0]);
234
+ for (let i = 1; i < numArgs; ++i) {
235
+ sb.push(", ");
236
+ this.visitNode(args[i]);
237
+ }
238
+ }
239
+ sb.push(")");
240
+ }
241
+ visitClassExpression(node) {
242
+ var declaration = node.declaration;
243
+ this.visitClassDeclaration(declaration);
244
+ }
245
+ visitCommaExpression(node) {
246
+ var expressions = node.expressions;
247
+ var numExpressions = expressions.length;
248
+ this.visitNode(expressions[0]);
249
+ var sb = this.sb;
250
+ for (let i = 1; i < numExpressions; ++i) {
251
+ sb.push(",");
252
+ this.visitNode(expressions[i]);
253
+ }
254
+ }
255
+ visitElementAccessExpression(node) {
256
+ var sb = this.sb;
170
257
  this.visitNode(node.expression);
171
- sb.push(" as ");
172
- if (node.toType) this.visitTypeNode(node.toType);
173
- break;
174
- }
175
- case 2: {
258
+ sb.push("[");
259
+ this.visitNode(node.elementExpression);
260
+ sb.push("]");
261
+ }
262
+ visitFunctionExpression(node) {
263
+ var declaration = node.declaration;
264
+ if (!declaration.arrowKind) {
265
+ if (declaration.name.text.length) {
266
+ this.sb.push("function ");
267
+ }
268
+ else {
269
+ this.sb.push("function");
270
+ }
271
+ }
272
+ else {
273
+ assert(declaration.name.text.length == 0);
274
+ }
275
+ this.visitFunctionCommon(declaration);
276
+ }
277
+ visitLiteralExpression(node) {
278
+ switch (node.literalKind) {
279
+ case 0: {
280
+ this.visitFloatLiteralExpression(node);
281
+ break;
282
+ }
283
+ case 1: {
284
+ this.visitIntegerLiteralExpression(node);
285
+ break;
286
+ }
287
+ case 2: {
288
+ this.visitStringLiteralExpression(node);
289
+ break;
290
+ }
291
+ case 3: {
292
+ this.visitTemplateLiteralExpression(node);
293
+ break;
294
+ }
295
+ case 4: {
296
+ this.visitRegexpLiteralExpression(node);
297
+ break;
298
+ }
299
+ case 5: {
300
+ this.visitArrayLiteralExpression(node);
301
+ break;
302
+ }
303
+ case 6: {
304
+ this.visitObjectLiteralExpression(node);
305
+ break;
306
+ }
307
+ default: {
308
+ assert(false);
309
+ break;
310
+ }
311
+ }
312
+ }
313
+ visitFloatLiteralExpression(node) {
314
+ this.sb.push(node.value.toString());
315
+ }
316
+ visitInstanceOfExpression(node) {
176
317
  this.visitNode(node.expression);
177
- sb.push("!");
178
- break;
179
- }
180
- case 3: {
318
+ this.sb.push(" instanceof ");
319
+ this.visitTypeNode(node.isType);
320
+ }
321
+ visitIntegerLiteralExpression(node) {
322
+ this.sb.push(i64_to_string(node.value));
323
+ }
324
+ visitStringLiteral(str) {
325
+ var sb = this.sb;
326
+ sb.push('"');
327
+ this.visitRawString(str, 34);
328
+ sb.push('"');
329
+ }
330
+ visitRawString(str, quote) {
331
+ var sb = this.sb;
332
+ var off = 0;
333
+ var i = 0;
334
+ for (let k = str.length; i < k;) {
335
+ switch (str.charCodeAt(i)) {
336
+ case 0: {
337
+ if (i > off)
338
+ sb.push(str.substring(off, (off = i + 1)));
339
+ sb.push("\\0");
340
+ off = ++i;
341
+ break;
342
+ }
343
+ case 92: {
344
+ if (i > off)
345
+ sb.push(str.substring(off, i));
346
+ off = ++i;
347
+ sb.push("\\b");
348
+ break;
349
+ }
350
+ case 9: {
351
+ if (i > off)
352
+ sb.push(str.substring(off, i));
353
+ off = ++i;
354
+ sb.push("\\t");
355
+ break;
356
+ }
357
+ case 10: {
358
+ if (i > off)
359
+ sb.push(str.substring(off, i));
360
+ off = ++i;
361
+ sb.push("\\n");
362
+ break;
363
+ }
364
+ case 11: {
365
+ if (i > off)
366
+ sb.push(str.substring(off, i));
367
+ off = ++i;
368
+ sb.push("\\v");
369
+ break;
370
+ }
371
+ case 12: {
372
+ if (i > off)
373
+ sb.push(str.substring(off, i));
374
+ off = ++i;
375
+ sb.push("\\f");
376
+ break;
377
+ }
378
+ case 13: {
379
+ if (i > off)
380
+ sb.push(str.substring(off, i));
381
+ sb.push("\\r");
382
+ off = ++i;
383
+ break;
384
+ }
385
+ case 34: {
386
+ if (quote == 34) {
387
+ if (i > off)
388
+ sb.push(str.substring(off, i));
389
+ sb.push('\\"');
390
+ off = ++i;
391
+ }
392
+ else {
393
+ ++i;
394
+ }
395
+ break;
396
+ }
397
+ case 39: {
398
+ if (quote == 39) {
399
+ if (i > off)
400
+ sb.push(str.substring(off, i));
401
+ sb.push("\\'");
402
+ off = ++i;
403
+ }
404
+ else {
405
+ ++i;
406
+ }
407
+ break;
408
+ }
409
+ case 92: {
410
+ if (i > off)
411
+ sb.push(str.substring(off, i));
412
+ sb.push("\\\\");
413
+ off = ++i;
414
+ break;
415
+ }
416
+ case 96: {
417
+ if (quote == 96) {
418
+ if (i > off)
419
+ sb.push(str.substring(off, i));
420
+ sb.push("\\`");
421
+ off = ++i;
422
+ }
423
+ else {
424
+ ++i;
425
+ }
426
+ break;
427
+ }
428
+ default: {
429
+ ++i;
430
+ break;
431
+ }
432
+ }
433
+ }
434
+ if (i > off)
435
+ sb.push(str.substring(off, i));
436
+ }
437
+ visitStringLiteralExpression(node) {
438
+ this.visitStringLiteral(node.value);
439
+ }
440
+ visitTemplateLiteralExpression(node) {
441
+ var sb = this.sb;
442
+ var tag = node.tag;
443
+ var parts = node.parts;
444
+ var expressions = node.expressions;
445
+ if (tag)
446
+ this.visitNode(tag);
447
+ sb.push("`");
448
+ this.visitRawString(parts[0], 96);
449
+ assert(parts.length == expressions.length + 1);
450
+ for (let i = 0, k = expressions.length; i < k; ++i) {
451
+ sb.push("${");
452
+ this.visitNode(expressions[i]);
453
+ sb.push("}");
454
+ this.visitRawString(parts[i + 1], 96);
455
+ }
456
+ sb.push("`");
457
+ }
458
+ visitRegexpLiteralExpression(node) {
459
+ var sb = this.sb;
460
+ sb.push("/");
461
+ sb.push(node.pattern);
462
+ sb.push("/");
463
+ sb.push(node.patternFlags);
464
+ }
465
+ visitNewExpression(node) {
466
+ this.sb.push("new ");
467
+ this.visitTypeName(node.typeName);
468
+ this.visitArguments(node.typeArguments, node.args);
469
+ }
470
+ visitParenthesizedExpression(node) {
471
+ var sb = this.sb;
472
+ sb.push("(");
181
473
  this.visitNode(node.expression);
182
- sb.push(" as const");
183
- break;
184
- }
185
- default:
186
- assert(false);
187
- }
188
- }
189
- visitBinaryExpression(node) {
190
- var sb = this.sb;
191
- this.visitNode(node.left);
192
- sb.push(" ");
193
- sb.push(operatorTokenToString(node.operator));
194
- sb.push(" ");
195
- this.visitNode(node.right);
196
- }
197
- visitCallExpression(node) {
198
- this.visitNode(node.expression);
199
- this.visitArguments(node.typeArguments, node.args);
200
- }
201
- visitArguments(typeArguments, args) {
202
- var sb = this.sb;
203
- if (typeArguments) {
204
- let numTypeArguments = typeArguments.length;
205
- if (numTypeArguments) {
206
- sb.push("<");
207
- this.visitTypeNode(typeArguments[0]);
208
- for (let i = 1; i < numTypeArguments; ++i) {
209
- sb.push(", ");
210
- this.visitTypeNode(typeArguments[i]);
211
- }
212
- sb.push(">(");
213
- }
214
- } else {
215
- sb.push("(");
216
- }
217
- var numArgs = args.length;
218
- if (numArgs) {
219
- this.visitNode(args[0]);
220
- for (let i = 1; i < numArgs; ++i) {
221
- sb.push(", ");
222
- this.visitNode(args[i]);
223
- }
224
- }
225
- sb.push(")");
226
- }
227
- visitClassExpression(node) {
228
- var declaration = node.declaration;
229
- this.visitClassDeclaration(declaration);
230
- }
231
- visitCommaExpression(node) {
232
- var expressions = node.expressions;
233
- var numExpressions = expressions.length;
234
- this.visitNode(expressions[0]);
235
- var sb = this.sb;
236
- for (let i = 1; i < numExpressions; ++i) {
237
- sb.push(",");
238
- this.visitNode(expressions[i]);
239
- }
240
- }
241
- visitElementAccessExpression(node) {
242
- var sb = this.sb;
243
- this.visitNode(node.expression);
244
- sb.push("[");
245
- this.visitNode(node.elementExpression);
246
- sb.push("]");
247
- }
248
- visitFunctionExpression(node) {
249
- var declaration = node.declaration;
250
- if (!declaration.arrowKind) {
251
- if (declaration.name.text.length) {
252
- this.sb.push("function ");
253
- } else {
254
- this.sb.push("function");
255
- }
256
- } else {
257
- assert(declaration.name.text.length == 0);
258
- }
259
- this.visitFunctionCommon(declaration);
260
- }
261
- visitLiteralExpression(node) {
262
- switch (node.literalKind) {
263
- case 0: {
264
- this.visitFloatLiteralExpression(node);
265
- break;
266
- }
267
- case 1: {
268
- this.visitIntegerLiteralExpression(node);
269
- break;
270
- }
271
- case 2: {
272
- this.visitStringLiteralExpression(node);
273
- break;
274
- }
275
- case 3: {
276
- this.visitTemplateLiteralExpression(node);
277
- break;
278
- }
279
- case 4: {
280
- this.visitRegexpLiteralExpression(node);
281
- break;
282
- }
283
- case 5: {
284
- this.visitArrayLiteralExpression(node);
285
- break;
286
- }
287
- case 6: {
288
- this.visitObjectLiteralExpression(node);
289
- break;
290
- }
291
- default: {
292
- assert(false);
293
- break;
294
- }
295
- }
296
- }
297
- visitFloatLiteralExpression(node) {
298
- this.sb.push(node.value.toString());
299
- }
300
- visitInstanceOfExpression(node) {
301
- this.visitNode(node.expression);
302
- this.sb.push(" instanceof ");
303
- this.visitTypeNode(node.isType);
304
- }
305
- visitIntegerLiteralExpression(node) {
306
- this.sb.push(i64_to_string(node.value));
307
- }
308
- visitStringLiteral(str) {
309
- var sb = this.sb;
310
- sb.push('"');
311
- this.visitRawString(str, 34);
312
- sb.push('"');
313
- }
314
- visitRawString(str, quote) {
315
- var sb = this.sb;
316
- var off = 0;
317
- var i = 0;
318
- for (let k = str.length; i < k; ) {
319
- switch (str.charCodeAt(i)) {
320
- case 0: {
321
- if (i > off) sb.push(str.substring(off, (off = i + 1)));
322
- sb.push("\\0");
323
- off = ++i;
324
- break;
325
- }
326
- case 92: {
327
- if (i > off) sb.push(str.substring(off, i));
328
- off = ++i;
329
- sb.push("\\b");
330
- break;
331
- }
332
- case 9: {
333
- if (i > off) sb.push(str.substring(off, i));
334
- off = ++i;
335
- sb.push("\\t");
336
- break;
337
- }
338
- case 10: {
339
- if (i > off) sb.push(str.substring(off, i));
340
- off = ++i;
341
- sb.push("\\n");
342
- break;
343
- }
344
- case 11: {
345
- if (i > off) sb.push(str.substring(off, i));
346
- off = ++i;
347
- sb.push("\\v");
348
- break;
349
- }
350
- case 12: {
351
- if (i > off) sb.push(str.substring(off, i));
352
- off = ++i;
353
- sb.push("\\f");
354
- break;
355
- }
356
- case 13: {
357
- if (i > off) sb.push(str.substring(off, i));
358
- sb.push("\\r");
359
- off = ++i;
360
- break;
361
- }
362
- case 34: {
363
- if (quote == 34) {
364
- if (i > off) sb.push(str.substring(off, i));
365
- sb.push('\\"');
366
- off = ++i;
367
- } else {
368
- ++i;
369
- }
370
- break;
371
- }
372
- case 39: {
373
- if (quote == 39) {
374
- if (i > off) sb.push(str.substring(off, i));
375
- sb.push("\\'");
376
- off = ++i;
377
- } else {
378
- ++i;
379
- }
380
- break;
381
- }
382
- case 92: {
383
- if (i > off) sb.push(str.substring(off, i));
384
- sb.push("\\\\");
385
- off = ++i;
386
- break;
387
- }
388
- case 96: {
389
- if (quote == 96) {
390
- if (i > off) sb.push(str.substring(off, i));
391
- sb.push("\\`");
392
- off = ++i;
393
- } else {
394
- ++i;
395
- }
396
- break;
397
- }
398
- default: {
399
- ++i;
400
- break;
401
- }
402
- }
403
- }
404
- if (i > off) sb.push(str.substring(off, i));
405
- }
406
- visitStringLiteralExpression(node) {
407
- this.visitStringLiteral(node.value);
408
- }
409
- visitTemplateLiteralExpression(node) {
410
- var sb = this.sb;
411
- var tag = node.tag;
412
- var parts = node.parts;
413
- var expressions = node.expressions;
414
- if (tag) this.visitNode(tag);
415
- sb.push("`");
416
- this.visitRawString(parts[0], 96);
417
- assert(parts.length == expressions.length + 1);
418
- for (let i = 0, k = expressions.length; i < k; ++i) {
419
- sb.push("${");
420
- this.visitNode(expressions[i]);
421
- sb.push("}");
422
- this.visitRawString(parts[i + 1], 96);
423
- }
424
- sb.push("`");
425
- }
426
- visitRegexpLiteralExpression(node) {
427
- var sb = this.sb;
428
- sb.push("/");
429
- sb.push(node.pattern);
430
- sb.push("/");
431
- sb.push(node.patternFlags);
432
- }
433
- visitNewExpression(node) {
434
- this.sb.push("new ");
435
- this.visitTypeName(node.typeName);
436
- this.visitArguments(node.typeArguments, node.args);
437
- }
438
- visitParenthesizedExpression(node) {
439
- var sb = this.sb;
440
- sb.push("(");
441
- this.visitNode(node.expression);
442
- sb.push(")");
443
- }
444
- visitPropertyAccessExpression(node) {
445
- this.visitNode(node.expression);
446
- this.sb.push(".");
447
- this.visitIdentifierExpression(node.property);
448
- }
449
- visitTernaryExpression(node) {
450
- var sb = this.sb;
451
- this.visitNode(node.condition);
452
- sb.push(" ? ");
453
- this.visitNode(node.ifThen);
454
- sb.push(" : ");
455
- this.visitNode(node.ifElse);
456
- }
457
- visitUnaryExpression(node) {
458
- switch (node.kind) {
459
- case 27: {
460
- this.visitUnaryPostfixExpression(node);
461
- break;
462
- }
463
- case 28: {
464
- this.visitUnaryPrefixExpression(node);
465
- break;
466
- }
467
- default:
468
- assert(false);
469
- }
470
- }
471
- visitUnaryPostfixExpression(node) {
472
- this.visitNode(node.operand);
473
- this.sb.push(operatorTokenToString(node.operator));
474
- }
475
- visitUnaryPrefixExpression(node) {
476
- this.sb.push(operatorTokenToString(node.operator));
477
- this.visitNode(node.operand);
478
- }
479
- visitNodeAndTerminate(node) {
480
- this.visitNode(node);
481
- var sb = this.sb;
482
- if (!sb.length || node.kind == 47 || node.kind == 38) {
483
- sb.push(";\n");
484
- } else {
485
- let last = sb[sb.length - 1];
486
- let lastCharPos = last.length - 1;
487
- if (lastCharPos >= 0 && (last.charCodeAt(lastCharPos) == 125 || last.charCodeAt(lastCharPos) == 59)) {
488
- sb.push("\n");
489
- } else {
490
- sb.push(";\n");
491
- }
492
- }
493
- }
494
- visitBlockStatement(node) {
495
- var sb = this.sb;
496
- var statements = node.statements;
497
- var numStatements = statements.length;
498
- if (numStatements) {
499
- sb.push("{\n");
500
- let indentLevel = ++this.indentLevel;
501
- for (let i = 0; i < numStatements; ++i) {
502
- util.indent(sb, indentLevel);
503
- this.visitNodeAndTerminate(statements[i]);
504
- }
505
- util.indent(sb, --this.indentLevel);
506
- sb.push("}");
507
- } else {
508
- sb.push("{}");
509
- }
510
- }
511
- visitBreakStatement(node) {
512
- var label = node.label;
513
- if (label) {
514
- this.sb.push("break ");
515
- this.visitIdentifierExpression(label);
516
- } else {
517
- this.sb.push("break");
518
- }
519
- }
520
- visitContinueStatement(node) {
521
- var label = node.label;
522
- if (label) {
523
- this.sb.push("continue ");
524
- this.visitIdentifierExpression(label);
525
- } else {
526
- this.sb.push("continue");
527
- }
528
- }
529
- visitClassDeclaration(node, isDefault = false) {
530
- var decorators = node.decorators;
531
- if (decorators) {
532
- for (let i = 0, k = decorators.length; i < k; ++i) {
533
- this.serializeDecorator(decorators[i]);
534
- }
535
- }
536
- var sb = this.sb;
537
- if (isDefault) {
538
- sb.push("export default ");
539
- } else {
540
- this.serializeExternalModifiers(node);
541
- }
542
- if (node.is(128)) sb.push("abstract ");
543
- if (node.name.text.length) {
544
- sb.push("class ");
545
- this.visitIdentifierExpression(node.name);
546
- } else {
547
- sb.push("class");
548
- }
549
- var typeParameters = node.typeParameters;
550
- if (typeParameters != null && typeParameters.length > 0) {
551
- sb.push("<");
552
- this.visitTypeParameter(typeParameters[0]);
553
- for (let i = 1, k = typeParameters.length; i < k; ++i) {
554
- sb.push(", ");
555
- this.visitTypeParameter(typeParameters[i]);
556
- }
557
- sb.push(">");
558
- }
559
- var extendsType = node.extendsType;
560
- if (extendsType) {
561
- sb.push(" extends ");
562
- this.visitTypeNode(extendsType);
563
- }
564
- var implementsTypes = node.implementsTypes;
565
- if (implementsTypes) {
566
- let numImplementsTypes = implementsTypes.length;
567
- if (numImplementsTypes) {
568
- sb.push(" implements ");
569
- this.visitTypeNode(implementsTypes[0]);
570
- for (let i = 1; i < numImplementsTypes; ++i) {
571
- sb.push(", ");
572
- this.visitTypeNode(implementsTypes[i]);
573
- }
574
- }
575
- }
576
- var indexSignature = node.indexSignature;
577
- var members = node.members;
578
- var numMembers = members.length;
579
- if (indexSignature !== null || numMembers) {
580
- sb.push(" {\n");
581
- let indentLevel = ++this.indentLevel;
582
- if (indexSignature) {
583
- util.indent(sb, indentLevel);
584
- this.visitNodeAndTerminate(indexSignature);
585
- }
586
- for (let i = 0, k = members.length; i < k; ++i) {
587
- let member = members[i];
588
- if (member.kind != 54 || member.parameterIndex < 0) {
589
- util.indent(sb, indentLevel);
590
- this.visitNodeAndTerminate(member);
591
- }
592
- }
593
- util.indent(sb, --this.indentLevel);
594
- sb.push("}");
595
- } else {
596
- sb.push(" {}");
597
- }
598
- }
599
- visitDoStatement(node) {
600
- var sb = this.sb;
601
- sb.push("do ");
602
- this.visitNode(node.body);
603
- if (node.body.kind == 30) {
604
- sb.push(" while (");
605
- } else {
606
- util.indent(sb, this.indentLevel);
607
- sb.push("while (");
608
- }
609
- this.visitNode(node.condition);
610
- sb.push(")");
611
- }
612
- visitEmptyStatement(node) {}
613
- visitEnumDeclaration(node, isDefault = false) {
614
- var sb = this.sb;
615
- if (isDefault) {
616
- sb.push("export default ");
617
- } else {
618
- this.serializeExternalModifiers(node);
619
- }
620
- if (node.is(8)) sb.push("const ");
621
- sb.push("enum ");
622
- this.visitIdentifierExpression(node.name);
623
- var values = node.values;
624
- var numValues = values.length;
625
- if (numValues) {
626
- sb.push(" {\n");
627
- let indentLevel = ++this.indentLevel;
628
- util.indent(sb, indentLevel);
629
- this.visitEnumValueDeclaration(node.values[0]);
630
- for (let i = 1; i < numValues; ++i) {
631
- sb.push(",\n");
632
- util.indent(sb, indentLevel);
633
- this.visitEnumValueDeclaration(node.values[i]);
634
- }
635
- sb.push("\n");
636
- util.indent(sb, --this.indentLevel);
637
- sb.push("}");
638
- } else {
639
- sb.push(" {}");
640
- }
641
- }
642
- visitEnumValueDeclaration(node) {
643
- this.visitIdentifierExpression(node.name);
644
- var initializer = node.initializer;
645
- if (initializer) {
646
- this.sb.push(" = ");
647
- this.visitNode(initializer);
648
- }
649
- }
650
- visitExportImportStatement(node) {
651
- var sb = this.sb;
652
- sb.push("export import ");
653
- this.visitIdentifierExpression(node.externalName);
654
- sb.push(" = ");
655
- this.visitIdentifierExpression(node.name);
656
- }
657
- visitExportMember(node) {
658
- this.visitIdentifierExpression(node.localName);
659
- if (node.exportedName.text != node.localName.text) {
660
- this.sb.push(" as ");
661
- this.visitIdentifierExpression(node.exportedName);
662
- }
663
- }
664
- visitExportStatement(node) {
665
- var sb = this.sb;
666
- if (node.isDeclare) {
667
- sb.push("declare ");
668
- }
669
- var members = node.members;
670
- if (members == null) {
671
- sb.push("export *");
672
- } else if (members.length > 0) {
673
- let numMembers = members.length;
674
- sb.push("export {\n");
675
- let indentLevel = ++this.indentLevel;
676
- util.indent(sb, indentLevel);
677
- this.visitExportMember(members[0]);
678
- for (let i = 1; i < numMembers; ++i) {
679
- sb.push(",\n");
680
- util.indent(sb, indentLevel);
681
- this.visitExportMember(members[i]);
682
- }
683
- --this.indentLevel;
684
- sb.push("\n}");
685
- } else {
686
- sb.push("export {}");
687
- }
688
- var path = node.path;
689
- if (path) {
690
- sb.push(" from ");
691
- this.visitStringLiteralExpression(path);
692
- }
693
- sb.push(";");
694
- }
695
- visitExportDefaultStatement(node) {
696
- var declaration = node.declaration;
697
- switch (declaration.kind) {
698
- case 52: {
699
- this.visitEnumDeclaration(declaration, true);
700
- break;
701
- }
702
- case 55: {
703
- this.visitFunctionDeclaration(declaration, true);
704
- break;
705
- }
706
- case 51: {
707
- this.visitClassDeclaration(declaration, true);
708
- break;
709
- }
710
- case 57: {
711
- this.visitInterfaceDeclaration(declaration, true);
712
- break;
713
- }
714
- case 59: {
715
- this.visitNamespaceDeclaration(declaration, true);
716
- break;
717
- }
718
- default:
719
- assert(false);
720
- }
721
- }
722
- visitExpressionStatement(node) {
723
- this.visitNode(node.expression);
724
- }
725
- visitFieldDeclaration(node) {
726
- var decorators = node.decorators;
727
- if (decorators) {
728
- for (let i = 0, k = decorators.length; i < k; ++i) {
729
- this.serializeDecorator(decorators[i]);
730
- }
731
- }
732
- this.serializeAccessModifiers(node);
733
- this.visitIdentifierExpression(node.name);
734
- var sb = this.sb;
735
- if (node.flags & 16384) {
736
- sb.push("!");
737
- }
738
- var type = node.type;
739
- if (type) {
740
- sb.push(": ");
741
- this.visitTypeNode(type);
742
- }
743
- var initializer = node.initializer;
744
- if (initializer) {
745
- sb.push(" = ");
746
- this.visitNode(initializer);
747
- }
748
- }
749
- visitForStatement(node) {
750
- var sb = this.sb;
751
- sb.push("for (");
752
- var initializer = node.initializer;
753
- if (initializer) {
754
- this.visitNode(initializer);
755
- }
756
- var condition = node.condition;
757
- if (condition) {
758
- sb.push("; ");
759
- this.visitNode(condition);
760
- } else {
761
- sb.push(";");
762
- }
763
- var incrementor = node.incrementor;
764
- if (incrementor) {
765
- sb.push("; ");
766
- this.visitNode(incrementor);
767
- } else {
768
- sb.push(";");
769
- }
770
- sb.push(") ");
771
- this.visitNode(node.body);
772
- }
773
- visitForOfStatement(node) {
774
- var sb = this.sb;
775
- sb.push("for (");
776
- this.visitNode(node.variable);
777
- sb.push(" of ");
778
- this.visitNode(node.iterable);
779
- sb.push(") ");
780
- this.visitNode(node.body);
781
- }
782
- visitFunctionDeclaration(node, isDefault = false) {
783
- var sb = this.sb;
784
- var decorators = node.decorators;
785
- if (decorators) {
786
- for (let i = 0, k = decorators.length; i < k; ++i) {
787
- this.serializeDecorator(decorators[i]);
788
- }
789
- }
790
- if (isDefault) {
791
- sb.push("export default ");
792
- } else {
793
- this.serializeExternalModifiers(node);
794
- this.serializeAccessModifiers(node);
795
- }
796
- if (node.name.text.length) {
797
- sb.push("function ");
798
- } else {
799
- sb.push("function");
800
- }
801
- this.visitFunctionCommon(node);
802
- }
803
- visitFunctionCommon(node) {
804
- var sb = this.sb;
805
- this.visitIdentifierExpression(node.name);
806
- var signature = node.signature;
807
- var typeParameters = node.typeParameters;
808
- if (typeParameters) {
809
- let numTypeParameters = typeParameters.length;
810
- if (numTypeParameters) {
811
- sb.push("<");
812
- this.visitTypeParameter(typeParameters[0]);
813
- for (let i = 1; i < numTypeParameters; ++i) {
814
- sb.push(", ");
815
- this.visitTypeParameter(typeParameters[i]);
816
- }
817
- sb.push(">");
818
- }
819
- }
820
- if (node.arrowKind == 2) {
821
- let parameters = signature.parameters;
822
- assert(parameters.length == 1);
823
- assert(!signature.explicitThisType);
824
- this.serializeParameter(parameters[0]);
825
- } else {
826
- sb.push("(");
827
- let parameters = signature.parameters;
828
- let numParameters = parameters.length;
829
- let explicitThisType = signature.explicitThisType;
830
- if (explicitThisType) {
831
- sb.push("this: ");
832
- this.visitTypeNode(explicitThisType);
833
- }
834
- if (numParameters) {
835
- if (explicitThisType) sb.push(", ");
836
- this.serializeParameter(parameters[0]);
837
- for (let i = 1; i < numParameters; ++i) {
838
- sb.push(", ");
839
- this.serializeParameter(parameters[i]);
840
- }
841
- }
842
- }
843
- var body = node.body;
844
- var returnType = signature.returnType;
845
- if (node.arrowKind) {
846
- if (body) {
847
- if (node.arrowKind == 2) {
848
- assert(isTypeOmitted(returnType));
849
- } else {
850
- if (isTypeOmitted(returnType)) {
851
- sb.push(")");
852
- } else {
853
- sb.push("): ");
854
- this.visitTypeNode(returnType);
855
- }
856
- }
857
- sb.push(" => ");
858
- this.visitNode(body);
859
- } else {
860
- assert(!isTypeOmitted(returnType));
861
- sb.push(" => ");
862
- this.visitTypeNode(returnType);
863
- }
864
- } else {
865
- if (!isTypeOmitted(returnType) && !node.isAny(524288 | 4096)) {
866
- sb.push("): ");
867
- this.visitTypeNode(returnType);
868
- } else {
869
474
  sb.push(")");
870
- }
871
- if (body) {
872
- sb.push(" ");
873
- this.visitNode(body);
874
- }
875
- }
876
- }
877
- visitIfStatement(node) {
878
- var sb = this.sb;
879
- sb.push("if (");
880
- this.visitNode(node.condition);
881
- sb.push(") ");
882
- var ifTrue = node.ifTrue;
883
- this.visitNode(ifTrue);
884
- if (ifTrue.kind != 30) {
885
- sb.push(";\n");
886
- }
887
- var ifFalse = node.ifFalse;
888
- if (ifFalse) {
889
- if (ifTrue.kind == 30) {
890
- sb.push(" else ");
891
- } else {
892
- sb.push("else ");
893
- }
894
- this.visitNode(ifFalse);
895
- }
896
- }
897
- visitImportDeclaration(node) {
898
- var externalName = node.foreignName;
899
- var name = node.name;
900
- this.visitIdentifierExpression(externalName);
901
- if (externalName.text != name.text) {
902
- this.sb.push(" as ");
903
- this.visitIdentifierExpression(name);
904
- }
905
- }
906
- visitImportStatement(node) {
907
- var sb = this.sb;
908
- sb.push("import ");
909
- var declarations = node.declarations;
910
- var namespaceName = node.namespaceName;
911
- if (declarations) {
912
- let numDeclarations = declarations.length;
913
- if (numDeclarations) {
914
- sb.push("{\n");
915
- let indentLevel = ++this.indentLevel;
916
- util.indent(sb, indentLevel);
917
- this.visitImportDeclaration(declarations[0]);
918
- for (let i = 1; i < numDeclarations; ++i) {
919
- sb.push(",\n");
920
- util.indent(sb, indentLevel);
921
- this.visitImportDeclaration(declarations[i]);
475
+ }
476
+ visitPropertyAccessExpression(node) {
477
+ this.visitNode(node.expression);
478
+ this.sb.push(".");
479
+ this.visitIdentifierExpression(node.property);
480
+ }
481
+ visitTernaryExpression(node) {
482
+ var sb = this.sb;
483
+ this.visitNode(node.condition);
484
+ sb.push(" ? ");
485
+ this.visitNode(node.ifThen);
486
+ sb.push(" : ");
487
+ this.visitNode(node.ifElse);
488
+ }
489
+ visitUnaryExpression(node) {
490
+ switch (node.kind) {
491
+ case 27: {
492
+ this.visitUnaryPostfixExpression(node);
493
+ break;
494
+ }
495
+ case 28: {
496
+ this.visitUnaryPrefixExpression(node);
497
+ break;
498
+ }
499
+ default:
500
+ assert(false);
501
+ }
502
+ }
503
+ visitUnaryPostfixExpression(node) {
504
+ this.visitNode(node.operand);
505
+ this.sb.push(operatorTokenToString(node.operator));
506
+ }
507
+ visitUnaryPrefixExpression(node) {
508
+ this.sb.push(operatorTokenToString(node.operator));
509
+ this.visitNode(node.operand);
510
+ }
511
+ visitNodeAndTerminate(node) {
512
+ this.visitNode(node);
513
+ var sb = this.sb;
514
+ if (!sb.length ||
515
+ node.kind == 47 ||
516
+ node.kind == 38) {
517
+ sb.push(";\n");
518
+ }
519
+ else {
520
+ let last = sb[sb.length - 1];
521
+ let lastCharPos = last.length - 1;
522
+ if (lastCharPos >= 0 && (last.charCodeAt(lastCharPos) == 125 || last.charCodeAt(lastCharPos) == 59)) {
523
+ sb.push("\n");
524
+ }
525
+ else {
526
+ sb.push(";\n");
527
+ }
528
+ }
529
+ }
530
+ visitBlockStatement(node) {
531
+ var sb = this.sb;
532
+ var statements = node.statements;
533
+ var numStatements = statements.length;
534
+ if (numStatements) {
535
+ sb.push("{\n");
536
+ let indentLevel = ++this.indentLevel;
537
+ for (let i = 0; i < numStatements; ++i) {
538
+ util.indent(sb, indentLevel);
539
+ this.visitNodeAndTerminate(statements[i]);
540
+ }
541
+ util.indent(sb, --this.indentLevel);
542
+ sb.push("}");
543
+ }
544
+ else {
545
+ sb.push("{}");
546
+ }
547
+ }
548
+ visitBreakStatement(node) {
549
+ var label = node.label;
550
+ if (label) {
551
+ this.sb.push("break ");
552
+ this.visitIdentifierExpression(label);
553
+ }
554
+ else {
555
+ this.sb.push("break");
556
+ }
557
+ }
558
+ visitContinueStatement(node) {
559
+ var label = node.label;
560
+ if (label) {
561
+ this.sb.push("continue ");
562
+ this.visitIdentifierExpression(label);
563
+ }
564
+ else {
565
+ this.sb.push("continue");
566
+ }
567
+ }
568
+ visitClassDeclaration(node, isDefault = false) {
569
+ var decorators = node.decorators;
570
+ if (decorators) {
571
+ for (let i = 0, k = decorators.length; i < k; ++i) {
572
+ this.serializeDecorator(decorators[i]);
573
+ }
574
+ }
575
+ var sb = this.sb;
576
+ if (isDefault) {
577
+ sb.push("export default ");
578
+ }
579
+ else {
580
+ this.serializeExternalModifiers(node);
581
+ }
582
+ if (node.is(128))
583
+ sb.push("abstract ");
584
+ if (node.name.text.length) {
585
+ sb.push("class ");
586
+ this.visitIdentifierExpression(node.name);
587
+ }
588
+ else {
589
+ sb.push("class");
590
+ }
591
+ var typeParameters = node.typeParameters;
592
+ if (typeParameters != null && typeParameters.length > 0) {
593
+ sb.push("<");
594
+ this.visitTypeParameter(typeParameters[0]);
595
+ for (let i = 1, k = typeParameters.length; i < k; ++i) {
596
+ sb.push(", ");
597
+ this.visitTypeParameter(typeParameters[i]);
598
+ }
599
+ sb.push(">");
600
+ }
601
+ var extendsType = node.extendsType;
602
+ if (extendsType) {
603
+ sb.push(" extends ");
604
+ this.visitTypeNode(extendsType);
605
+ }
606
+ var implementsTypes = node.implementsTypes;
607
+ if (implementsTypes) {
608
+ let numImplementsTypes = implementsTypes.length;
609
+ if (numImplementsTypes) {
610
+ sb.push(" implements ");
611
+ this.visitTypeNode(implementsTypes[0]);
612
+ for (let i = 1; i < numImplementsTypes; ++i) {
613
+ sb.push(", ");
614
+ this.visitTypeNode(implementsTypes[i]);
615
+ }
616
+ }
617
+ }
618
+ var indexSignature = node.indexSignature;
619
+ var members = node.members;
620
+ var numMembers = members.length;
621
+ if (indexSignature !== null || numMembers) {
622
+ sb.push(" {\n");
623
+ let indentLevel = ++this.indentLevel;
624
+ if (indexSignature) {
625
+ util.indent(sb, indentLevel);
626
+ this.visitNodeAndTerminate(indexSignature);
627
+ }
628
+ for (let i = 0, k = members.length; i < k; ++i) {
629
+ let member = members[i];
630
+ if (member.kind != 54 || member.parameterIndex < 0) {
631
+ util.indent(sb, indentLevel);
632
+ this.visitNodeAndTerminate(member);
633
+ }
634
+ }
635
+ util.indent(sb, --this.indentLevel);
636
+ sb.push("}");
637
+ }
638
+ else {
639
+ sb.push(" {}");
640
+ }
641
+ }
642
+ visitDoStatement(node) {
643
+ var sb = this.sb;
644
+ sb.push("do ");
645
+ this.visitNode(node.body);
646
+ if (node.body.kind == 30) {
647
+ sb.push(" while (");
648
+ }
649
+ else {
650
+ util.indent(sb, this.indentLevel);
651
+ sb.push("while (");
652
+ }
653
+ this.visitNode(node.condition);
654
+ sb.push(")");
655
+ }
656
+ visitEmptyStatement(node) {
657
+ }
658
+ visitEnumDeclaration(node, isDefault = false) {
659
+ var sb = this.sb;
660
+ if (isDefault) {
661
+ sb.push("export default ");
662
+ }
663
+ else {
664
+ this.serializeExternalModifiers(node);
665
+ }
666
+ if (node.is(8))
667
+ sb.push("const ");
668
+ sb.push("enum ");
669
+ this.visitIdentifierExpression(node.name);
670
+ var values = node.values;
671
+ var numValues = values.length;
672
+ if (numValues) {
673
+ sb.push(" {\n");
674
+ let indentLevel = ++this.indentLevel;
675
+ util.indent(sb, indentLevel);
676
+ this.visitEnumValueDeclaration(node.values[0]);
677
+ for (let i = 1; i < numValues; ++i) {
678
+ sb.push(",\n");
679
+ util.indent(sb, indentLevel);
680
+ this.visitEnumValueDeclaration(node.values[i]);
681
+ }
682
+ sb.push("\n");
683
+ util.indent(sb, --this.indentLevel);
684
+ sb.push("}");
685
+ }
686
+ else {
687
+ sb.push(" {}");
688
+ }
689
+ }
690
+ visitEnumValueDeclaration(node) {
691
+ this.visitIdentifierExpression(node.name);
692
+ var initializer = node.initializer;
693
+ if (initializer) {
694
+ this.sb.push(" = ");
695
+ this.visitNode(initializer);
696
+ }
697
+ }
698
+ visitExportImportStatement(node) {
699
+ var sb = this.sb;
700
+ sb.push("export import ");
701
+ this.visitIdentifierExpression(node.externalName);
702
+ sb.push(" = ");
703
+ this.visitIdentifierExpression(node.name);
704
+ }
705
+ visitExportMember(node) {
706
+ this.visitIdentifierExpression(node.localName);
707
+ if (node.exportedName.text != node.localName.text) {
708
+ this.sb.push(" as ");
709
+ this.visitIdentifierExpression(node.exportedName);
710
+ }
711
+ }
712
+ visitExportStatement(node) {
713
+ var sb = this.sb;
714
+ if (node.isDeclare) {
715
+ sb.push("declare ");
716
+ }
717
+ var members = node.members;
718
+ if (members == null) {
719
+ sb.push("export *");
720
+ }
721
+ else if (members.length > 0) {
722
+ let numMembers = members.length;
723
+ sb.push("export {\n");
724
+ let indentLevel = ++this.indentLevel;
725
+ util.indent(sb, indentLevel);
726
+ this.visitExportMember(members[0]);
727
+ for (let i = 1; i < numMembers; ++i) {
728
+ sb.push(",\n");
729
+ util.indent(sb, indentLevel);
730
+ this.visitExportMember(members[i]);
731
+ }
732
+ --this.indentLevel;
733
+ sb.push("\n}");
734
+ }
735
+ else {
736
+ sb.push("export {}");
737
+ }
738
+ var path = node.path;
739
+ if (path) {
740
+ sb.push(" from ");
741
+ this.visitStringLiteralExpression(path);
742
+ }
743
+ sb.push(";");
744
+ }
745
+ visitExportDefaultStatement(node) {
746
+ var declaration = node.declaration;
747
+ switch (declaration.kind) {
748
+ case 52: {
749
+ this.visitEnumDeclaration(declaration, true);
750
+ break;
751
+ }
752
+ case 55: {
753
+ this.visitFunctionDeclaration(declaration, true);
754
+ break;
755
+ }
756
+ case 51: {
757
+ this.visitClassDeclaration(declaration, true);
758
+ break;
759
+ }
760
+ case 57: {
761
+ this.visitInterfaceDeclaration(declaration, true);
762
+ break;
763
+ }
764
+ case 59: {
765
+ this.visitNamespaceDeclaration(declaration, true);
766
+ break;
767
+ }
768
+ default:
769
+ assert(false);
770
+ }
771
+ }
772
+ visitExpressionStatement(node) {
773
+ this.visitNode(node.expression);
774
+ }
775
+ visitFieldDeclaration(node) {
776
+ var decorators = node.decorators;
777
+ if (decorators) {
778
+ for (let i = 0, k = decorators.length; i < k; ++i) {
779
+ this.serializeDecorator(decorators[i]);
780
+ }
781
+ }
782
+ this.serializeAccessModifiers(node);
783
+ this.visitIdentifierExpression(node.name);
784
+ var sb = this.sb;
785
+ if (node.flags & 16384) {
786
+ sb.push("!");
787
+ }
788
+ var type = node.type;
789
+ if (type) {
790
+ sb.push(": ");
791
+ this.visitTypeNode(type);
792
+ }
793
+ var initializer = node.initializer;
794
+ if (initializer) {
795
+ sb.push(" = ");
796
+ this.visitNode(initializer);
797
+ }
798
+ }
799
+ visitForStatement(node) {
800
+ var sb = this.sb;
801
+ sb.push("for (");
802
+ var initializer = node.initializer;
803
+ if (initializer) {
804
+ this.visitNode(initializer);
805
+ }
806
+ var condition = node.condition;
807
+ if (condition) {
808
+ sb.push("; ");
809
+ this.visitNode(condition);
810
+ }
811
+ else {
812
+ sb.push(";");
813
+ }
814
+ var incrementor = node.incrementor;
815
+ if (incrementor) {
816
+ sb.push("; ");
817
+ this.visitNode(incrementor);
818
+ }
819
+ else {
820
+ sb.push(";");
821
+ }
822
+ sb.push(") ");
823
+ this.visitNode(node.body);
824
+ }
825
+ visitForOfStatement(node) {
826
+ var sb = this.sb;
827
+ sb.push("for (");
828
+ this.visitNode(node.variable);
829
+ sb.push(" of ");
830
+ this.visitNode(node.iterable);
831
+ sb.push(") ");
832
+ this.visitNode(node.body);
833
+ }
834
+ visitFunctionDeclaration(node, isDefault = false) {
835
+ var sb = this.sb;
836
+ var decorators = node.decorators;
837
+ if (decorators) {
838
+ for (let i = 0, k = decorators.length; i < k; ++i) {
839
+ this.serializeDecorator(decorators[i]);
840
+ }
841
+ }
842
+ if (isDefault) {
843
+ sb.push("export default ");
844
+ }
845
+ else {
846
+ this.serializeExternalModifiers(node);
847
+ this.serializeAccessModifiers(node);
848
+ }
849
+ if (node.name.text.length) {
850
+ sb.push("function ");
851
+ }
852
+ else {
853
+ sb.push("function");
854
+ }
855
+ this.visitFunctionCommon(node);
856
+ }
857
+ visitFunctionCommon(node) {
858
+ var sb = this.sb;
859
+ this.visitIdentifierExpression(node.name);
860
+ var signature = node.signature;
861
+ var typeParameters = node.typeParameters;
862
+ if (typeParameters) {
863
+ let numTypeParameters = typeParameters.length;
864
+ if (numTypeParameters) {
865
+ sb.push("<");
866
+ this.visitTypeParameter(typeParameters[0]);
867
+ for (let i = 1; i < numTypeParameters; ++i) {
868
+ sb.push(", ");
869
+ this.visitTypeParameter(typeParameters[i]);
870
+ }
871
+ sb.push(">");
872
+ }
873
+ }
874
+ if (node.arrowKind == 2) {
875
+ let parameters = signature.parameters;
876
+ assert(parameters.length == 1);
877
+ assert(!signature.explicitThisType);
878
+ this.serializeParameter(parameters[0]);
879
+ }
880
+ else {
881
+ sb.push("(");
882
+ let parameters = signature.parameters;
883
+ let numParameters = parameters.length;
884
+ let explicitThisType = signature.explicitThisType;
885
+ if (explicitThisType) {
886
+ sb.push("this: ");
887
+ this.visitTypeNode(explicitThisType);
888
+ }
889
+ if (numParameters) {
890
+ if (explicitThisType)
891
+ sb.push(", ");
892
+ this.serializeParameter(parameters[0]);
893
+ for (let i = 1; i < numParameters; ++i) {
894
+ sb.push(", ");
895
+ this.serializeParameter(parameters[i]);
896
+ }
897
+ }
898
+ }
899
+ var body = node.body;
900
+ var returnType = signature.returnType;
901
+ if (node.arrowKind) {
902
+ if (body) {
903
+ if (node.arrowKind == 2) {
904
+ assert(isTypeOmitted(returnType));
905
+ }
906
+ else {
907
+ if (isTypeOmitted(returnType)) {
908
+ sb.push(")");
909
+ }
910
+ else {
911
+ sb.push("): ");
912
+ this.visitTypeNode(returnType);
913
+ }
914
+ }
915
+ sb.push(" => ");
916
+ this.visitNode(body);
917
+ }
918
+ else {
919
+ assert(!isTypeOmitted(returnType));
920
+ sb.push(" => ");
921
+ this.visitTypeNode(returnType);
922
+ }
923
+ }
924
+ else {
925
+ if (!isTypeOmitted(returnType) && !node.isAny(524288 | 4096)) {
926
+ sb.push("): ");
927
+ this.visitTypeNode(returnType);
928
+ }
929
+ else {
930
+ sb.push(")");
931
+ }
932
+ if (body) {
933
+ sb.push(" ");
934
+ this.visitNode(body);
935
+ }
936
+ }
937
+ }
938
+ visitIfStatement(node) {
939
+ var sb = this.sb;
940
+ sb.push("if (");
941
+ this.visitNode(node.condition);
942
+ sb.push(") ");
943
+ var ifTrue = node.ifTrue;
944
+ this.visitNode(ifTrue);
945
+ if (ifTrue.kind != 30) {
946
+ sb.push(";\n");
947
+ }
948
+ var ifFalse = node.ifFalse;
949
+ if (ifFalse) {
950
+ if (ifTrue.kind == 30) {
951
+ sb.push(" else ");
952
+ }
953
+ else {
954
+ sb.push("else ");
955
+ }
956
+ this.visitNode(ifFalse);
957
+ }
958
+ }
959
+ visitImportDeclaration(node) {
960
+ var externalName = node.foreignName;
961
+ var name = node.name;
962
+ this.visitIdentifierExpression(externalName);
963
+ if (externalName.text != name.text) {
964
+ this.sb.push(" as ");
965
+ this.visitIdentifierExpression(name);
966
+ }
967
+ }
968
+ visitImportStatement(node) {
969
+ var sb = this.sb;
970
+ sb.push("import ");
971
+ var declarations = node.declarations;
972
+ var namespaceName = node.namespaceName;
973
+ if (declarations) {
974
+ let numDeclarations = declarations.length;
975
+ if (numDeclarations) {
976
+ sb.push("{\n");
977
+ let indentLevel = ++this.indentLevel;
978
+ util.indent(sb, indentLevel);
979
+ this.visitImportDeclaration(declarations[0]);
980
+ for (let i = 1; i < numDeclarations; ++i) {
981
+ sb.push(",\n");
982
+ util.indent(sb, indentLevel);
983
+ this.visitImportDeclaration(declarations[i]);
984
+ }
985
+ --this.indentLevel;
986
+ sb.push("\n} from ");
987
+ }
988
+ else {
989
+ sb.push("{} from ");
990
+ }
991
+ }
992
+ else if (namespaceName) {
993
+ sb.push("* as ");
994
+ this.visitIdentifierExpression(namespaceName);
995
+ sb.push(" from ");
996
+ }
997
+ this.visitStringLiteralExpression(node.path);
998
+ }
999
+ visitIndexSignature(node) {
1000
+ var sb = this.sb;
1001
+ sb.push("[key: ");
1002
+ this.visitTypeNode(node.keyType);
1003
+ sb.push("]: ");
1004
+ this.visitTypeNode(node.valueType);
1005
+ }
1006
+ visitInterfaceDeclaration(node, isDefault = false) {
1007
+ var decorators = node.decorators;
1008
+ if (decorators) {
1009
+ for (let i = 0, k = decorators.length; i < k; ++i) {
1010
+ this.serializeDecorator(decorators[i]);
1011
+ }
1012
+ }
1013
+ var sb = this.sb;
1014
+ if (isDefault) {
1015
+ sb.push("export default ");
1016
+ }
1017
+ else {
1018
+ this.serializeExternalModifiers(node);
1019
+ }
1020
+ sb.push("interface ");
1021
+ this.visitIdentifierExpression(node.name);
1022
+ var typeParameters = node.typeParameters;
1023
+ if (typeParameters != null && typeParameters.length > 0) {
1024
+ sb.push("<");
1025
+ this.visitTypeParameter(typeParameters[0]);
1026
+ for (let i = 1, k = typeParameters.length; i < k; ++i) {
1027
+ sb.push(", ");
1028
+ this.visitTypeParameter(typeParameters[i]);
1029
+ }
1030
+ sb.push(">");
1031
+ }
1032
+ var extendsType = node.extendsType;
1033
+ if (extendsType) {
1034
+ sb.push(" extends ");
1035
+ this.visitTypeNode(extendsType);
1036
+ }
1037
+ sb.push(" {\n");
1038
+ var indentLevel = ++this.indentLevel;
1039
+ var members = node.members;
1040
+ for (let i = 0, k = members.length; i < k; ++i) {
1041
+ util.indent(sb, indentLevel);
1042
+ this.visitNodeAndTerminate(members[i]);
1043
+ }
1044
+ --this.indentLevel;
1045
+ sb.push("}");
1046
+ }
1047
+ visitMethodDeclaration(node) {
1048
+ var decorators = node.decorators;
1049
+ if (decorators) {
1050
+ for (let i = 0, k = decorators.length; i < k; ++i) {
1051
+ this.serializeDecorator(decorators[i]);
1052
+ }
1053
+ }
1054
+ this.serializeAccessModifiers(node);
1055
+ if (node.is(2048)) {
1056
+ this.sb.push("get ");
1057
+ }
1058
+ else if (node.is(4096)) {
1059
+ this.sb.push("set ");
1060
+ }
1061
+ this.visitFunctionCommon(node);
1062
+ }
1063
+ visitNamespaceDeclaration(node, isDefault = false) {
1064
+ var decorators = node.decorators;
1065
+ if (decorators) {
1066
+ for (let i = 0, k = decorators.length; i < k; ++i) {
1067
+ this.serializeDecorator(decorators[i]);
1068
+ }
1069
+ }
1070
+ var sb = this.sb;
1071
+ if (isDefault) {
1072
+ sb.push("export default ");
1073
+ }
1074
+ else {
1075
+ this.serializeExternalModifiers(node);
1076
+ }
1077
+ sb.push("namespace ");
1078
+ this.visitIdentifierExpression(node.name);
1079
+ var members = node.members;
1080
+ var numMembers = members.length;
1081
+ if (numMembers) {
1082
+ sb.push(" {\n");
1083
+ let indentLevel = ++this.indentLevel;
1084
+ for (let i = 0, k = members.length; i < k; ++i) {
1085
+ util.indent(sb, indentLevel);
1086
+ this.visitNodeAndTerminate(members[i]);
1087
+ }
1088
+ util.indent(sb, --this.indentLevel);
1089
+ sb.push("}");
1090
+ }
1091
+ else {
1092
+ sb.push(" {}");
1093
+ }
1094
+ }
1095
+ visitReturnStatement(node) {
1096
+ var value = node.value;
1097
+ if (value) {
1098
+ this.sb.push("return ");
1099
+ this.visitNode(value);
1100
+ }
1101
+ else {
1102
+ this.sb.push("return");
1103
+ }
1104
+ }
1105
+ visitTrueExpression(node) {
1106
+ this.sb.push("true");
1107
+ }
1108
+ visitFalseExpression(node) {
1109
+ this.sb.push("false");
1110
+ }
1111
+ visitNullExpression(node) {
1112
+ this.sb.push("null");
1113
+ }
1114
+ visitSwitchCase(node) {
1115
+ var sb = this.sb;
1116
+ var label = node.label;
1117
+ if (label) {
1118
+ sb.push("case ");
1119
+ this.visitNode(label);
1120
+ sb.push(":\n");
1121
+ }
1122
+ else {
1123
+ sb.push("default:\n");
1124
+ }
1125
+ var statements = node.statements;
1126
+ var numStatements = statements.length;
1127
+ if (numStatements) {
1128
+ let indentLevel = ++this.indentLevel;
1129
+ util.indent(sb, indentLevel);
1130
+ this.visitNodeAndTerminate(statements[0]);
1131
+ for (let i = 1; i < numStatements; ++i) {
1132
+ util.indent(sb, indentLevel);
1133
+ this.visitNodeAndTerminate(statements[i]);
1134
+ }
1135
+ --this.indentLevel;
1136
+ }
1137
+ }
1138
+ visitSwitchStatement(node) {
1139
+ var sb = this.sb;
1140
+ sb.push("switch (");
1141
+ this.visitNode(node.condition);
1142
+ sb.push(") {\n");
1143
+ var indentLevel = ++this.indentLevel;
1144
+ var cases = node.cases;
1145
+ for (let i = 0, k = cases.length; i < k; ++i) {
1146
+ util.indent(sb, indentLevel);
1147
+ this.visitSwitchCase(cases[i]);
1148
+ sb.push("\n");
922
1149
  }
923
1150
  --this.indentLevel;
924
- sb.push("\n} from ");
925
- } else {
926
- sb.push("{} from ");
927
- }
928
- } else if (namespaceName) {
929
- sb.push("* as ");
930
- this.visitIdentifierExpression(namespaceName);
931
- sb.push(" from ");
932
- }
933
- this.visitStringLiteralExpression(node.path);
934
- }
935
- visitIndexSignature(node) {
936
- var sb = this.sb;
937
- sb.push("[key: ");
938
- this.visitTypeNode(node.keyType);
939
- sb.push("]: ");
940
- this.visitTypeNode(node.valueType);
941
- }
942
- visitInterfaceDeclaration(node, isDefault = false) {
943
- var decorators = node.decorators;
944
- if (decorators) {
945
- for (let i = 0, k = decorators.length; i < k; ++i) {
946
- this.serializeDecorator(decorators[i]);
947
- }
948
- }
949
- var sb = this.sb;
950
- if (isDefault) {
951
- sb.push("export default ");
952
- } else {
953
- this.serializeExternalModifiers(node);
954
- }
955
- sb.push("interface ");
956
- this.visitIdentifierExpression(node.name);
957
- var typeParameters = node.typeParameters;
958
- if (typeParameters != null && typeParameters.length > 0) {
959
- sb.push("<");
960
- this.visitTypeParameter(typeParameters[0]);
961
- for (let i = 1, k = typeParameters.length; i < k; ++i) {
962
- sb.push(", ");
963
- this.visitTypeParameter(typeParameters[i]);
964
- }
965
- sb.push(">");
966
- }
967
- var extendsType = node.extendsType;
968
- if (extendsType) {
969
- sb.push(" extends ");
970
- this.visitTypeNode(extendsType);
971
- }
972
- sb.push(" {\n");
973
- var indentLevel = ++this.indentLevel;
974
- var members = node.members;
975
- for (let i = 0, k = members.length; i < k; ++i) {
976
- util.indent(sb, indentLevel);
977
- this.visitNodeAndTerminate(members[i]);
978
- }
979
- --this.indentLevel;
980
- sb.push("}");
981
- }
982
- visitMethodDeclaration(node) {
983
- var decorators = node.decorators;
984
- if (decorators) {
985
- for (let i = 0, k = decorators.length; i < k; ++i) {
986
- this.serializeDecorator(decorators[i]);
987
- }
988
- }
989
- this.serializeAccessModifiers(node);
990
- if (node.is(2048)) {
991
- this.sb.push("get ");
992
- } else if (node.is(4096)) {
993
- this.sb.push("set ");
994
- }
995
- this.visitFunctionCommon(node);
996
- }
997
- visitNamespaceDeclaration(node, isDefault = false) {
998
- var decorators = node.decorators;
999
- if (decorators) {
1000
- for (let i = 0, k = decorators.length; i < k; ++i) {
1001
- this.serializeDecorator(decorators[i]);
1002
- }
1003
- }
1004
- var sb = this.sb;
1005
- if (isDefault) {
1006
- sb.push("export default ");
1007
- } else {
1008
- this.serializeExternalModifiers(node);
1009
- }
1010
- sb.push("namespace ");
1011
- this.visitIdentifierExpression(node.name);
1012
- var members = node.members;
1013
- var numMembers = members.length;
1014
- if (numMembers) {
1015
- sb.push(" {\n");
1016
- let indentLevel = ++this.indentLevel;
1017
- for (let i = 0, k = members.length; i < k; ++i) {
1018
- util.indent(sb, indentLevel);
1019
- this.visitNodeAndTerminate(members[i]);
1020
- }
1021
- util.indent(sb, --this.indentLevel);
1022
- sb.push("}");
1023
- } else {
1024
- sb.push(" {}");
1025
- }
1026
- }
1027
- visitReturnStatement(node) {
1028
- var value = node.value;
1029
- if (value) {
1030
- this.sb.push("return ");
1031
- this.visitNode(value);
1032
- } else {
1033
- this.sb.push("return");
1034
- }
1035
- }
1036
- visitTrueExpression(node) {
1037
- this.sb.push("true");
1038
- }
1039
- visitFalseExpression(node) {
1040
- this.sb.push("false");
1041
- }
1042
- visitNullExpression(node) {
1043
- this.sb.push("null");
1044
- }
1045
- visitSwitchCase(node) {
1046
- var sb = this.sb;
1047
- var label = node.label;
1048
- if (label) {
1049
- sb.push("case ");
1050
- this.visitNode(label);
1051
- sb.push(":\n");
1052
- } else {
1053
- sb.push("default:\n");
1054
- }
1055
- var statements = node.statements;
1056
- var numStatements = statements.length;
1057
- if (numStatements) {
1058
- let indentLevel = ++this.indentLevel;
1059
- util.indent(sb, indentLevel);
1060
- this.visitNodeAndTerminate(statements[0]);
1061
- for (let i = 1; i < numStatements; ++i) {
1062
- util.indent(sb, indentLevel);
1063
- this.visitNodeAndTerminate(statements[i]);
1064
- }
1065
- --this.indentLevel;
1066
- }
1067
- }
1068
- visitSwitchStatement(node) {
1069
- var sb = this.sb;
1070
- sb.push("switch (");
1071
- this.visitNode(node.condition);
1072
- sb.push(") {\n");
1073
- var indentLevel = ++this.indentLevel;
1074
- var cases = node.cases;
1075
- for (let i = 0, k = cases.length; i < k; ++i) {
1076
- util.indent(sb, indentLevel);
1077
- this.visitSwitchCase(cases[i]);
1078
- sb.push("\n");
1079
- }
1080
- --this.indentLevel;
1081
- sb.push("}");
1082
- }
1083
- visitThrowStatement(node) {
1084
- this.sb.push("throw ");
1085
- this.visitNode(node.value);
1086
- }
1087
- visitTryStatement(node) {
1088
- var sb = this.sb;
1089
- sb.push("try {\n");
1090
- var indentLevel = ++this.indentLevel;
1091
- var statements = node.bodyStatements;
1092
- for (let i = 0, k = statements.length; i < k; ++i) {
1093
- util.indent(sb, indentLevel);
1094
- this.visitNodeAndTerminate(statements[i]);
1095
- }
1096
- var catchVariable = node.catchVariable;
1097
- if (catchVariable) {
1098
- util.indent(sb, indentLevel - 1);
1099
- sb.push("} catch (");
1100
- this.visitIdentifierExpression(catchVariable);
1101
- sb.push(") {\n");
1102
- let catchStatements = node.catchStatements;
1103
- if (catchStatements) {
1104
- for (let i = 0, k = catchStatements.length; i < k; ++i) {
1105
- util.indent(sb, indentLevel);
1106
- this.visitNodeAndTerminate(catchStatements[i]);
1107
- }
1108
- }
1109
- }
1110
- var finallyStatements = node.finallyStatements;
1111
- if (finallyStatements) {
1112
- util.indent(sb, indentLevel - 1);
1113
- sb.push("} finally {\n");
1114
- for (let i = 0, k = finallyStatements.length; i < k; ++i) {
1115
- util.indent(sb, indentLevel);
1116
- this.visitNodeAndTerminate(finallyStatements[i]);
1117
- }
1118
- }
1119
- util.indent(sb, indentLevel - 1);
1120
- sb.push("}");
1121
- }
1122
- visitTypeDeclaration(node) {
1123
- var decorators = node.decorators;
1124
- if (decorators) {
1125
- for (let i = 0, k = decorators.length; i < k; ++i) {
1126
- this.serializeDecorator(decorators[i]);
1127
- }
1128
- }
1129
- var sb = this.sb;
1130
- this.serializeExternalModifiers(node);
1131
- sb.push("type ");
1132
- this.visitIdentifierExpression(node.name);
1133
- var typeParameters = node.typeParameters;
1134
- if (typeParameters) {
1135
- let numTypeParameters = typeParameters.length;
1136
- if (numTypeParameters) {
1137
- sb.push("<");
1138
- for (let i = 0; i < numTypeParameters; ++i) {
1139
- this.visitTypeParameter(typeParameters[i]);
1140
- }
1141
- sb.push(">");
1142
- }
1143
- }
1144
- sb.push(" = ");
1145
- this.visitTypeNode(node.type);
1146
- }
1147
- visitVariableDeclaration(node) {
1148
- this.visitIdentifierExpression(node.name);
1149
- var type = node.type;
1150
- var sb = this.sb;
1151
- if (node.flags & 16384) {
1152
- sb.push("!");
1153
- }
1154
- if (type) {
1155
- sb.push(": ");
1156
- this.visitTypeNode(type);
1157
- }
1158
- var initializer = node.initializer;
1159
- if (initializer) {
1160
- sb.push(" = ");
1161
- this.visitNode(initializer);
1162
- }
1163
- }
1164
- visitVariableStatement(node) {
1165
- var decorators = node.decorators;
1166
- if (decorators) {
1167
- for (let i = 0, k = decorators.length; i < k; ++i) {
1168
- this.serializeDecorator(decorators[i]);
1169
- }
1170
- }
1171
- var sb = this.sb;
1172
- var declarations = node.declarations;
1173
- var numDeclarations = declarations.length;
1174
- var firstDeclaration = declarations[0];
1175
- this.serializeExternalModifiers(firstDeclaration);
1176
- sb.push(firstDeclaration.is(8) ? "const " : firstDeclaration.is(16) ? "let " : "var ");
1177
- this.visitVariableDeclaration(node.declarations[0]);
1178
- for (let i = 1; i < numDeclarations; ++i) {
1179
- sb.push(", ");
1180
- this.visitVariableDeclaration(node.declarations[i]);
1181
- }
1182
- }
1183
- visitWhileStatement(node) {
1184
- var sb = this.sb;
1185
- sb.push("while (");
1186
- this.visitNode(node.condition);
1187
- var statement = node.body;
1188
- if (statement.kind == 34) {
1189
- sb.push(")");
1190
- } else {
1191
- sb.push(") ");
1192
- this.visitNode(node.body);
1193
- }
1194
- }
1195
- serializeDecorator(node) {
1196
- var sb = this.sb;
1197
- sb.push("@");
1198
- this.visitNode(node.name);
1199
- var args = node.args;
1200
- if (args) {
1201
- sb.push("(");
1202
- let numArgs = args.length;
1203
- if (numArgs) {
1204
- this.visitNode(args[0]);
1205
- for (let i = 1; i < numArgs; ++i) {
1206
- sb.push(", ");
1207
- this.visitNode(args[i]);
1208
- }
1209
- }
1210
- sb.push(")\n");
1211
- } else {
1212
- sb.push("\n");
1213
- }
1214
- util.indent(sb, this.indentLevel);
1215
- }
1216
- serializeParameter(node) {
1217
- var sb = this.sb;
1218
- var kind = node.parameterKind;
1219
- var implicitFieldDeclaration = node.implicitFieldDeclaration;
1220
- if (implicitFieldDeclaration) {
1221
- this.serializeAccessModifiers(implicitFieldDeclaration);
1222
- }
1223
- if (kind == 2) {
1224
- sb.push("...");
1225
- }
1226
- this.visitIdentifierExpression(node.name);
1227
- var type = node.type;
1228
- var initializer = node.initializer;
1229
- if (type) {
1230
- if (kind == 1 && !initializer) sb.push("?");
1231
- if (!isTypeOmitted(type)) {
1232
- sb.push(": ");
1233
- this.visitTypeNode(type);
1234
- }
1235
- }
1236
- if (initializer) {
1237
- sb.push(" = ");
1238
- this.visitNode(initializer);
1239
- }
1240
- }
1241
- serializeExternalModifiers(node) {
1242
- var sb = this.sb;
1243
- if (node.is(2)) {
1244
- sb.push("export ");
1245
- } else if (node.is(1)) {
1246
- sb.push("import ");
1247
- } else if (node.is(4)) {
1248
- sb.push("declare ");
1249
- }
1250
- }
1251
- serializeAccessModifiers(node) {
1252
- var sb = this.sb;
1253
- if (node.is(256)) {
1254
- sb.push("public ");
1255
- } else if (node.is(512)) {
1256
- sb.push("private ");
1257
- } else if (node.is(1024)) {
1258
- sb.push("protected ");
1259
- }
1260
- if (node.is(32)) {
1261
- sb.push("static ");
1262
- } else if (node.is(128)) {
1263
- sb.push("abstract ");
1264
- }
1265
- if (node.is(64)) {
1266
- sb.push("readonly ");
1267
- }
1268
- }
1269
- finish() {
1270
- var ret = this.sb.join("");
1271
- this.sb = [];
1272
- return ret;
1273
- }
1151
+ sb.push("}");
1152
+ }
1153
+ visitThrowStatement(node) {
1154
+ this.sb.push("throw ");
1155
+ this.visitNode(node.value);
1156
+ }
1157
+ visitTryStatement(node) {
1158
+ var sb = this.sb;
1159
+ sb.push("try {\n");
1160
+ var indentLevel = ++this.indentLevel;
1161
+ var statements = node.bodyStatements;
1162
+ for (let i = 0, k = statements.length; i < k; ++i) {
1163
+ util.indent(sb, indentLevel);
1164
+ this.visitNodeAndTerminate(statements[i]);
1165
+ }
1166
+ var catchVariable = node.catchVariable;
1167
+ if (catchVariable) {
1168
+ util.indent(sb, indentLevel - 1);
1169
+ sb.push("} catch (");
1170
+ this.visitIdentifierExpression(catchVariable);
1171
+ sb.push(") {\n");
1172
+ let catchStatements = node.catchStatements;
1173
+ if (catchStatements) {
1174
+ for (let i = 0, k = catchStatements.length; i < k; ++i) {
1175
+ util.indent(sb, indentLevel);
1176
+ this.visitNodeAndTerminate(catchStatements[i]);
1177
+ }
1178
+ }
1179
+ }
1180
+ var finallyStatements = node.finallyStatements;
1181
+ if (finallyStatements) {
1182
+ util.indent(sb, indentLevel - 1);
1183
+ sb.push("} finally {\n");
1184
+ for (let i = 0, k = finallyStatements.length; i < k; ++i) {
1185
+ util.indent(sb, indentLevel);
1186
+ this.visitNodeAndTerminate(finallyStatements[i]);
1187
+ }
1188
+ }
1189
+ util.indent(sb, indentLevel - 1);
1190
+ sb.push("}");
1191
+ }
1192
+ visitTypeDeclaration(node) {
1193
+ var decorators = node.decorators;
1194
+ if (decorators) {
1195
+ for (let i = 0, k = decorators.length; i < k; ++i) {
1196
+ this.serializeDecorator(decorators[i]);
1197
+ }
1198
+ }
1199
+ var sb = this.sb;
1200
+ this.serializeExternalModifiers(node);
1201
+ sb.push("type ");
1202
+ this.visitIdentifierExpression(node.name);
1203
+ var typeParameters = node.typeParameters;
1204
+ if (typeParameters) {
1205
+ let numTypeParameters = typeParameters.length;
1206
+ if (numTypeParameters) {
1207
+ sb.push("<");
1208
+ for (let i = 0; i < numTypeParameters; ++i) {
1209
+ this.visitTypeParameter(typeParameters[i]);
1210
+ }
1211
+ sb.push(">");
1212
+ }
1213
+ }
1214
+ sb.push(" = ");
1215
+ this.visitTypeNode(node.type);
1216
+ }
1217
+ visitVariableDeclaration(node) {
1218
+ this.visitIdentifierExpression(node.name);
1219
+ var type = node.type;
1220
+ var sb = this.sb;
1221
+ if (node.flags & 16384) {
1222
+ sb.push("!");
1223
+ }
1224
+ if (type) {
1225
+ sb.push(": ");
1226
+ this.visitTypeNode(type);
1227
+ }
1228
+ var initializer = node.initializer;
1229
+ if (initializer) {
1230
+ sb.push(" = ");
1231
+ this.visitNode(initializer);
1232
+ }
1233
+ }
1234
+ visitVariableStatement(node) {
1235
+ var decorators = node.decorators;
1236
+ if (decorators) {
1237
+ for (let i = 0, k = decorators.length; i < k; ++i) {
1238
+ this.serializeDecorator(decorators[i]);
1239
+ }
1240
+ }
1241
+ var sb = this.sb;
1242
+ var declarations = node.declarations;
1243
+ var numDeclarations = declarations.length;
1244
+ var firstDeclaration = declarations[0];
1245
+ this.serializeExternalModifiers(firstDeclaration);
1246
+ sb.push(firstDeclaration.is(8) ? "const " : firstDeclaration.is(16) ? "let " : "var ");
1247
+ this.visitVariableDeclaration(node.declarations[0]);
1248
+ for (let i = 1; i < numDeclarations; ++i) {
1249
+ sb.push(", ");
1250
+ this.visitVariableDeclaration(node.declarations[i]);
1251
+ }
1252
+ }
1253
+ visitWhileStatement(node) {
1254
+ var sb = this.sb;
1255
+ sb.push("while (");
1256
+ this.visitNode(node.condition);
1257
+ var statement = node.body;
1258
+ if (statement.kind == 34) {
1259
+ sb.push(")");
1260
+ }
1261
+ else {
1262
+ sb.push(") ");
1263
+ this.visitNode(node.body);
1264
+ }
1265
+ }
1266
+ serializeDecorator(node) {
1267
+ var sb = this.sb;
1268
+ sb.push("@");
1269
+ this.visitNode(node.name);
1270
+ var args = node.args;
1271
+ if (args) {
1272
+ sb.push("(");
1273
+ let numArgs = args.length;
1274
+ if (numArgs) {
1275
+ this.visitNode(args[0]);
1276
+ for (let i = 1; i < numArgs; ++i) {
1277
+ sb.push(", ");
1278
+ this.visitNode(args[i]);
1279
+ }
1280
+ }
1281
+ sb.push(")\n");
1282
+ }
1283
+ else {
1284
+ sb.push("\n");
1285
+ }
1286
+ util.indent(sb, this.indentLevel);
1287
+ }
1288
+ serializeParameter(node) {
1289
+ var sb = this.sb;
1290
+ var kind = node.parameterKind;
1291
+ var implicitFieldDeclaration = node.implicitFieldDeclaration;
1292
+ if (implicitFieldDeclaration) {
1293
+ this.serializeAccessModifiers(implicitFieldDeclaration);
1294
+ }
1295
+ if (kind == 2) {
1296
+ sb.push("...");
1297
+ }
1298
+ this.visitIdentifierExpression(node.name);
1299
+ var type = node.type;
1300
+ var initializer = node.initializer;
1301
+ if (type) {
1302
+ if (kind == 1 && !initializer)
1303
+ sb.push("?");
1304
+ if (!isTypeOmitted(type)) {
1305
+ sb.push(": ");
1306
+ this.visitTypeNode(type);
1307
+ }
1308
+ }
1309
+ if (initializer) {
1310
+ sb.push(" = ");
1311
+ this.visitNode(initializer);
1312
+ }
1313
+ }
1314
+ serializeExternalModifiers(node) {
1315
+ var sb = this.sb;
1316
+ if (node.is(2)) {
1317
+ sb.push("export ");
1318
+ }
1319
+ else if (node.is(1)) {
1320
+ sb.push("import ");
1321
+ }
1322
+ else if (node.is(4)) {
1323
+ sb.push("declare ");
1324
+ }
1325
+ }
1326
+ serializeAccessModifiers(node) {
1327
+ var sb = this.sb;
1328
+ if (node.is(256)) {
1329
+ sb.push("public ");
1330
+ }
1331
+ else if (node.is(512)) {
1332
+ sb.push("private ");
1333
+ }
1334
+ else if (node.is(1024)) {
1335
+ sb.push("protected ");
1336
+ }
1337
+ if (node.is(32)) {
1338
+ sb.push("static ");
1339
+ }
1340
+ else if (node.is(128)) {
1341
+ sb.push("abstract ");
1342
+ }
1343
+ if (node.is(64)) {
1344
+ sb.push("readonly ");
1345
+ }
1346
+ }
1347
+ finish() {
1348
+ var ret = this.sb.join("");
1349
+ this.sb = [];
1350
+ return ret;
1351
+ }
1274
1352
  }
1275
- //# sourceMappingURL=builder.js.map
1353
+ //# sourceMappingURL=builder.js.map