json-as 0.9.29 → 1.0.0-alpha.1

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 (107) hide show
  1. package/.github/workflows/nodejs.yml +0 -3
  2. package/.prettierrc.json +3 -2
  3. package/CHANGELOG +13 -0
  4. package/LICENSE +1 -1
  5. package/README.md +22 -7
  6. package/as-test.config.json +1 -1
  7. package/asconfig.json +2 -2
  8. package/assembly/__benches__/misc.bench.ts +17 -32
  9. package/assembly/__tests__/bool.spec.ts +1 -1
  10. package/assembly/__tests__/simd/string.spec.ts +32 -0
  11. package/assembly/custom/memory.ts +25 -0
  12. package/assembly/custom/util.ts +14 -92
  13. package/assembly/deserialize/simd/string.ts +103 -0
  14. package/assembly/deserialize/simple/arbitrary.ts +17 -0
  15. package/assembly/deserialize/simple/array/arbitrary.ts +113 -0
  16. package/assembly/deserialize/simple/array/array.ts +18 -0
  17. package/assembly/deserialize/simple/array/bool.ts +17 -0
  18. package/assembly/deserialize/simple/array/float.ts +28 -0
  19. package/assembly/deserialize/simple/array/integer.ts +27 -0
  20. package/assembly/deserialize/simple/array/map.ts +18 -0
  21. package/assembly/deserialize/simple/array/object.ts +18 -0
  22. package/assembly/deserialize/simple/array/string.ts +22 -0
  23. package/assembly/deserialize/simple/array.ts +48 -0
  24. package/assembly/deserialize/simple/bool.ts +9 -0
  25. package/assembly/deserialize/simple/date.ts +11 -0
  26. package/assembly/deserialize/simple/float.ts +10 -0
  27. package/assembly/deserialize/simple/integer.ts +5 -0
  28. package/assembly/deserialize/simple/map.ts +154 -0
  29. package/assembly/deserialize/simple/object.ts +159 -0
  30. package/assembly/deserialize/simple/string.ts +48 -0
  31. package/assembly/globals/tables.ts +417 -0
  32. package/assembly/index.d.ts +9 -13
  33. package/assembly/index.ts +266 -146
  34. package/assembly/serialize/simd/string.ts +176 -0
  35. package/assembly/serialize/simple/arbitrary.ts +36 -0
  36. package/assembly/serialize/simple/array.ts +32 -0
  37. package/assembly/serialize/simple/bool.ts +19 -0
  38. package/assembly/serialize/simple/date.ts +13 -0
  39. package/assembly/serialize/simple/float.ts +7 -0
  40. package/assembly/serialize/simple/integer.ts +7 -0
  41. package/assembly/serialize/simple/map.ts +43 -0
  42. package/assembly/serialize/simple/object.ts +7 -0
  43. package/assembly/serialize/simple/string.ts +48 -0
  44. package/assembly/test.ts +41 -27
  45. package/assembly/tsconfig.json +2 -91
  46. package/assembly/types.ts +0 -0
  47. package/assembly/util/atoi.ts +35 -0
  48. package/assembly/util/bytes.ts +12 -0
  49. package/assembly/util/concat.ts +9 -0
  50. package/assembly/util/getArrayDepth.ts +17 -0
  51. package/assembly/util/index.ts +5 -0
  52. package/assembly/util/isSpace.ts +4 -0
  53. package/assembly/util/nextPowerOf2.ts +4 -0
  54. package/assembly/util/ptrToStr.ts +7 -0
  55. package/assembly/util/snp.ts +69 -0
  56. package/bench.js +5 -5
  57. package/modules/bs/index.ts +167 -0
  58. package/modules/tsconfig.json +8 -0
  59. package/package.json +42 -48
  60. package/transform/lib/builder.js +1353 -0
  61. package/transform/lib/builder.js.map +1 -0
  62. package/transform/lib/index.js +497 -332
  63. package/transform/lib/index.js.map +1 -1
  64. package/transform/lib/index.old.js +404 -0
  65. package/transform/lib/index.old.js.map +1 -0
  66. package/transform/lib/linker.js +18 -0
  67. package/transform/lib/linker.js.map +1 -0
  68. package/transform/lib/types.js +25 -0
  69. package/transform/lib/types.js.map +1 -0
  70. package/transform/lib/util.js +47 -0
  71. package/transform/lib/util.js.map +1 -0
  72. package/transform/lib/visitor.js +529 -446
  73. package/transform/lib/visitor.js.map +1 -0
  74. package/transform/package.json +1 -34
  75. package/transform/src/builder.ts +1371 -0
  76. package/transform/src/index.ts +564 -341
  77. package/transform/src/linker.ts +21 -0
  78. package/transform/src/types.ts +27 -0
  79. package/transform/src/util.ts +56 -0
  80. package/transform/src/visitor.ts +531 -0
  81. package/transform/tsconfig.json +3 -1
  82. package/assembly/__benches__/as-tral.d.ts +0 -1
  83. package/assembly/__tests__/date.spec.ts +0 -12
  84. package/assembly/custom/bs.ts +0 -202
  85. package/assembly/deserialize/array/array.ts +0 -31
  86. package/assembly/deserialize/array/bool.ts +0 -19
  87. package/assembly/deserialize/array/float.ts +0 -24
  88. package/assembly/deserialize/array/integer.ts +0 -24
  89. package/assembly/deserialize/array/map.ts +0 -27
  90. package/assembly/deserialize/array/object.ts +0 -27
  91. package/assembly/deserialize/array/string.ts +0 -29
  92. package/assembly/deserialize/array.ts +0 -46
  93. package/assembly/deserialize/bool.ts +0 -34
  94. package/assembly/deserialize/date.ts +0 -19
  95. package/assembly/deserialize/float.ts +0 -21
  96. package/assembly/deserialize/integer.ts +0 -16
  97. package/assembly/deserialize/map.ts +0 -139
  98. package/assembly/deserialize/object.ts +0 -211
  99. package/assembly/deserialize/string.ts +0 -149
  100. package/assembly/serialize/array.ts +0 -44
  101. package/assembly/serialize/bool.ts +0 -10
  102. package/assembly/serialize/date.ts +0 -4
  103. package/assembly/serialize/float.ts +0 -4
  104. package/assembly/serialize/integer.ts +0 -5
  105. package/assembly/serialize/map.ts +0 -24
  106. package/assembly/serialize/object.ts +0 -13
  107. package/assembly/serialize/string.ts +0 -284
@@ -0,0 +1,1353 @@
1
+ import { isTypeOmitted, operatorTokenToString, util } from "assemblyscript/dist/assemblyscript.js";
2
+ import { Visitor } from "./visitor.js";
3
+ function assert(isTruish, message = "assertion error") {
4
+ if (!isTruish)
5
+ throw new Error(message);
6
+ return isTruish;
7
+ }
8
+ 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) {
317
+ 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("(");
473
+ this.visitNode(node.expression);
474
+ sb.push(")");
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");
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) {
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
+ }
1352
+ }
1353
+ //# sourceMappingURL=builder.js.map