json-as 0.9.29 → 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 (110) hide show
  1. package/.github/workflows/nodejs.yml +0 -3
  2. package/.gitmodules +0 -0
  3. package/.prettierrc.json +3 -2
  4. package/CHANGELOG +24 -0
  5. package/LICENSE +1 -1
  6. package/README.md +23 -7
  7. package/as-test.config.json +1 -1
  8. package/asconfig.json +2 -2
  9. package/assembly/__benches__/misc.bench.ts +0 -34
  10. package/assembly/__tests__/bool.spec.ts +1 -1
  11. package/assembly/__tests__/simd/string.spec.ts +32 -0
  12. package/assembly/custom/memory.ts +25 -0
  13. package/assembly/custom/util.ts +14 -92
  14. package/assembly/deserialize/simd/string.ts +103 -0
  15. package/assembly/deserialize/simple/arbitrary.ts +17 -0
  16. package/assembly/deserialize/simple/array/arbitrary.ts +113 -0
  17. package/assembly/deserialize/simple/array/array.ts +18 -0
  18. package/assembly/deserialize/simple/array/bool.ts +17 -0
  19. package/assembly/deserialize/simple/array/float.ts +28 -0
  20. package/assembly/deserialize/simple/array/integer.ts +27 -0
  21. package/assembly/deserialize/simple/array/map.ts +18 -0
  22. package/assembly/deserialize/simple/array/object.ts +18 -0
  23. package/assembly/deserialize/simple/array/string.ts +22 -0
  24. package/assembly/deserialize/simple/array.ts +48 -0
  25. package/assembly/deserialize/simple/bool.ts +9 -0
  26. package/assembly/deserialize/simple/date.ts +11 -0
  27. package/assembly/deserialize/simple/float.ts +10 -0
  28. package/assembly/deserialize/simple/integer.ts +5 -0
  29. package/assembly/deserialize/simple/map.ts +154 -0
  30. package/assembly/deserialize/simple/object.ts +158 -0
  31. package/assembly/deserialize/simple/string.ts +48 -0
  32. package/assembly/globals/tables.ts +417 -0
  33. package/assembly/index.d.ts +9 -13
  34. package/assembly/index.ts +261 -146
  35. package/assembly/serialize/simd/string.ts +176 -0
  36. package/assembly/serialize/simple/arbitrary.ts +36 -0
  37. package/assembly/serialize/simple/array.ts +32 -0
  38. package/assembly/serialize/simple/bool.ts +19 -0
  39. package/assembly/serialize/simple/date.ts +13 -0
  40. package/assembly/serialize/simple/float.ts +7 -0
  41. package/assembly/serialize/simple/integer.ts +7 -0
  42. package/assembly/serialize/simple/map.ts +43 -0
  43. package/assembly/serialize/simple/object.ts +7 -0
  44. package/assembly/serialize/simple/string.ts +48 -0
  45. package/assembly/test.ts +36 -27
  46. package/assembly/tsconfig.json +2 -91
  47. package/assembly/types.ts +0 -0
  48. package/assembly/util/atoi.ts +35 -0
  49. package/assembly/util/bytes.ts +12 -0
  50. package/assembly/util/concat.ts +9 -0
  51. package/assembly/util/getArrayDepth.ts +17 -0
  52. package/assembly/util/index.ts +5 -0
  53. package/assembly/util/isSpace.ts +4 -0
  54. package/assembly/util/nextPowerOf2.ts +4 -0
  55. package/assembly/util/ptrToStr.ts +7 -0
  56. package/assembly/util/snp.ts +69 -0
  57. package/bench.js +5 -5
  58. package/modules/as-bs/LICENSE +21 -0
  59. package/modules/as-bs/README.md +95 -0
  60. package/modules/as-bs/assembly/index.ts +166 -0
  61. package/modules/as-bs/assembly/tsconfig.json +97 -0
  62. package/modules/as-bs/index.ts +1 -0
  63. package/modules/as-bs/package.json +32 -0
  64. package/package.json +41 -48
  65. package/transform/lib/builder.js +1275 -0
  66. package/transform/lib/builder.js.map +1 -0
  67. package/transform/lib/index.js +548 -443
  68. package/transform/lib/index.js.map +1 -1
  69. package/transform/lib/linker.js +16 -0
  70. package/transform/lib/linker.js.map +1 -0
  71. package/transform/lib/types.js +26 -0
  72. package/transform/lib/types.js.map +1 -0
  73. package/transform/lib/util.js +47 -0
  74. package/transform/lib/util.js.map +1 -0
  75. package/transform/lib/visitor.js +510 -430
  76. package/transform/lib/visitor.js.map +1 -0
  77. package/transform/package.json +1 -33
  78. package/transform/src/builder.ts +1371 -0
  79. package/transform/src/index.ts +574 -340
  80. package/transform/src/linker.ts +21 -0
  81. package/transform/src/types.ts +28 -0
  82. package/transform/src/util.ts +56 -0
  83. package/transform/src/visitor.ts +531 -0
  84. package/transform/tsconfig.json +3 -1
  85. package/assembly/__benches__/as-tral.d.ts +0 -1
  86. package/assembly/__tests__/date.spec.ts +0 -12
  87. package/assembly/custom/bs.ts +0 -202
  88. package/assembly/deserialize/array/array.ts +0 -31
  89. package/assembly/deserialize/array/bool.ts +0 -19
  90. package/assembly/deserialize/array/float.ts +0 -24
  91. package/assembly/deserialize/array/integer.ts +0 -24
  92. package/assembly/deserialize/array/map.ts +0 -27
  93. package/assembly/deserialize/array/object.ts +0 -27
  94. package/assembly/deserialize/array/string.ts +0 -29
  95. package/assembly/deserialize/array.ts +0 -46
  96. package/assembly/deserialize/bool.ts +0 -34
  97. package/assembly/deserialize/date.ts +0 -19
  98. package/assembly/deserialize/float.ts +0 -21
  99. package/assembly/deserialize/integer.ts +0 -16
  100. package/assembly/deserialize/map.ts +0 -139
  101. package/assembly/deserialize/object.ts +0 -211
  102. package/assembly/deserialize/string.ts +0 -149
  103. package/assembly/serialize/array.ts +0 -44
  104. package/assembly/serialize/bool.ts +0 -10
  105. package/assembly/serialize/date.ts +0 -4
  106. package/assembly/serialize/float.ts +0 -4
  107. package/assembly/serialize/integer.ts +0 -5
  108. package/assembly/serialize/map.ts +0 -24
  109. package/assembly/serialize/object.ts +0 -13
  110. package/assembly/serialize/string.ts +0 -284
@@ -0,0 +1,1275 @@
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) throw new Error(message);
5
+ return isTruish;
6
+ }
7
+ export class ASTBuilder extends Visitor {
8
+ static build(node) {
9
+ var builder = new ASTBuilder();
10
+ builder.visitNode(node);
11
+ return builder.finish();
12
+ }
13
+ sb = [];
14
+ indentLevel = 0;
15
+ visitNode(node) {
16
+ return this.visit(node);
17
+ }
18
+ visitSource(source) {
19
+ var statements = source.statements;
20
+ for (let i = 0, k = statements.length; i < k; ++i) {
21
+ this.visitNodeAndTerminate(statements[i]);
22
+ }
23
+ }
24
+ visitTypeNode(node) {
25
+ switch (node.kind) {
26
+ case 1: {
27
+ this.visitNamedTypeNode(node);
28
+ break;
29
+ }
30
+ case 2: {
31
+ this.visitFunctionTypeNode(node);
32
+ break;
33
+ }
34
+ default:
35
+ assert(false);
36
+ }
37
+ }
38
+ visitTypeName(node) {
39
+ this.visitIdentifierExpression(node.identifier);
40
+ var sb = this.sb;
41
+ var current = node.next;
42
+ while (current) {
43
+ sb.push(".");
44
+ this.visitIdentifierExpression(current.identifier);
45
+ current = current.next;
46
+ }
47
+ }
48
+ visitNamedTypeNode(node) {
49
+ this.visitTypeName(node.name);
50
+ var typeArguments = node.typeArguments;
51
+ if (typeArguments) {
52
+ let numTypeArguments = typeArguments.length;
53
+ let sb = this.sb;
54
+ if (numTypeArguments) {
55
+ sb.push("<");
56
+ this.visitTypeNode(typeArguments[0]);
57
+ for (let i = 1; i < numTypeArguments; ++i) {
58
+ sb.push(", ");
59
+ this.visitTypeNode(typeArguments[i]);
60
+ }
61
+ sb.push(">");
62
+ }
63
+ if (node.isNullable) sb.push(" | null");
64
+ }
65
+ }
66
+ visitFunctionTypeNode(node) {
67
+ var isNullable = node.isNullable;
68
+ var sb = this.sb;
69
+ sb.push(isNullable ? "((" : "(");
70
+ var explicitThisType = node.explicitThisType;
71
+ if (explicitThisType) {
72
+ sb.push("this: ");
73
+ this.visitTypeNode(explicitThisType);
74
+ }
75
+ var parameters = node.parameters;
76
+ var numParameters = parameters.length;
77
+ if (numParameters) {
78
+ if (explicitThisType) sb.push(", ");
79
+ this.serializeParameter(parameters[0]);
80
+ for (let i = 1; i < numParameters; ++i) {
81
+ sb.push(", ");
82
+ this.serializeParameter(parameters[i]);
83
+ }
84
+ }
85
+ var returnType = node.returnType;
86
+ if (returnType) {
87
+ sb.push(") => ");
88
+ this.visitTypeNode(returnType);
89
+ } else {
90
+ sb.push(") => void");
91
+ }
92
+ if (isNullable) sb.push(") | null");
93
+ }
94
+ visitTypeParameter(node) {
95
+ this.visitIdentifierExpression(node.name);
96
+ var extendsType = node.extendsType;
97
+ if (extendsType) {
98
+ this.sb.push(" extends ");
99
+ this.visitTypeNode(extendsType);
100
+ }
101
+ var defaultType = node.defaultType;
102
+ if (defaultType) {
103
+ this.sb.push("=");
104
+ this.visitTypeNode(defaultType);
105
+ }
106
+ }
107
+ visitIdentifierExpression(node) {
108
+ if (node.isQuoted) this.visitStringLiteral(node.text);
109
+ else this.sb.push(node.text);
110
+ }
111
+ visitArrayLiteralExpression(node) {
112
+ var sb = this.sb;
113
+ sb.push("[");
114
+ var elements = node.elementExpressions;
115
+ var numElements = elements.length;
116
+ if (numElements) {
117
+ let element = elements[0];
118
+ if (element) this.visitNode(element);
119
+ for (let i = 1; i < numElements; ++i) {
120
+ element = elements[i];
121
+ sb.push(", ");
122
+ if (element) this.visitNode(element);
123
+ }
124
+ }
125
+ sb.push("]");
126
+ }
127
+ visitObjectLiteralExpression(node) {
128
+ var sb = this.sb;
129
+ var names = node.names;
130
+ var values = node.values;
131
+ var numElements = names.length;
132
+ assert(numElements == values.length);
133
+ if (numElements) {
134
+ sb.push("{\n");
135
+ util.indent(sb, ++this.indentLevel);
136
+ this.visitNode(names[0]);
137
+ sb.push(": ");
138
+ this.visitNode(values[0]);
139
+ for (let i = 1; i < numElements; ++i) {
140
+ sb.push(",\n");
141
+ util.indent(sb, this.indentLevel);
142
+ let name = names[i];
143
+ let value = values[i];
144
+ if (name == value) {
145
+ this.visitNode(name);
146
+ } else {
147
+ this.visitNode(name);
148
+ sb.push(": ");
149
+ this.visitNode(value);
150
+ }
151
+ }
152
+ sb.push("\n");
153
+ util.indent(sb, --this.indentLevel);
154
+ sb.push("}");
155
+ } else {
156
+ sb.push("{}");
157
+ }
158
+ }
159
+ visitAssertionExpression(node) {
160
+ var sb = this.sb;
161
+ switch (node.assertionKind) {
162
+ case 0: {
163
+ sb.push("<");
164
+ if (node.toType) this.visitTypeNode(node.toType);
165
+ sb.push(">");
166
+ this.visitNode(node.expression);
167
+ break;
168
+ }
169
+ case 1: {
170
+ this.visitNode(node.expression);
171
+ sb.push(" as ");
172
+ if (node.toType) this.visitTypeNode(node.toType);
173
+ break;
174
+ }
175
+ case 2: {
176
+ this.visitNode(node.expression);
177
+ sb.push("!");
178
+ break;
179
+ }
180
+ case 3: {
181
+ this.visitNode(node.expression);
182
+ sb.push(" as const");
183
+ break;
184
+ }
185
+ default:
186
+ assert(false);
187
+ }
188
+ }
189
+ visitBinaryExpression(node) {
190
+ var sb = this.sb;
191
+ this.visitNode(node.left);
192
+ sb.push(" ");
193
+ sb.push(operatorTokenToString(node.operator));
194
+ sb.push(" ");
195
+ this.visitNode(node.right);
196
+ }
197
+ visitCallExpression(node) {
198
+ this.visitNode(node.expression);
199
+ this.visitArguments(node.typeArguments, node.args);
200
+ }
201
+ visitArguments(typeArguments, args) {
202
+ var sb = this.sb;
203
+ if (typeArguments) {
204
+ let numTypeArguments = typeArguments.length;
205
+ if (numTypeArguments) {
206
+ sb.push("<");
207
+ this.visitTypeNode(typeArguments[0]);
208
+ for (let i = 1; i < numTypeArguments; ++i) {
209
+ sb.push(", ");
210
+ this.visitTypeNode(typeArguments[i]);
211
+ }
212
+ sb.push(">(");
213
+ }
214
+ } else {
215
+ sb.push("(");
216
+ }
217
+ var numArgs = args.length;
218
+ if (numArgs) {
219
+ this.visitNode(args[0]);
220
+ for (let i = 1; i < numArgs; ++i) {
221
+ sb.push(", ");
222
+ this.visitNode(args[i]);
223
+ }
224
+ }
225
+ sb.push(")");
226
+ }
227
+ visitClassExpression(node) {
228
+ var declaration = node.declaration;
229
+ this.visitClassDeclaration(declaration);
230
+ }
231
+ visitCommaExpression(node) {
232
+ var expressions = node.expressions;
233
+ var numExpressions = expressions.length;
234
+ this.visitNode(expressions[0]);
235
+ var sb = this.sb;
236
+ for (let i = 1; i < numExpressions; ++i) {
237
+ sb.push(",");
238
+ this.visitNode(expressions[i]);
239
+ }
240
+ }
241
+ visitElementAccessExpression(node) {
242
+ var sb = this.sb;
243
+ this.visitNode(node.expression);
244
+ sb.push("[");
245
+ this.visitNode(node.elementExpression);
246
+ sb.push("]");
247
+ }
248
+ visitFunctionExpression(node) {
249
+ var declaration = node.declaration;
250
+ if (!declaration.arrowKind) {
251
+ if (declaration.name.text.length) {
252
+ this.sb.push("function ");
253
+ } else {
254
+ this.sb.push("function");
255
+ }
256
+ } else {
257
+ assert(declaration.name.text.length == 0);
258
+ }
259
+ this.visitFunctionCommon(declaration);
260
+ }
261
+ visitLiteralExpression(node) {
262
+ switch (node.literalKind) {
263
+ case 0: {
264
+ this.visitFloatLiteralExpression(node);
265
+ break;
266
+ }
267
+ case 1: {
268
+ this.visitIntegerLiteralExpression(node);
269
+ break;
270
+ }
271
+ case 2: {
272
+ this.visitStringLiteralExpression(node);
273
+ break;
274
+ }
275
+ case 3: {
276
+ this.visitTemplateLiteralExpression(node);
277
+ break;
278
+ }
279
+ case 4: {
280
+ this.visitRegexpLiteralExpression(node);
281
+ break;
282
+ }
283
+ case 5: {
284
+ this.visitArrayLiteralExpression(node);
285
+ break;
286
+ }
287
+ case 6: {
288
+ this.visitObjectLiteralExpression(node);
289
+ break;
290
+ }
291
+ default: {
292
+ assert(false);
293
+ break;
294
+ }
295
+ }
296
+ }
297
+ visitFloatLiteralExpression(node) {
298
+ this.sb.push(node.value.toString());
299
+ }
300
+ visitInstanceOfExpression(node) {
301
+ this.visitNode(node.expression);
302
+ this.sb.push(" instanceof ");
303
+ this.visitTypeNode(node.isType);
304
+ }
305
+ visitIntegerLiteralExpression(node) {
306
+ this.sb.push(i64_to_string(node.value));
307
+ }
308
+ visitStringLiteral(str) {
309
+ var sb = this.sb;
310
+ sb.push('"');
311
+ this.visitRawString(str, 34);
312
+ sb.push('"');
313
+ }
314
+ visitRawString(str, quote) {
315
+ var sb = this.sb;
316
+ var off = 0;
317
+ var i = 0;
318
+ for (let k = str.length; i < k; ) {
319
+ switch (str.charCodeAt(i)) {
320
+ case 0: {
321
+ if (i > off) sb.push(str.substring(off, (off = i + 1)));
322
+ sb.push("\\0");
323
+ off = ++i;
324
+ break;
325
+ }
326
+ case 92: {
327
+ if (i > off) sb.push(str.substring(off, i));
328
+ off = ++i;
329
+ sb.push("\\b");
330
+ break;
331
+ }
332
+ case 9: {
333
+ if (i > off) sb.push(str.substring(off, i));
334
+ off = ++i;
335
+ sb.push("\\t");
336
+ break;
337
+ }
338
+ case 10: {
339
+ if (i > off) sb.push(str.substring(off, i));
340
+ off = ++i;
341
+ sb.push("\\n");
342
+ break;
343
+ }
344
+ case 11: {
345
+ if (i > off) sb.push(str.substring(off, i));
346
+ off = ++i;
347
+ sb.push("\\v");
348
+ break;
349
+ }
350
+ case 12: {
351
+ if (i > off) sb.push(str.substring(off, i));
352
+ off = ++i;
353
+ sb.push("\\f");
354
+ break;
355
+ }
356
+ case 13: {
357
+ if (i > off) sb.push(str.substring(off, i));
358
+ sb.push("\\r");
359
+ off = ++i;
360
+ break;
361
+ }
362
+ case 34: {
363
+ if (quote == 34) {
364
+ if (i > off) sb.push(str.substring(off, i));
365
+ sb.push('\\"');
366
+ off = ++i;
367
+ } else {
368
+ ++i;
369
+ }
370
+ break;
371
+ }
372
+ case 39: {
373
+ if (quote == 39) {
374
+ if (i > off) sb.push(str.substring(off, i));
375
+ sb.push("\\'");
376
+ off = ++i;
377
+ } else {
378
+ ++i;
379
+ }
380
+ break;
381
+ }
382
+ case 92: {
383
+ if (i > off) sb.push(str.substring(off, i));
384
+ sb.push("\\\\");
385
+ off = ++i;
386
+ break;
387
+ }
388
+ case 96: {
389
+ if (quote == 96) {
390
+ if (i > off) sb.push(str.substring(off, i));
391
+ sb.push("\\`");
392
+ off = ++i;
393
+ } else {
394
+ ++i;
395
+ }
396
+ break;
397
+ }
398
+ default: {
399
+ ++i;
400
+ break;
401
+ }
402
+ }
403
+ }
404
+ if (i > off) sb.push(str.substring(off, i));
405
+ }
406
+ visitStringLiteralExpression(node) {
407
+ this.visitStringLiteral(node.value);
408
+ }
409
+ visitTemplateLiteralExpression(node) {
410
+ var sb = this.sb;
411
+ var tag = node.tag;
412
+ var parts = node.parts;
413
+ var expressions = node.expressions;
414
+ if (tag) this.visitNode(tag);
415
+ sb.push("`");
416
+ this.visitRawString(parts[0], 96);
417
+ assert(parts.length == expressions.length + 1);
418
+ for (let i = 0, k = expressions.length; i < k; ++i) {
419
+ sb.push("${");
420
+ this.visitNode(expressions[i]);
421
+ sb.push("}");
422
+ this.visitRawString(parts[i + 1], 96);
423
+ }
424
+ sb.push("`");
425
+ }
426
+ visitRegexpLiteralExpression(node) {
427
+ var sb = this.sb;
428
+ sb.push("/");
429
+ sb.push(node.pattern);
430
+ sb.push("/");
431
+ sb.push(node.patternFlags);
432
+ }
433
+ visitNewExpression(node) {
434
+ this.sb.push("new ");
435
+ this.visitTypeName(node.typeName);
436
+ this.visitArguments(node.typeArguments, node.args);
437
+ }
438
+ visitParenthesizedExpression(node) {
439
+ var sb = this.sb;
440
+ sb.push("(");
441
+ this.visitNode(node.expression);
442
+ sb.push(")");
443
+ }
444
+ visitPropertyAccessExpression(node) {
445
+ this.visitNode(node.expression);
446
+ this.sb.push(".");
447
+ this.visitIdentifierExpression(node.property);
448
+ }
449
+ visitTernaryExpression(node) {
450
+ var sb = this.sb;
451
+ this.visitNode(node.condition);
452
+ sb.push(" ? ");
453
+ this.visitNode(node.ifThen);
454
+ sb.push(" : ");
455
+ this.visitNode(node.ifElse);
456
+ }
457
+ visitUnaryExpression(node) {
458
+ switch (node.kind) {
459
+ case 27: {
460
+ this.visitUnaryPostfixExpression(node);
461
+ break;
462
+ }
463
+ case 28: {
464
+ this.visitUnaryPrefixExpression(node);
465
+ break;
466
+ }
467
+ default:
468
+ assert(false);
469
+ }
470
+ }
471
+ visitUnaryPostfixExpression(node) {
472
+ this.visitNode(node.operand);
473
+ this.sb.push(operatorTokenToString(node.operator));
474
+ }
475
+ visitUnaryPrefixExpression(node) {
476
+ this.sb.push(operatorTokenToString(node.operator));
477
+ this.visitNode(node.operand);
478
+ }
479
+ visitNodeAndTerminate(node) {
480
+ this.visitNode(node);
481
+ var sb = this.sb;
482
+ if (!sb.length || node.kind == 47 || node.kind == 38) {
483
+ sb.push(";\n");
484
+ } else {
485
+ let last = sb[sb.length - 1];
486
+ let lastCharPos = last.length - 1;
487
+ if (lastCharPos >= 0 && (last.charCodeAt(lastCharPos) == 125 || last.charCodeAt(lastCharPos) == 59)) {
488
+ sb.push("\n");
489
+ } else {
490
+ sb.push(";\n");
491
+ }
492
+ }
493
+ }
494
+ visitBlockStatement(node) {
495
+ var sb = this.sb;
496
+ var statements = node.statements;
497
+ var numStatements = statements.length;
498
+ if (numStatements) {
499
+ sb.push("{\n");
500
+ let indentLevel = ++this.indentLevel;
501
+ for (let i = 0; i < numStatements; ++i) {
502
+ util.indent(sb, indentLevel);
503
+ this.visitNodeAndTerminate(statements[i]);
504
+ }
505
+ util.indent(sb, --this.indentLevel);
506
+ sb.push("}");
507
+ } else {
508
+ sb.push("{}");
509
+ }
510
+ }
511
+ visitBreakStatement(node) {
512
+ var label = node.label;
513
+ if (label) {
514
+ this.sb.push("break ");
515
+ this.visitIdentifierExpression(label);
516
+ } else {
517
+ this.sb.push("break");
518
+ }
519
+ }
520
+ visitContinueStatement(node) {
521
+ var label = node.label;
522
+ if (label) {
523
+ this.sb.push("continue ");
524
+ this.visitIdentifierExpression(label);
525
+ } else {
526
+ this.sb.push("continue");
527
+ }
528
+ }
529
+ visitClassDeclaration(node, isDefault = false) {
530
+ var decorators = node.decorators;
531
+ if (decorators) {
532
+ for (let i = 0, k = decorators.length; i < k; ++i) {
533
+ this.serializeDecorator(decorators[i]);
534
+ }
535
+ }
536
+ var sb = this.sb;
537
+ if (isDefault) {
538
+ sb.push("export default ");
539
+ } else {
540
+ this.serializeExternalModifiers(node);
541
+ }
542
+ if (node.is(128)) sb.push("abstract ");
543
+ if (node.name.text.length) {
544
+ sb.push("class ");
545
+ this.visitIdentifierExpression(node.name);
546
+ } else {
547
+ sb.push("class");
548
+ }
549
+ var typeParameters = node.typeParameters;
550
+ if (typeParameters != null && typeParameters.length > 0) {
551
+ sb.push("<");
552
+ this.visitTypeParameter(typeParameters[0]);
553
+ for (let i = 1, k = typeParameters.length; i < k; ++i) {
554
+ sb.push(", ");
555
+ this.visitTypeParameter(typeParameters[i]);
556
+ }
557
+ sb.push(">");
558
+ }
559
+ var extendsType = node.extendsType;
560
+ if (extendsType) {
561
+ sb.push(" extends ");
562
+ this.visitTypeNode(extendsType);
563
+ }
564
+ var implementsTypes = node.implementsTypes;
565
+ if (implementsTypes) {
566
+ let numImplementsTypes = implementsTypes.length;
567
+ if (numImplementsTypes) {
568
+ sb.push(" implements ");
569
+ this.visitTypeNode(implementsTypes[0]);
570
+ for (let i = 1; i < numImplementsTypes; ++i) {
571
+ sb.push(", ");
572
+ this.visitTypeNode(implementsTypes[i]);
573
+ }
574
+ }
575
+ }
576
+ var indexSignature = node.indexSignature;
577
+ var members = node.members;
578
+ var numMembers = members.length;
579
+ if (indexSignature !== null || numMembers) {
580
+ sb.push(" {\n");
581
+ let indentLevel = ++this.indentLevel;
582
+ if (indexSignature) {
583
+ util.indent(sb, indentLevel);
584
+ this.visitNodeAndTerminate(indexSignature);
585
+ }
586
+ for (let i = 0, k = members.length; i < k; ++i) {
587
+ let member = members[i];
588
+ if (member.kind != 54 || member.parameterIndex < 0) {
589
+ util.indent(sb, indentLevel);
590
+ this.visitNodeAndTerminate(member);
591
+ }
592
+ }
593
+ util.indent(sb, --this.indentLevel);
594
+ sb.push("}");
595
+ } else {
596
+ sb.push(" {}");
597
+ }
598
+ }
599
+ visitDoStatement(node) {
600
+ var sb = this.sb;
601
+ sb.push("do ");
602
+ this.visitNode(node.body);
603
+ if (node.body.kind == 30) {
604
+ sb.push(" while (");
605
+ } else {
606
+ util.indent(sb, this.indentLevel);
607
+ sb.push("while (");
608
+ }
609
+ this.visitNode(node.condition);
610
+ sb.push(")");
611
+ }
612
+ visitEmptyStatement(node) {}
613
+ visitEnumDeclaration(node, isDefault = false) {
614
+ var sb = this.sb;
615
+ if (isDefault) {
616
+ sb.push("export default ");
617
+ } else {
618
+ this.serializeExternalModifiers(node);
619
+ }
620
+ if (node.is(8)) sb.push("const ");
621
+ sb.push("enum ");
622
+ this.visitIdentifierExpression(node.name);
623
+ var values = node.values;
624
+ var numValues = values.length;
625
+ if (numValues) {
626
+ sb.push(" {\n");
627
+ let indentLevel = ++this.indentLevel;
628
+ util.indent(sb, indentLevel);
629
+ this.visitEnumValueDeclaration(node.values[0]);
630
+ for (let i = 1; i < numValues; ++i) {
631
+ sb.push(",\n");
632
+ util.indent(sb, indentLevel);
633
+ this.visitEnumValueDeclaration(node.values[i]);
634
+ }
635
+ sb.push("\n");
636
+ util.indent(sb, --this.indentLevel);
637
+ sb.push("}");
638
+ } else {
639
+ sb.push(" {}");
640
+ }
641
+ }
642
+ visitEnumValueDeclaration(node) {
643
+ this.visitIdentifierExpression(node.name);
644
+ var initializer = node.initializer;
645
+ if (initializer) {
646
+ this.sb.push(" = ");
647
+ this.visitNode(initializer);
648
+ }
649
+ }
650
+ visitExportImportStatement(node) {
651
+ var sb = this.sb;
652
+ sb.push("export import ");
653
+ this.visitIdentifierExpression(node.externalName);
654
+ sb.push(" = ");
655
+ this.visitIdentifierExpression(node.name);
656
+ }
657
+ visitExportMember(node) {
658
+ this.visitIdentifierExpression(node.localName);
659
+ if (node.exportedName.text != node.localName.text) {
660
+ this.sb.push(" as ");
661
+ this.visitIdentifierExpression(node.exportedName);
662
+ }
663
+ }
664
+ visitExportStatement(node) {
665
+ var sb = this.sb;
666
+ if (node.isDeclare) {
667
+ sb.push("declare ");
668
+ }
669
+ var members = node.members;
670
+ if (members == null) {
671
+ sb.push("export *");
672
+ } else if (members.length > 0) {
673
+ let numMembers = members.length;
674
+ sb.push("export {\n");
675
+ let indentLevel = ++this.indentLevel;
676
+ util.indent(sb, indentLevel);
677
+ this.visitExportMember(members[0]);
678
+ for (let i = 1; i < numMembers; ++i) {
679
+ sb.push(",\n");
680
+ util.indent(sb, indentLevel);
681
+ this.visitExportMember(members[i]);
682
+ }
683
+ --this.indentLevel;
684
+ sb.push("\n}");
685
+ } else {
686
+ sb.push("export {}");
687
+ }
688
+ var path = node.path;
689
+ if (path) {
690
+ sb.push(" from ");
691
+ this.visitStringLiteralExpression(path);
692
+ }
693
+ sb.push(";");
694
+ }
695
+ visitExportDefaultStatement(node) {
696
+ var declaration = node.declaration;
697
+ switch (declaration.kind) {
698
+ case 52: {
699
+ this.visitEnumDeclaration(declaration, true);
700
+ break;
701
+ }
702
+ case 55: {
703
+ this.visitFunctionDeclaration(declaration, true);
704
+ break;
705
+ }
706
+ case 51: {
707
+ this.visitClassDeclaration(declaration, true);
708
+ break;
709
+ }
710
+ case 57: {
711
+ this.visitInterfaceDeclaration(declaration, true);
712
+ break;
713
+ }
714
+ case 59: {
715
+ this.visitNamespaceDeclaration(declaration, true);
716
+ break;
717
+ }
718
+ default:
719
+ assert(false);
720
+ }
721
+ }
722
+ visitExpressionStatement(node) {
723
+ this.visitNode(node.expression);
724
+ }
725
+ visitFieldDeclaration(node) {
726
+ var decorators = node.decorators;
727
+ if (decorators) {
728
+ for (let i = 0, k = decorators.length; i < k; ++i) {
729
+ this.serializeDecorator(decorators[i]);
730
+ }
731
+ }
732
+ this.serializeAccessModifiers(node);
733
+ this.visitIdentifierExpression(node.name);
734
+ var sb = this.sb;
735
+ if (node.flags & 16384) {
736
+ sb.push("!");
737
+ }
738
+ var type = node.type;
739
+ if (type) {
740
+ sb.push(": ");
741
+ this.visitTypeNode(type);
742
+ }
743
+ var initializer = node.initializer;
744
+ if (initializer) {
745
+ sb.push(" = ");
746
+ this.visitNode(initializer);
747
+ }
748
+ }
749
+ visitForStatement(node) {
750
+ var sb = this.sb;
751
+ sb.push("for (");
752
+ var initializer = node.initializer;
753
+ if (initializer) {
754
+ this.visitNode(initializer);
755
+ }
756
+ var condition = node.condition;
757
+ if (condition) {
758
+ sb.push("; ");
759
+ this.visitNode(condition);
760
+ } else {
761
+ sb.push(";");
762
+ }
763
+ var incrementor = node.incrementor;
764
+ if (incrementor) {
765
+ sb.push("; ");
766
+ this.visitNode(incrementor);
767
+ } else {
768
+ sb.push(";");
769
+ }
770
+ sb.push(") ");
771
+ this.visitNode(node.body);
772
+ }
773
+ visitForOfStatement(node) {
774
+ var sb = this.sb;
775
+ sb.push("for (");
776
+ this.visitNode(node.variable);
777
+ sb.push(" of ");
778
+ this.visitNode(node.iterable);
779
+ sb.push(") ");
780
+ this.visitNode(node.body);
781
+ }
782
+ visitFunctionDeclaration(node, isDefault = false) {
783
+ var sb = this.sb;
784
+ var decorators = node.decorators;
785
+ if (decorators) {
786
+ for (let i = 0, k = decorators.length; i < k; ++i) {
787
+ this.serializeDecorator(decorators[i]);
788
+ }
789
+ }
790
+ if (isDefault) {
791
+ sb.push("export default ");
792
+ } else {
793
+ this.serializeExternalModifiers(node);
794
+ this.serializeAccessModifiers(node);
795
+ }
796
+ if (node.name.text.length) {
797
+ sb.push("function ");
798
+ } else {
799
+ sb.push("function");
800
+ }
801
+ this.visitFunctionCommon(node);
802
+ }
803
+ visitFunctionCommon(node) {
804
+ var sb = this.sb;
805
+ this.visitIdentifierExpression(node.name);
806
+ var signature = node.signature;
807
+ var typeParameters = node.typeParameters;
808
+ if (typeParameters) {
809
+ let numTypeParameters = typeParameters.length;
810
+ if (numTypeParameters) {
811
+ sb.push("<");
812
+ this.visitTypeParameter(typeParameters[0]);
813
+ for (let i = 1; i < numTypeParameters; ++i) {
814
+ sb.push(", ");
815
+ this.visitTypeParameter(typeParameters[i]);
816
+ }
817
+ sb.push(">");
818
+ }
819
+ }
820
+ if (node.arrowKind == 2) {
821
+ let parameters = signature.parameters;
822
+ assert(parameters.length == 1);
823
+ assert(!signature.explicitThisType);
824
+ this.serializeParameter(parameters[0]);
825
+ } else {
826
+ sb.push("(");
827
+ let parameters = signature.parameters;
828
+ let numParameters = parameters.length;
829
+ let explicitThisType = signature.explicitThisType;
830
+ if (explicitThisType) {
831
+ sb.push("this: ");
832
+ this.visitTypeNode(explicitThisType);
833
+ }
834
+ if (numParameters) {
835
+ if (explicitThisType) sb.push(", ");
836
+ this.serializeParameter(parameters[0]);
837
+ for (let i = 1; i < numParameters; ++i) {
838
+ sb.push(", ");
839
+ this.serializeParameter(parameters[i]);
840
+ }
841
+ }
842
+ }
843
+ var body = node.body;
844
+ var returnType = signature.returnType;
845
+ if (node.arrowKind) {
846
+ if (body) {
847
+ if (node.arrowKind == 2) {
848
+ assert(isTypeOmitted(returnType));
849
+ } else {
850
+ if (isTypeOmitted(returnType)) {
851
+ sb.push(")");
852
+ } else {
853
+ sb.push("): ");
854
+ this.visitTypeNode(returnType);
855
+ }
856
+ }
857
+ sb.push(" => ");
858
+ this.visitNode(body);
859
+ } else {
860
+ assert(!isTypeOmitted(returnType));
861
+ sb.push(" => ");
862
+ this.visitTypeNode(returnType);
863
+ }
864
+ } else {
865
+ if (!isTypeOmitted(returnType) && !node.isAny(524288 | 4096)) {
866
+ sb.push("): ");
867
+ this.visitTypeNode(returnType);
868
+ } else {
869
+ 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]);
922
+ }
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
+ }
1274
+ }
1275
+ //# sourceMappingURL=builder.js.map