as-test 0.4.0 → 0.4.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 (49) hide show
  1. package/CHANGELOG.md +10 -1
  2. package/README.md +12 -12
  3. package/as-test.config.json +1 -1
  4. package/assembly/__tests__/array.spec.ts +3 -3
  5. package/assembly/src/expectation.ts +29 -16
  6. package/assembly/src/suite.ts +2 -0
  7. package/assembly/src/tests.ts +1 -0
  8. package/bin/build.js +65 -77
  9. package/bin/index.js +130 -160
  10. package/bin/init.js +96 -109
  11. package/bin/reporter.js +1 -1
  12. package/bin/run.js +210 -236
  13. package/bin/types.js +25 -25
  14. package/bin/util.js +35 -42
  15. package/cli/run.ts +13 -15
  16. package/cli/tsconfig.json +2 -1
  17. package/package.json +12 -9
  18. package/transform/lib/builder.js +1361 -0
  19. package/transform/lib/builder.js.map +1 -0
  20. package/transform/lib/coverage.js +6 -6
  21. package/transform/lib/coverage.js.map +1 -1
  22. package/transform/lib/index.js +1 -1
  23. package/transform/lib/index.js.map +1 -1
  24. package/transform/lib/linker.js +19 -0
  25. package/transform/lib/linker.js.map +1 -0
  26. package/transform/lib/mock.js +9 -9
  27. package/transform/lib/mock.js.map +1 -1
  28. package/transform/lib/range.js +13 -0
  29. package/transform/lib/range.js.map +1 -0
  30. package/transform/lib/types.js +26 -0
  31. package/transform/lib/types.js.map +1 -0
  32. package/transform/lib/util.js +47 -0
  33. package/transform/lib/util.js.map +1 -0
  34. package/transform/lib/visitor.js +532 -0
  35. package/transform/lib/visitor.js.map +1 -0
  36. package/transform/src/builder.ts +1474 -0
  37. package/transform/src/coverage.ts +6 -7
  38. package/transform/src/index.ts +1 -2
  39. package/transform/src/linker.ts +41 -0
  40. package/transform/src/mock.ts +9 -10
  41. package/transform/src/range.ts +12 -0
  42. package/transform/src/types.ts +35 -0
  43. package/transform/src/util.ts +81 -0
  44. package/transform/src/visitor.ts +744 -0
  45. package/.trunk/configs/.markdownlint.yaml +0 -2
  46. package/.trunk/configs/.yamllint.yaml +0 -7
  47. package/.trunk/trunk.yaml +0 -34
  48. package/bin/about.js +0 -135
  49. package/bin/package.json +0 -3
@@ -0,0 +1,1361 @@
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 &&
523
+ (last.charCodeAt(lastCharPos) == 125 ||
524
+ last.charCodeAt(lastCharPos) == 59)) {
525
+ sb.push("\n");
526
+ }
527
+ else {
528
+ sb.push(";\n");
529
+ }
530
+ }
531
+ }
532
+ visitBlockStatement(node) {
533
+ var sb = this.sb;
534
+ var statements = node.statements;
535
+ var numStatements = statements.length;
536
+ if (numStatements) {
537
+ sb.push("{\n");
538
+ let indentLevel = ++this.indentLevel;
539
+ for (let i = 0; i < numStatements; ++i) {
540
+ util.indent(sb, indentLevel);
541
+ this.visitNodeAndTerminate(statements[i]);
542
+ }
543
+ util.indent(sb, --this.indentLevel);
544
+ sb.push("}");
545
+ }
546
+ else {
547
+ sb.push("{}");
548
+ }
549
+ }
550
+ visitBreakStatement(node) {
551
+ var label = node.label;
552
+ if (label) {
553
+ this.sb.push("break ");
554
+ this.visitIdentifierExpression(label);
555
+ }
556
+ else {
557
+ this.sb.push("break");
558
+ }
559
+ }
560
+ visitContinueStatement(node) {
561
+ var label = node.label;
562
+ if (label) {
563
+ this.sb.push("continue ");
564
+ this.visitIdentifierExpression(label);
565
+ }
566
+ else {
567
+ this.sb.push("continue");
568
+ }
569
+ }
570
+ visitClassDeclaration(node, isDefault = false) {
571
+ var decorators = node.decorators;
572
+ if (decorators) {
573
+ for (let i = 0, k = decorators.length; i < k; ++i) {
574
+ this.serializeDecorator(decorators[i]);
575
+ }
576
+ }
577
+ var sb = this.sb;
578
+ if (isDefault) {
579
+ sb.push("export default ");
580
+ }
581
+ else {
582
+ this.serializeExternalModifiers(node);
583
+ }
584
+ if (node.is(128))
585
+ sb.push("abstract ");
586
+ if (node.name.text.length) {
587
+ sb.push("class ");
588
+ this.visitIdentifierExpression(node.name);
589
+ }
590
+ else {
591
+ sb.push("class");
592
+ }
593
+ var typeParameters = node.typeParameters;
594
+ if (typeParameters != null && typeParameters.length > 0) {
595
+ sb.push("<");
596
+ this.visitTypeParameter(typeParameters[0]);
597
+ for (let i = 1, k = typeParameters.length; i < k; ++i) {
598
+ sb.push(", ");
599
+ this.visitTypeParameter(typeParameters[i]);
600
+ }
601
+ sb.push(">");
602
+ }
603
+ var extendsType = node.extendsType;
604
+ if (extendsType) {
605
+ sb.push(" extends ");
606
+ this.visitTypeNode(extendsType);
607
+ }
608
+ var implementsTypes = node.implementsTypes;
609
+ if (implementsTypes) {
610
+ let numImplementsTypes = implementsTypes.length;
611
+ if (numImplementsTypes) {
612
+ sb.push(" implements ");
613
+ this.visitTypeNode(implementsTypes[0]);
614
+ for (let i = 1; i < numImplementsTypes; ++i) {
615
+ sb.push(", ");
616
+ this.visitTypeNode(implementsTypes[i]);
617
+ }
618
+ }
619
+ }
620
+ var indexSignature = node.indexSignature;
621
+ var members = node.members;
622
+ var numMembers = members.length;
623
+ if (indexSignature !== null || numMembers) {
624
+ sb.push(" {\n");
625
+ let indentLevel = ++this.indentLevel;
626
+ if (indexSignature) {
627
+ util.indent(sb, indentLevel);
628
+ this.visitNodeAndTerminate(indexSignature);
629
+ }
630
+ for (let i = 0, k = members.length; i < k; ++i) {
631
+ let member = members[i];
632
+ if (member.kind != 54 ||
633
+ member.parameterIndex < 0) {
634
+ util.indent(sb, indentLevel);
635
+ this.visitNodeAndTerminate(member);
636
+ }
637
+ }
638
+ util.indent(sb, --this.indentLevel);
639
+ sb.push("}");
640
+ }
641
+ else {
642
+ sb.push(" {}");
643
+ }
644
+ }
645
+ visitDoStatement(node) {
646
+ var sb = this.sb;
647
+ sb.push("do ");
648
+ this.visitNode(node.body);
649
+ if (node.body.kind == 30) {
650
+ sb.push(" while (");
651
+ }
652
+ else {
653
+ util.indent(sb, this.indentLevel);
654
+ sb.push("while (");
655
+ }
656
+ this.visitNode(node.condition);
657
+ sb.push(")");
658
+ }
659
+ visitEmptyStatement(node) {
660
+ }
661
+ visitEnumDeclaration(node, isDefault = false) {
662
+ var sb = this.sb;
663
+ if (isDefault) {
664
+ sb.push("export default ");
665
+ }
666
+ else {
667
+ this.serializeExternalModifiers(node);
668
+ }
669
+ if (node.is(8))
670
+ sb.push("const ");
671
+ sb.push("enum ");
672
+ this.visitIdentifierExpression(node.name);
673
+ var values = node.values;
674
+ var numValues = values.length;
675
+ if (numValues) {
676
+ sb.push(" {\n");
677
+ let indentLevel = ++this.indentLevel;
678
+ util.indent(sb, indentLevel);
679
+ this.visitEnumValueDeclaration(node.values[0]);
680
+ for (let i = 1; i < numValues; ++i) {
681
+ sb.push(",\n");
682
+ util.indent(sb, indentLevel);
683
+ this.visitEnumValueDeclaration(node.values[i]);
684
+ }
685
+ sb.push("\n");
686
+ util.indent(sb, --this.indentLevel);
687
+ sb.push("}");
688
+ }
689
+ else {
690
+ sb.push(" {}");
691
+ }
692
+ }
693
+ visitEnumValueDeclaration(node) {
694
+ this.visitIdentifierExpression(node.name);
695
+ var initializer = node.initializer;
696
+ if (initializer) {
697
+ this.sb.push(" = ");
698
+ this.visitNode(initializer);
699
+ }
700
+ }
701
+ visitExportImportStatement(node) {
702
+ var sb = this.sb;
703
+ sb.push("export import ");
704
+ this.visitIdentifierExpression(node.externalName);
705
+ sb.push(" = ");
706
+ this.visitIdentifierExpression(node.name);
707
+ }
708
+ visitExportMember(node) {
709
+ this.visitIdentifierExpression(node.localName);
710
+ if (node.exportedName.text != node.localName.text) {
711
+ this.sb.push(" as ");
712
+ this.visitIdentifierExpression(node.exportedName);
713
+ }
714
+ }
715
+ visitExportStatement(node) {
716
+ var sb = this.sb;
717
+ if (node.isDeclare) {
718
+ sb.push("declare ");
719
+ }
720
+ var members = node.members;
721
+ if (members == null) {
722
+ sb.push("export *");
723
+ }
724
+ else if (members.length > 0) {
725
+ let numMembers = members.length;
726
+ sb.push("export {\n");
727
+ let indentLevel = ++this.indentLevel;
728
+ util.indent(sb, indentLevel);
729
+ this.visitExportMember(members[0]);
730
+ for (let i = 1; i < numMembers; ++i) {
731
+ sb.push(",\n");
732
+ util.indent(sb, indentLevel);
733
+ this.visitExportMember(members[i]);
734
+ }
735
+ --this.indentLevel;
736
+ sb.push("\n}");
737
+ }
738
+ else {
739
+ sb.push("export {}");
740
+ }
741
+ var path = node.path;
742
+ if (path) {
743
+ sb.push(" from ");
744
+ this.visitStringLiteralExpression(path);
745
+ }
746
+ sb.push(";");
747
+ }
748
+ visitExportDefaultStatement(node) {
749
+ var declaration = node.declaration;
750
+ switch (declaration.kind) {
751
+ case 52: {
752
+ this.visitEnumDeclaration(declaration, true);
753
+ break;
754
+ }
755
+ case 55: {
756
+ this.visitFunctionDeclaration(declaration, true);
757
+ break;
758
+ }
759
+ case 51: {
760
+ this.visitClassDeclaration(declaration, true);
761
+ break;
762
+ }
763
+ case 57: {
764
+ this.visitInterfaceDeclaration(declaration, true);
765
+ break;
766
+ }
767
+ case 59: {
768
+ this.visitNamespaceDeclaration(declaration, true);
769
+ break;
770
+ }
771
+ default:
772
+ assert(false);
773
+ }
774
+ }
775
+ visitExpressionStatement(node) {
776
+ this.visitNode(node.expression);
777
+ }
778
+ visitFieldDeclaration(node) {
779
+ var decorators = node.decorators;
780
+ if (decorators) {
781
+ for (let i = 0, k = decorators.length; i < k; ++i) {
782
+ this.serializeDecorator(decorators[i]);
783
+ }
784
+ }
785
+ this.serializeAccessModifiers(node);
786
+ this.visitIdentifierExpression(node.name);
787
+ var sb = this.sb;
788
+ if (node.flags & 16384) {
789
+ sb.push("!");
790
+ }
791
+ var type = node.type;
792
+ if (type) {
793
+ sb.push(": ");
794
+ this.visitTypeNode(type);
795
+ }
796
+ var initializer = node.initializer;
797
+ if (initializer) {
798
+ sb.push(" = ");
799
+ this.visitNode(initializer);
800
+ }
801
+ }
802
+ visitForStatement(node) {
803
+ var sb = this.sb;
804
+ sb.push("for (");
805
+ var initializer = node.initializer;
806
+ if (initializer) {
807
+ this.visitNode(initializer);
808
+ }
809
+ var condition = node.condition;
810
+ if (condition) {
811
+ sb.push("; ");
812
+ this.visitNode(condition);
813
+ }
814
+ else {
815
+ sb.push(";");
816
+ }
817
+ var incrementor = node.incrementor;
818
+ if (incrementor) {
819
+ sb.push("; ");
820
+ this.visitNode(incrementor);
821
+ }
822
+ else {
823
+ sb.push(";");
824
+ }
825
+ sb.push(") ");
826
+ this.visitNode(node.body);
827
+ }
828
+ visitForOfStatement(node) {
829
+ var sb = this.sb;
830
+ sb.push("for (");
831
+ this.visitNode(node.variable);
832
+ sb.push(" of ");
833
+ this.visitNode(node.iterable);
834
+ sb.push(") ");
835
+ this.visitNode(node.body);
836
+ }
837
+ visitFunctionDeclaration(node, isDefault = false) {
838
+ var sb = this.sb;
839
+ var decorators = node.decorators;
840
+ if (decorators) {
841
+ for (let i = 0, k = decorators.length; i < k; ++i) {
842
+ this.serializeDecorator(decorators[i]);
843
+ }
844
+ }
845
+ if (isDefault) {
846
+ sb.push("export default ");
847
+ }
848
+ else {
849
+ this.serializeExternalModifiers(node);
850
+ this.serializeAccessModifiers(node);
851
+ }
852
+ if (node.name.text.length) {
853
+ sb.push("function ");
854
+ }
855
+ else {
856
+ sb.push("function");
857
+ }
858
+ this.visitFunctionCommon(node);
859
+ }
860
+ visitFunctionCommon(node) {
861
+ var sb = this.sb;
862
+ this.visitIdentifierExpression(node.name);
863
+ var signature = node.signature;
864
+ var typeParameters = node.typeParameters;
865
+ if (typeParameters) {
866
+ let numTypeParameters = typeParameters.length;
867
+ if (numTypeParameters) {
868
+ sb.push("<");
869
+ this.visitTypeParameter(typeParameters[0]);
870
+ for (let i = 1; i < numTypeParameters; ++i) {
871
+ sb.push(", ");
872
+ this.visitTypeParameter(typeParameters[i]);
873
+ }
874
+ sb.push(">");
875
+ }
876
+ }
877
+ if (node.arrowKind == 2) {
878
+ let parameters = signature.parameters;
879
+ assert(parameters.length == 1);
880
+ assert(!signature.explicitThisType);
881
+ this.serializeParameter(parameters[0]);
882
+ }
883
+ else {
884
+ sb.push("(");
885
+ let parameters = signature.parameters;
886
+ let numParameters = parameters.length;
887
+ let explicitThisType = signature.explicitThisType;
888
+ if (explicitThisType) {
889
+ sb.push("this: ");
890
+ this.visitTypeNode(explicitThisType);
891
+ }
892
+ if (numParameters) {
893
+ if (explicitThisType)
894
+ sb.push(", ");
895
+ this.serializeParameter(parameters[0]);
896
+ for (let i = 1; i < numParameters; ++i) {
897
+ sb.push(", ");
898
+ this.serializeParameter(parameters[i]);
899
+ }
900
+ }
901
+ }
902
+ var body = node.body;
903
+ var returnType = signature.returnType;
904
+ if (node.arrowKind) {
905
+ if (body) {
906
+ if (node.arrowKind == 2) {
907
+ assert(isTypeOmitted(returnType));
908
+ }
909
+ else {
910
+ if (isTypeOmitted(returnType)) {
911
+ sb.push(")");
912
+ }
913
+ else {
914
+ sb.push("): ");
915
+ this.visitTypeNode(returnType);
916
+ }
917
+ }
918
+ sb.push(" => ");
919
+ this.visitNode(body);
920
+ }
921
+ else {
922
+ assert(!isTypeOmitted(returnType));
923
+ sb.push(" => ");
924
+ this.visitTypeNode(returnType);
925
+ }
926
+ }
927
+ else {
928
+ if (!isTypeOmitted(returnType) &&
929
+ !node.isAny(524288 | 4096)) {
930
+ sb.push("): ");
931
+ this.visitTypeNode(returnType);
932
+ }
933
+ else {
934
+ sb.push(")");
935
+ }
936
+ if (body) {
937
+ sb.push(" ");
938
+ this.visitNode(body);
939
+ }
940
+ }
941
+ }
942
+ visitIfStatement(node) {
943
+ var sb = this.sb;
944
+ sb.push("if (");
945
+ this.visitNode(node.condition);
946
+ sb.push(") ");
947
+ var ifTrue = node.ifTrue;
948
+ this.visitNode(ifTrue);
949
+ if (ifTrue.kind != 30) {
950
+ sb.push(";\n");
951
+ }
952
+ var ifFalse = node.ifFalse;
953
+ if (ifFalse) {
954
+ if (ifTrue.kind == 30) {
955
+ sb.push(" else ");
956
+ }
957
+ else {
958
+ sb.push("else ");
959
+ }
960
+ this.visitNode(ifFalse);
961
+ }
962
+ }
963
+ visitImportDeclaration(node) {
964
+ var externalName = node.foreignName;
965
+ var name = node.name;
966
+ this.visitIdentifierExpression(externalName);
967
+ if (externalName.text != name.text) {
968
+ this.sb.push(" as ");
969
+ this.visitIdentifierExpression(name);
970
+ }
971
+ }
972
+ visitImportStatement(node) {
973
+ var sb = this.sb;
974
+ sb.push("import ");
975
+ var declarations = node.declarations;
976
+ var namespaceName = node.namespaceName;
977
+ if (declarations) {
978
+ let numDeclarations = declarations.length;
979
+ if (numDeclarations) {
980
+ sb.push("{\n");
981
+ let indentLevel = ++this.indentLevel;
982
+ util.indent(sb, indentLevel);
983
+ this.visitImportDeclaration(declarations[0]);
984
+ for (let i = 1; i < numDeclarations; ++i) {
985
+ sb.push(",\n");
986
+ util.indent(sb, indentLevel);
987
+ this.visitImportDeclaration(declarations[i]);
988
+ }
989
+ --this.indentLevel;
990
+ sb.push("\n} from ");
991
+ }
992
+ else {
993
+ sb.push("{} from ");
994
+ }
995
+ }
996
+ else if (namespaceName) {
997
+ sb.push("* as ");
998
+ this.visitIdentifierExpression(namespaceName);
999
+ sb.push(" from ");
1000
+ }
1001
+ this.visitStringLiteralExpression(node.path);
1002
+ }
1003
+ visitIndexSignature(node) {
1004
+ var sb = this.sb;
1005
+ sb.push("[key: ");
1006
+ this.visitTypeNode(node.keyType);
1007
+ sb.push("]: ");
1008
+ this.visitTypeNode(node.valueType);
1009
+ }
1010
+ visitInterfaceDeclaration(node, isDefault = false) {
1011
+ var decorators = node.decorators;
1012
+ if (decorators) {
1013
+ for (let i = 0, k = decorators.length; i < k; ++i) {
1014
+ this.serializeDecorator(decorators[i]);
1015
+ }
1016
+ }
1017
+ var sb = this.sb;
1018
+ if (isDefault) {
1019
+ sb.push("export default ");
1020
+ }
1021
+ else {
1022
+ this.serializeExternalModifiers(node);
1023
+ }
1024
+ sb.push("interface ");
1025
+ this.visitIdentifierExpression(node.name);
1026
+ var typeParameters = node.typeParameters;
1027
+ if (typeParameters != null && typeParameters.length > 0) {
1028
+ sb.push("<");
1029
+ this.visitTypeParameter(typeParameters[0]);
1030
+ for (let i = 1, k = typeParameters.length; i < k; ++i) {
1031
+ sb.push(", ");
1032
+ this.visitTypeParameter(typeParameters[i]);
1033
+ }
1034
+ sb.push(">");
1035
+ }
1036
+ var extendsType = node.extendsType;
1037
+ if (extendsType) {
1038
+ sb.push(" extends ");
1039
+ this.visitTypeNode(extendsType);
1040
+ }
1041
+ sb.push(" {\n");
1042
+ var indentLevel = ++this.indentLevel;
1043
+ var members = node.members;
1044
+ for (let i = 0, k = members.length; i < k; ++i) {
1045
+ util.indent(sb, indentLevel);
1046
+ this.visitNodeAndTerminate(members[i]);
1047
+ }
1048
+ --this.indentLevel;
1049
+ sb.push("}");
1050
+ }
1051
+ visitMethodDeclaration(node) {
1052
+ var decorators = node.decorators;
1053
+ if (decorators) {
1054
+ for (let i = 0, k = decorators.length; i < k; ++i) {
1055
+ this.serializeDecorator(decorators[i]);
1056
+ }
1057
+ }
1058
+ this.serializeAccessModifiers(node);
1059
+ if (node.is(2048)) {
1060
+ this.sb.push("get ");
1061
+ }
1062
+ else if (node.is(4096)) {
1063
+ this.sb.push("set ");
1064
+ }
1065
+ this.visitFunctionCommon(node);
1066
+ }
1067
+ visitNamespaceDeclaration(node, isDefault = false) {
1068
+ var decorators = node.decorators;
1069
+ if (decorators) {
1070
+ for (let i = 0, k = decorators.length; i < k; ++i) {
1071
+ this.serializeDecorator(decorators[i]);
1072
+ }
1073
+ }
1074
+ var sb = this.sb;
1075
+ if (isDefault) {
1076
+ sb.push("export default ");
1077
+ }
1078
+ else {
1079
+ this.serializeExternalModifiers(node);
1080
+ }
1081
+ sb.push("namespace ");
1082
+ this.visitIdentifierExpression(node.name);
1083
+ var members = node.members;
1084
+ var numMembers = members.length;
1085
+ if (numMembers) {
1086
+ sb.push(" {\n");
1087
+ let indentLevel = ++this.indentLevel;
1088
+ for (let i = 0, k = members.length; i < k; ++i) {
1089
+ util.indent(sb, indentLevel);
1090
+ this.visitNodeAndTerminate(members[i]);
1091
+ }
1092
+ util.indent(sb, --this.indentLevel);
1093
+ sb.push("}");
1094
+ }
1095
+ else {
1096
+ sb.push(" {}");
1097
+ }
1098
+ }
1099
+ visitReturnStatement(node) {
1100
+ var value = node.value;
1101
+ if (value) {
1102
+ this.sb.push("return ");
1103
+ this.visitNode(value);
1104
+ }
1105
+ else {
1106
+ this.sb.push("return");
1107
+ }
1108
+ }
1109
+ visitTrueExpression(node) {
1110
+ this.sb.push("true");
1111
+ }
1112
+ visitFalseExpression(node) {
1113
+ this.sb.push("false");
1114
+ }
1115
+ visitNullExpression(node) {
1116
+ this.sb.push("null");
1117
+ }
1118
+ visitSwitchCase(node) {
1119
+ var sb = this.sb;
1120
+ var label = node.label;
1121
+ if (label) {
1122
+ sb.push("case ");
1123
+ this.visitNode(label);
1124
+ sb.push(":\n");
1125
+ }
1126
+ else {
1127
+ sb.push("default:\n");
1128
+ }
1129
+ var statements = node.statements;
1130
+ var numStatements = statements.length;
1131
+ if (numStatements) {
1132
+ let indentLevel = ++this.indentLevel;
1133
+ util.indent(sb, indentLevel);
1134
+ this.visitNodeAndTerminate(statements[0]);
1135
+ for (let i = 1; i < numStatements; ++i) {
1136
+ util.indent(sb, indentLevel);
1137
+ this.visitNodeAndTerminate(statements[i]);
1138
+ }
1139
+ --this.indentLevel;
1140
+ }
1141
+ }
1142
+ visitSwitchStatement(node) {
1143
+ var sb = this.sb;
1144
+ sb.push("switch (");
1145
+ this.visitNode(node.condition);
1146
+ sb.push(") {\n");
1147
+ var indentLevel = ++this.indentLevel;
1148
+ var cases = node.cases;
1149
+ for (let i = 0, k = cases.length; i < k; ++i) {
1150
+ util.indent(sb, indentLevel);
1151
+ this.visitSwitchCase(cases[i]);
1152
+ sb.push("\n");
1153
+ }
1154
+ --this.indentLevel;
1155
+ sb.push("}");
1156
+ }
1157
+ visitThrowStatement(node) {
1158
+ this.sb.push("throw ");
1159
+ this.visitNode(node.value);
1160
+ }
1161
+ visitTryStatement(node) {
1162
+ var sb = this.sb;
1163
+ sb.push("try {\n");
1164
+ var indentLevel = ++this.indentLevel;
1165
+ var statements = node.bodyStatements;
1166
+ for (let i = 0, k = statements.length; i < k; ++i) {
1167
+ util.indent(sb, indentLevel);
1168
+ this.visitNodeAndTerminate(statements[i]);
1169
+ }
1170
+ var catchVariable = node.catchVariable;
1171
+ if (catchVariable) {
1172
+ util.indent(sb, indentLevel - 1);
1173
+ sb.push("} catch (");
1174
+ this.visitIdentifierExpression(catchVariable);
1175
+ sb.push(") {\n");
1176
+ let catchStatements = node.catchStatements;
1177
+ if (catchStatements) {
1178
+ for (let i = 0, k = catchStatements.length; i < k; ++i) {
1179
+ util.indent(sb, indentLevel);
1180
+ this.visitNodeAndTerminate(catchStatements[i]);
1181
+ }
1182
+ }
1183
+ }
1184
+ var finallyStatements = node.finallyStatements;
1185
+ if (finallyStatements) {
1186
+ util.indent(sb, indentLevel - 1);
1187
+ sb.push("} finally {\n");
1188
+ for (let i = 0, k = finallyStatements.length; i < k; ++i) {
1189
+ util.indent(sb, indentLevel);
1190
+ this.visitNodeAndTerminate(finallyStatements[i]);
1191
+ }
1192
+ }
1193
+ util.indent(sb, indentLevel - 1);
1194
+ sb.push("}");
1195
+ }
1196
+ visitTypeDeclaration(node) {
1197
+ var decorators = node.decorators;
1198
+ if (decorators) {
1199
+ for (let i = 0, k = decorators.length; i < k; ++i) {
1200
+ this.serializeDecorator(decorators[i]);
1201
+ }
1202
+ }
1203
+ var sb = this.sb;
1204
+ this.serializeExternalModifiers(node);
1205
+ sb.push("type ");
1206
+ this.visitIdentifierExpression(node.name);
1207
+ var typeParameters = node.typeParameters;
1208
+ if (typeParameters) {
1209
+ let numTypeParameters = typeParameters.length;
1210
+ if (numTypeParameters) {
1211
+ sb.push("<");
1212
+ for (let i = 0; i < numTypeParameters; ++i) {
1213
+ this.visitTypeParameter(typeParameters[i]);
1214
+ }
1215
+ sb.push(">");
1216
+ }
1217
+ }
1218
+ sb.push(" = ");
1219
+ this.visitTypeNode(node.type);
1220
+ }
1221
+ visitVariableDeclaration(node) {
1222
+ this.visitIdentifierExpression(node.name);
1223
+ var type = node.type;
1224
+ var sb = this.sb;
1225
+ if (node.flags & 16384) {
1226
+ sb.push("!");
1227
+ }
1228
+ if (type) {
1229
+ sb.push(": ");
1230
+ this.visitTypeNode(type);
1231
+ }
1232
+ var initializer = node.initializer;
1233
+ if (initializer) {
1234
+ sb.push(" = ");
1235
+ this.visitNode(initializer);
1236
+ }
1237
+ }
1238
+ visitVariableStatement(node) {
1239
+ var decorators = node.decorators;
1240
+ if (decorators) {
1241
+ for (let i = 0, k = decorators.length; i < k; ++i) {
1242
+ this.serializeDecorator(decorators[i]);
1243
+ }
1244
+ }
1245
+ var sb = this.sb;
1246
+ var declarations = node.declarations;
1247
+ var numDeclarations = declarations.length;
1248
+ var firstDeclaration = declarations[0];
1249
+ this.serializeExternalModifiers(firstDeclaration);
1250
+ sb.push(firstDeclaration.is(8)
1251
+ ? "const "
1252
+ : firstDeclaration.is(16)
1253
+ ? "let "
1254
+ : "var ");
1255
+ this.visitVariableDeclaration(node.declarations[0]);
1256
+ for (let i = 1; i < numDeclarations; ++i) {
1257
+ sb.push(", ");
1258
+ this.visitVariableDeclaration(node.declarations[i]);
1259
+ }
1260
+ }
1261
+ visitWhileStatement(node) {
1262
+ var sb = this.sb;
1263
+ sb.push("while (");
1264
+ this.visitNode(node.condition);
1265
+ var statement = node.body;
1266
+ if (statement.kind == 34) {
1267
+ sb.push(")");
1268
+ }
1269
+ else {
1270
+ sb.push(") ");
1271
+ this.visitNode(node.body);
1272
+ }
1273
+ }
1274
+ serializeDecorator(node) {
1275
+ var sb = this.sb;
1276
+ sb.push("@");
1277
+ this.visitNode(node.name);
1278
+ var args = node.args;
1279
+ if (args) {
1280
+ sb.push("(");
1281
+ let numArgs = args.length;
1282
+ if (numArgs) {
1283
+ this.visitNode(args[0]);
1284
+ for (let i = 1; i < numArgs; ++i) {
1285
+ sb.push(", ");
1286
+ this.visitNode(args[i]);
1287
+ }
1288
+ }
1289
+ sb.push(")\n");
1290
+ }
1291
+ else {
1292
+ sb.push("\n");
1293
+ }
1294
+ util.indent(sb, this.indentLevel);
1295
+ }
1296
+ serializeParameter(node) {
1297
+ var sb = this.sb;
1298
+ var kind = node.parameterKind;
1299
+ var implicitFieldDeclaration = node.implicitFieldDeclaration;
1300
+ if (implicitFieldDeclaration) {
1301
+ this.serializeAccessModifiers(implicitFieldDeclaration);
1302
+ }
1303
+ if (kind == 2) {
1304
+ sb.push("...");
1305
+ }
1306
+ this.visitIdentifierExpression(node.name);
1307
+ var type = node.type;
1308
+ var initializer = node.initializer;
1309
+ if (type) {
1310
+ if (kind == 1 && !initializer)
1311
+ sb.push("?");
1312
+ if (!isTypeOmitted(type)) {
1313
+ sb.push(": ");
1314
+ this.visitTypeNode(type);
1315
+ }
1316
+ }
1317
+ if (initializer) {
1318
+ sb.push(" = ");
1319
+ this.visitNode(initializer);
1320
+ }
1321
+ }
1322
+ serializeExternalModifiers(node) {
1323
+ var sb = this.sb;
1324
+ if (node.is(2)) {
1325
+ sb.push("export ");
1326
+ }
1327
+ else if (node.is(1)) {
1328
+ sb.push("import ");
1329
+ }
1330
+ else if (node.is(4)) {
1331
+ sb.push("declare ");
1332
+ }
1333
+ }
1334
+ serializeAccessModifiers(node) {
1335
+ var sb = this.sb;
1336
+ if (node.is(256)) {
1337
+ sb.push("public ");
1338
+ }
1339
+ else if (node.is(512)) {
1340
+ sb.push("private ");
1341
+ }
1342
+ else if (node.is(1024)) {
1343
+ sb.push("protected ");
1344
+ }
1345
+ if (node.is(32)) {
1346
+ sb.push("static ");
1347
+ }
1348
+ else if (node.is(128)) {
1349
+ sb.push("abstract ");
1350
+ }
1351
+ if (node.is(64)) {
1352
+ sb.push("readonly ");
1353
+ }
1354
+ }
1355
+ finish() {
1356
+ var ret = this.sb.join("");
1357
+ this.sb = [];
1358
+ return ret;
1359
+ }
1360
+ }
1361
+ //# sourceMappingURL=builder.js.map