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

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 (36) hide show
  1. package/.gitmodules +0 -0
  2. package/CHANGELOG +11 -0
  3. package/README.md +3 -2
  4. package/assembly/__benches__/misc.bench.ts +0 -19
  5. package/assembly/deserialize/simple/object.ts +2 -3
  6. package/assembly/index.ts +2 -7
  7. package/assembly/serialize/simd/string.ts +1 -1
  8. package/assembly/serialize/simple/array.ts +1 -1
  9. package/assembly/serialize/simple/bool.ts +1 -1
  10. package/assembly/serialize/simple/date.ts +1 -1
  11. package/assembly/serialize/simple/float.ts +1 -1
  12. package/assembly/serialize/simple/integer.ts +1 -1
  13. package/assembly/serialize/simple/map.ts +1 -1
  14. package/assembly/serialize/simple/string.ts +2 -2
  15. package/assembly/test.ts +8 -13
  16. package/modules/as-bs/LICENSE +21 -0
  17. package/modules/as-bs/README.md +95 -0
  18. package/modules/{bs → as-bs/assembly}/index.ts +11 -12
  19. package/modules/as-bs/assembly/tsconfig.json +97 -0
  20. package/modules/as-bs/index.ts +1 -0
  21. package/modules/as-bs/package.json +32 -0
  22. package/package.json +4 -5
  23. package/transform/lib/builder.js +1262 -1340
  24. package/transform/lib/index.js +512 -572
  25. package/transform/lib/index.js.map +1 -1
  26. package/transform/lib/linker.js +10 -12
  27. package/transform/lib/types.js +19 -18
  28. package/transform/lib/types.js.map +1 -1
  29. package/transform/lib/util.js +34 -34
  30. package/transform/lib/visitor.js +526 -529
  31. package/transform/package.json +2 -1
  32. package/transform/src/index.ts +19 -8
  33. package/transform/src/types.ts +1 -0
  34. package/modules/tsconfig.json +0 -8
  35. package/transform/lib/index.old.js +0 -404
  36. package/transform/lib/index.old.js.map +0 -1
@@ -1,1353 +1,1275 @@
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)
5
- throw new Error(message);
6
- return isTruish;
4
+ if (!isTruish) throw new Error(message);
5
+ return isTruish;
7
6
  }
8
7
  export class ASTBuilder extends Visitor {
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) {
211
- this.visitNode(node.expression);
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;
257
- this.visitNode(node.expression);
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) {
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(">");
317
166
  this.visitNode(node.expression);
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("(");
167
+ break;
168
+ }
169
+ case 1: {
473
170
  this.visitNode(node.expression);
474
- sb.push(")");
475
- }
476
- visitPropertyAccessExpression(node) {
171
+ sb.push(" as ");
172
+ if (node.toType) this.visitTypeNode(node.toType);
173
+ break;
174
+ }
175
+ case 2: {
477
176
  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) {
177
+ sb.push("!");
178
+ break;
179
+ }
180
+ case 3: {
773
181
  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
- }
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) {
874
847
  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");
1149
- }
1150
- --this.indentLevel;
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) {
848
+ assert(isTypeOmitted(returnType));
849
+ } else {
850
+ if (isTypeOmitted(returnType)) {
1259
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
+ 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]);
1260
922
  }
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
- }
923
+ --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
+ }
1352
1274
  }
1353
- //# sourceMappingURL=builder.js.map
1275
+ //# sourceMappingURL=builder.js.map