javascript - format_print_test.go
1 package javascript
2
3 import (
4 "bytes"
5 "testing"
6
7 "vimagination.zapto.org/parser"
8 )
9
10 type state struct {
11 bytes.Buffer
12 Verbose bool
13 }
14
15 func (state) Width() (int, bool) { return 0, false }
16 func (state) Precision() (int, bool) { return 0, false }
17 func (s *state) Flag(c int) bool { return c == '+' == s.Verbose }
18
19 func TestPrintingScript(t *testing.T) {
20 var st state
21 for n, test := range [...]struct {
22 Input, SimpleOutput, VerboseOutput string
23 }{
24 { // 1
25 "1;",
26 "1;",
27 "1;",
28 },
29 { // 2
30 "1",
31 "1;",
32 "1;",
33 },
34 { // 3
35 "1;2;",
36 "1;\n\n2;",
37 "1;\n\n2;",
38 },
39 { // 4
40 "1\n2;",
41 "1;\n\n2;",
42 "1;\n\n2;",
43 },
44 { // 5
45 "continue",
46 "continue;",
47 "continue;",
48 },
49 { // 6
50 "break",
51 "break;",
52 "break;",
53 },
54 { // 7
55 "break a",
56 "break a;",
57 "break a;",
58 },
59 { // 8
60 "() => {return}",
61 "() => {\n return;\n};",
62 "() => { return; };",
63 },
64 { // 9
65 "() => {return a}",
66 "() => {\n return a;\n};",
67 "() => { return a; };",
68 },
69 { // 10
70 "throw a",
71 "throw a;",
72 "throw a;",
73 },
74 { // 11
75 "{\n1\n}",
76 "{\n 1;\n}",
77 "{\n 1;\n}",
78 },
79 { // 12
80 "{\n1\n2\n}",
81 "{\n 1;\n 2;\n}",
82 "{\n 1;\n 2;\n}",
83 },
84 { // 13
85 "{1;}",
86 "{\n 1;\n}",
87 "{ 1; }",
88 },
89 { // 14
90 "{1;2;}",
91 "{\n 1;\n 2;\n}",
92 "{ 1; 2; }",
93 },
94 { // 15
95 "var\na;",
96 "var a;",
97 "var a;",
98 },
99 { // 16
100 "var\na\n=\n1;",
101 "var a = 1;",
102 "var a = 1;",
103 },
104 { // 17
105 "var\na\n=\n1\n,\nb\n=\n2",
106 "var a = 1, b = 2;",
107 "var a = 1,\nb = 2;",
108 },
109 { // 18
110 "var a=1,b=2",
111 "var a = 1, b = 2;",
112 "var a = 1, b = 2;",
113 },
114 { // 19
115 "a,b,c,d",
116 "a, b, c, d;",
117 "a, b, c, d;",
118 },
119 { // 20
120 "a\n,\nb\n,\nc\n,\nd",
121 "a, b, c, d;",
122 "a,\nb,\nc,\nd;",
123 },
124 { // 21
125 "if(a){}",
126 "if (a) {}",
127 "if (a) {}",
128 },
129 { // 22
130 "if\n(\na\n)\n{\n}",
131 "if (a) {}",
132 "if (\n a\n) {}",
133 },
134 { // 23
135 "if(a)b; else c",
136 "if (a) b; else c;",
137 "if (a) b; else c;",
138 },
139 { // 24
140 "if\n(\na\n)\nb\nelse\nc",
141 "if (a) b; else c;",
142 "if (\n a\n) b; else c;",
143 },
144 { // 25
145 "if(a){b}else{c}",
146 "if (a) {\n b;\n} else {\n c;\n}",
147 "if (a) { b; } else { c; }",
148 },
149 { // 26
150 "if\n(\na\n)\n{\nb\n}\nelse\n{\nc\n}",
151 "if (a) {\n b;\n} else {\n c;\n}",
152 "if (\n a\n) {\n b;\n} else {\n c;\n}",
153 },
154 { // 27
155 "do\n a\nwhile(1)",
156 "do a; while (1);",
157 "do a; while (1);",
158 },
159 { // 28
160 "do{}while(1)",
161 "do {} while (1);",
162 "do {} while (1);",
163 },
164 { // 29
165 "do\na\nwhile\n(\n1\n)",
166 "do a; while (1);",
167 "do a; while (\n\t1\n);",
168 },
169 { // 30
170 "do\n{\n}\nwhile\n(\n1\n)",
171 "do {} while (1);",
172 "do {} while (\n\t1\n);",
173 },
174 { // 31
175 "while(a)b",
176 "while (a) b;",
177 "while (a) b;",
178 },
179 { // 32
180 "while\n(\na\n)\nb\n;",
181 "while (a) b;",
182 "while (\n a\n) b;",
183 },
184 { // 33
185 "for\n(\n;\n;\n)\na",
186 "for (;;) a;",
187 "for (;;) a;",
188 },
189 { // 34
190 "for\n(a;;) b",
191 "for (a;;) b;",
192 "for (\n\ta;;\n) b;",
193 },
194 { // 35
195 "for(var a=b;c<d;e++){}",
196 "for (var a = b; c < d; e++) {}",
197 "for (var a = b; c < d; e++) {}",
198 },
199 { // 36
200 "for(\nvar a=b;\nc<d;\ne++){}",
201 "for (var a = b; c < d; e++) {}",
202 "for (\n var a = b;\n c < d;\n e++\n) {}",
203 },
204 { // 37
205 "for(let a=b;c<d;e++){}",
206 "for (let a = b; c < d; e++) {}",
207 "for (let a = b; c < d; e++) {}",
208 },
209 { // 38
210 "for(\nlet a=b;\nc<d;\ne++){}",
211 "for (let a = b; c < d; e++) {}",
212 "for (\n let a = b;\n c < d;\n e++\n) {}",
213 },
214 { // 39
215 "for(const a=b;c<d;e++){}",
216 "for (const a = b; c < d; e++) {}",
217 "for (const a = b; c < d; e++) {}",
218 },
219 { // 40
220 "for(\nconst a=b;\nc<d;\ne++){}",
221 "for (const a = b; c < d; e++) {}",
222 "for (\n const a = b;\n c < d;\n e++\n) {}",
223 },
224 { // 41
225 "for(a in b){}",
226 "for (a in b) {}",
227 "for (a in b) {}",
228 },
229 { // 42
230 "for\n(a\nin\nb\n)\n{}",
231 "for (a in b) {}",
232 "for (\n a in b\n) {}",
233 },
234 { // 43
235 "for(var a in b){}",
236 "for (var a in b) {}",
237 "for (var a in b) {}",
238 },
239 { // 44
240 "for\n(var\na\nin\nb\n)\n{}",
241 "for (var a in b) {}",
242 "for (var a in b) {}",
243 },
244 { // 45
245 "for(let a in b){}",
246 "for (let a in b) {}",
247 "for (let a in b) {}",
248 },
249 { // 46
250 "for\n(let\na\nin\nb\n)\n{}",
251 "for (let a in b) {}",
252 "for (let a in b) {}",
253 },
254 { // 47
255 "for(const a in b){}",
256 "for (const a in b) {}",
257 "for (const a in b) {}",
258 },
259 { // 48
260 "for\n(const\na\nin\nb\n)\n{}",
261 "for (const a in b) {}",
262 "for (const a in b) {}",
263 },
264 { // 49
265 "for(a of b){}",
266 "for (a of b) {}",
267 "for (a of b) {}",
268 },
269 { // 50
270 "for\n(a\nof\nb\n)\n{}",
271 "for (a of b) {}",
272 "for (\n a of b\n) {}",
273 },
274 { // 51
275 "for(var a of b){}",
276 "for (var a of b) {}",
277 "for (var a of b) {}",
278 },
279 { // 52
280 "for\n(var\na\nof\nb\n)\n{}",
281 "for (var a of b) {}",
282 "for (var a of b) {}",
283 },
284 { // 53
285 "for(let a of b){}",
286 "for (let a of b) {}",
287 "for (let a of b) {}",
288 },
289 { // 54
290 "for\n(let\na\nof\nb\n)\n{}",
291 "for (let a of b) {}",
292 "for (let a of b) {}",
293 },
294 { // 55
295 "for(const a of b){}",
296 "for (const a of b) {}",
297 "for (const a of b) {}",
298 },
299 { // 56
300 "for\n(const\na\nof\nb\n)\n{}",
301 "for (const a of b) {}",
302 "for (const a of b) {}",
303 },
304 { // 57
305 "async () => {\nfor await(a of b) {}\n}",
306 "async () => {\n for await (a of b) {}\n};",
307 "async () => {\n for await (a of b) {}\n};",
308 },
309 { // 58
310 "async () => {\nfor\nawait(a\nof\nb)\n{}\n}",
311 "async () => {\n for await (a of b) {}\n};",
312 "async () => {\n for await (\n a of b\n ) {}\n};",
313 },
314 { // 59
315 "switch(a) {}",
316 "switch (a) {}",
317 "switch (a) {}",
318 },
319 { // 60
320 "switch\n(\na\n)\n{\n}",
321 "switch (a) {}",
322 "switch (\n a\n) {}",
323 },
324 { // 61
325 "switch(a){case b:case c:default:case d:case e:}",
326 "switch (a) {\ncase b:\ncase c:\ndefault:\ncase d:\ncase e:\n}",
327 "switch (a) {\ncase b:\ncase c:\ndefault:\ncase d:\ncase e:\n}",
328 },
329 { // 62
330 "switch\n\n(\n\na\n\n)\n\n{\n\ncase\n\nb\n\n:\n\ncase\n\nc\n\n:\n\ndefault\n\n:\n\ncase\n\nd\n\n:\n\ncase\n\ne\n\n:\n\n}",
331 "switch (a) {\ncase b:\ncase c:\ndefault:\ncase d:\ncase e:\n}",
332 "switch (\n a\n) {\ncase b:\ncase c:\ndefault:\ncase d:\ncase e:\n}",
333 },
334 { // 63
335 "with(a)b",
336 "with (a) b;",
337 "with (a) b;",
338 },
339 { // 64
340 "with\n(\na\n)\nb",
341 "with (a) b;",
342 "with (\n a\n) b;",
343 },
344 { // 65
345 "function a(){}",
346 "function a() {}",
347 "function a() {}",
348 },
349 { // 66
350 "function a(b){}",
351 "function a(b) {}",
352 "function a(b) {}",
353 },
354 { // 67
355 "function a(b,c){}",
356 "function a(b, c) {}",
357 "function a(b, c) {}",
358 },
359 { // 68
360 "function\na(\nb\n,\nc\n){}",
361 "function a(b, c) {}",
362 "function a(b, c) {}",
363 },
364 { // 69
365 "function*a(){}",
366 "function* a() {}",
367 "function* a() {}",
368 },
369 { // 70
370 "function* a(b){}",
371 "function* a(b) {}",
372 "function* a(b) {}",
373 },
374 { // 71
375 "function *a(b,c){}",
376 "function* a(b, c) {}",
377 "function* a(b, c) {}",
378 },
379 { // 72
380 "function\n*a(\nb\n,\nc\n){}",
381 "function* a(b, c) {}",
382 "function* a(b, c) {}",
383 },
384 { // 73
385 "async function a(){}",
386 "async function a() {}",
387 "async function a() {}",
388 },
389 { // 74
390 "async function a(b){}",
391 "async function a(b) {}",
392 "async function a(b) {}",
393 },
394 { // 75
395 "async function a(b,c){}",
396 "async function a(b, c) {}",
397 "async function a(b, c) {}",
398 },
399 { // 76
400 "async function\na(\nb\n,\nc\n){}",
401 "async function a(b, c) {}",
402 "async function a(b, c) {}",
403 },
404 { // 77
405 "async function*a(){}",
406 "async function* a() {}",
407 "async function* a() {}",
408 },
409 { // 78
410 "async function* a(b){}",
411 "async function* a(b) {}",
412 "async function* a(b) {}",
413 },
414 { // 79
415 "async function *a(b,c){}",
416 "async function* a(b, c) {}",
417 "async function* a(b, c) {}",
418 },
419 { // 80
420 "async function\n*a(\nb\n,\nc\n){}",
421 "async function* a(b, c) {}",
422 "async function* a(b, c) {}",
423 },
424 { // 81
425 "a = function(){}",
426 "a = function () {};",
427 "a = function () {};",
428 },
429 { // 82
430 "a=function(b){}",
431 "a = function (b) {};",
432 "a = function (b) {};",
433 },
434 { // 83
435 "a=function *(b,c){}",
436 "a = function* (b, c) {};",
437 "a = function* (b, c) {};",
438 },
439 { // 84
440 "a=function\n(\nb\n,\nc\n){}",
441 "a = function (b, c) {};",
442 "a = function (b, c) {};",
443 },
444 { // 85
445 "try{}catch{}",
446 "try {} catch {}",
447 "try {} catch {}",
448 },
449 { // 86
450 "try\n{\n}\ncatch\n{\n}",
451 "try {} catch {}",
452 "try {} catch {}",
453 },
454 { // 87
455 "try{}catch(a){}",
456 "try {} catch (a) {}",
457 "try {} catch (a) {}",
458 },
459 { // 88
460 "try\n{\n}\ncatch\n(\na\n)\n{\n}",
461 "try {} catch (a) {}",
462 "try {} catch (a) {}",
463 },
464 { // 89
465 "try{}catch({}){}",
466 "try {} catch ({}) {}",
467 "try {} catch ({}) {}",
468 },
469 { // 90
470 "try{}catch([]){}",
471 "try {} catch ([]) {}",
472 "try {} catch ([]) {}",
473 },
474 { // 91
475 "try{}finally{}",
476 "try {} finally {}",
477 "try {} finally {}",
478 },
479 { // 92
480 "try\n{\n}\nfinally\n{\n}",
481 "try {} finally {}",
482 "try {} finally {}",
483 },
484 { // 93
485 "try{}catch{}finally{}",
486 "try {} catch {} finally {}",
487 "try {} catch {} finally {}",
488 },
489 { // 94
490 "try\n{\n}\ncatch\n{\n}\nfinally\n{\n}",
491 "try {} catch {} finally {}",
492 "try {} catch {} finally {}",
493 },
494 { // 95
495 "try{}catch(a){}finally{}",
496 "try {} catch (a) {} finally {}",
497 "try {} catch (a) {} finally {}",
498 },
499 { // 96
500 "try\n{\n}\ncatch\n(\na\n)\n{\n}\nfinally\n{\n}",
501 "try {} catch (a) {} finally {}",
502 "try {} catch (a) {} finally {}",
503 },
504 { // 97
505 "class a{}",
506 "class a {}",
507 "class a {}",
508 },
509 { // 98
510 "class\na\n{\n}\n",
511 "class a {}",
512 "class a {}",
513 },
514 { // 99
515 "class a extends b {}",
516 "class a extends b {}",
517 "class a extends b {}",
518 },
519 { // 100
520 "class\na\nextends\nb\n{\n}",
521 "class a extends b {}",
522 "class a extends b {}",
523 },
524 { // 101
525 "a = class{}",
526 "a = class {};",
527 "a = class {};",
528 },
529 { // 102
530 "a\n=\nclass\nb\n{\n}",
531 "a = class b {};",
532 "a = class b {};",
533 },
534 { // 103
535 "a\n=\nclass\nextends\nb\n{\n}",
536 "a = class extends b {};",
537 "a = class extends b {};",
538 },
539 { // 104
540 "let a = 1",
541 "let a = 1;",
542 "let a = 1;",
543 },
544 { // 105
545 "let\na\n=\n1\n",
546 "let a = 1;",
547 "let a = 1;",
548 },
549 { // 106
550 "let a=1,b=2,c=3",
551 "let a = 1, b = 2, c = 3;",
552 "let a = 1,\nb = 2,\nc = 3;",
553 },
554 { // 107
555 "const a = 1",
556 "const a = 1;",
557 "const a = 1;",
558 },
559 { // 108
560 "const\na\n=\n1\n",
561 "const a = 1;",
562 "const a = 1;",
563 },
564 { // 109
565 "const a=1,b=2,c=3",
566 "const a = 1, b = 2, c = 3;",
567 "const a = 1,\nb = 2,\nc = 3;",
568 },
569 { // 110
570 "let a",
571 "let a;",
572 "let a;",
573 },
574 { // 111
575 "let\na\n,\nb\n=\n1\n,\nc\n",
576 "let a, b = 1, c;",
577 "let a,\nb = 1,\nc;",
578 },
579 { // 112
580 "const a",
581 "const a;",
582 "const a;",
583 },
584 { // 113
585 "const\na\n,\nb\n=\n1\n,\nc\n",
586 "const a, b = 1, c;",
587 "const a,\nb = 1,\nc;",
588 },
589 { // 114
590 "let [a]=1",
591 "let [a] = 1;",
592 "let [a] = 1;",
593 },
594 { // 115
595 "const\n[\na\n]\n=\n1",
596 "const [a] = 1;",
597 "const [a] = 1;",
598 },
599 { // 116
600 "let {a}=1",
601 "let {a} = 1;",
602 "let {a: a} = 1;",
603 },
604 { // 117
605 "const\n{\na\n}\n=\n1",
606 "const {a} = 1;",
607 "const {a: a} = 1;",
608 },
609 { // 118
610 "function* a() {yield a}",
611 "function* a() {\n yield a;\n}",
612 "function* a() { yield a; }",
613 },
614 { // 119
615 "() => {}",
616 "() => {};",
617 "() => {};",
618 },
619 { // 120
620 "a=b",
621 "a = b;",
622 "a = b;",
623 },
624 { // 121
625 "a/=b",
626 "a /= b;",
627 "a /= b;",
628 },
629 { // 122
630 "a%=b",
631 "a %= b;",
632 "a %= b;",
633 },
634 { // 123
635 "a+=b",
636 "a += b;",
637 "a += b;",
638 },
639 { // 124
640 "a-=b",
641 "a -= b;",
642 "a -= b;",
643 },
644 { // 125
645 "a<<=b",
646 "a <<= b;",
647 "a <<= b;",
648 },
649 { // 126
650 "a>>=b",
651 "a >>= b;",
652 "a >>= b;",
653 },
654 { // 127
655 "a>>>=b",
656 "a >>>= b;",
657 "a >>>= b;",
658 },
659 { // 128
660 "a&=b",
661 "a &= b;",
662 "a &= b;",
663 },
664 { // 129
665 "a^=b",
666 "a ^= b;",
667 "a ^= b;",
668 },
669 { // 130
670 "a|=b",
671 "a |= b;",
672 "a |= b;",
673 },
674 { // 131
675 "a**=b",
676 "a **= b;",
677 "a **= b;",
678 },
679 { // 132
680 "a?b:c",
681 "a ? b : c;",
682 "a ? b : c;",
683 },
684 { // 133
685 "new a",
686 "new a;",
687 "new a;",
688 },
689 { // 134
690 "a()",
691 "a();",
692 "a();",
693 },
694 { // 135
695 "var {a} = 1",
696 "var {a} = 1;",
697 "var {a: a} = 1;",
698 },
699 { // 136
700 "var { a , b, ...c } = 1",
701 "var {a, b, ...c} = 1;",
702 "var {a: a, b: b, ...c} = 1;",
703 },
704 { // 137
705 "var [a] = 1",
706 "var [a] = 1;",
707 "var [a] = 1;",
708 },
709 { // 138
710 "var [ a , b, ...c ] = 1",
711 "var [a, b, ...c] = 1;",
712 "var [a, b, ...c] = 1;",
713 },
714 { // 139
715 "switch (a) {case 1:}",
716 "switch (a) {\ncase 1:\n}",
717 "switch (a) {\ncase 1:\n}",
718 },
719 { // 140
720 "switch (a) {case 1:b;c;d}",
721 "switch (a) {\ncase 1:\n b;\n c;\n d;\n}",
722 "switch (a) {\ncase 1:\n b;\n c;\n d;\n}",
723 },
724 { // 141
725 "function a(b){}",
726 "function a(b) {}",
727 "function a(b) {}",
728 },
729 { // 142
730 "function\na(\nb\n)\n{\n}\n",
731 "function a(b) {}",
732 "function a(b) {}",
733 },
734 { // 143
735 "function a(b,c,...d){}",
736 "function a(b, c, ...d) {}",
737 "function a(b, c, ...d) {}",
738 },
739 { // 144
740 "class\na{b(){}c\n(){}}",
741 "class a {\n b() {}\n c() {}\n}",
742 "class a {\n b() {}\n c() {}\n}",
743 },
744 { // 145
745 "class\na{*b(){}\n*\nc\n(){}}",
746 "class a {\n * b() {}\n * c() {}\n}",
747 "class a {\n * b() {}\n * c() {}\n}",
748 },
749 { // 146
750 "class\na{async b(){}\nasync c\n(){}}",
751 "class a {\n async b() {}\n async c() {}\n}",
752 "class a {\n async b() {}\n async c() {}\n}",
753 },
754 { // 147
755 "class\na{async *b(){}\nasync *\nc\n(){}}",
756 "class a {\n async * b() {}\n async * c() {}\n}",
757 "class a {\n async * b() {}\n async * c() {}\n}",
758 },
759 { // 148
760 "class\na{get\nb(){}\nget c\n(){}}",
761 "class a {\n get b() {}\n get c() {}\n}",
762 "class a {\n get b() {}\n get c() {}\n}",
763 },
764 { // 149
765 "class\na{set\nb(c){}\nset d\n(e){}}",
766 "class a {\n set b(c) {}\n set d(e) {}\n}",
767 "class a {\n set b(c) {}\n set d(e) {}\n}",
768 },
769 { // 150
770 "class\na{static\nb(){}\nstatic c\n(){}}",
771 "class a {\n static b() {}\n static c() {}\n}",
772 "class a {\n static b() {}\n static c() {}\n}",
773 },
774 { // 151
775 "class\na{static\n*b(){}\nstatic *\nc\n(){}}",
776 "class a {\n static * b() {}\n static * c() {}\n}",
777 "class a {\n static * b() {}\n static * c() {}\n}",
778 },
779 { // 152
780 "class\na{static\nasync b(){}\nstatic async c\n(){}}",
781 "class a {\n static async b() {}\n static async c() {}\n}",
782 "class a {\n static async b() {}\n static async c() {}\n}",
783 },
784 { // 153
785 "class\na{static\nasync *b(){}\nstatic async *\nc(){}}",
786 "class a {\n static async * b() {}\n static async * c() {}\n}",
787 "class a {\n static async * b() {}\n static async * c() {}\n}",
788 },
789 { // 154
790 "class\na{static\nget\nb(){}static get c\n(){}}",
791 "class a {\n static get b() {}\n static get c() {}\n}",
792 "class a {\n static get b() {}\n static get c() {}\n}",
793 },
794 { // 155
795 "class\na{static\nset\nb(c){}static set d\n(e){}}",
796 "class a {\n static set b(c) {}\n static set d(e) {}\n}",
797 "class a {\n static set b(c) {}\n static set d(e) {}\n}",
798 },
799 { // 156
800 "a",
801 "a;",
802 "a;",
803 },
804 { // 157
805 "a?b:c",
806 "a ? b : c;",
807 "a ? b : c;",
808 },
809 { // 158
810 "a\n?\nb\n:\nc\n",
811 "a ? b : c;",
812 "a ? b : c;",
813 },
814 { // 159
815 "a=>b",
816 "a => b;",
817 "a => b;",
818 },
819 { // 160
820 "a =>\nb",
821 "a => b;",
822 "a => b;",
823 },
824 { // 161
825 "async a => b",
826 "async a => b;",
827 "async a => b;",
828 },
829 { // 162
830 "(a,b)=>b",
831 "(a, b) => b;",
832 "(a, b) => b;",
833 },
834 { // 163
835 "async (a,b)=>c",
836 "async (a, b) => c;",
837 "async (a, b) => c;",
838 },
839 { // 164
840 "a=>{}",
841 "a => {};",
842 "a => {};",
843 },
844 { // 165
845 "async a=>{}",
846 "async a => {};",
847 "async a => {};",
848 },
849 { // 166
850 "(a,b)=>{}",
851 "(a, b) => {};",
852 "(a, b) => {};",
853 },
854 { // 167
855 "async(a,b)=>{}",
856 "async (a, b) => {};",
857 "async (a, b) => {};",
858 },
859 { // 168
860 "new a",
861 "new a;",
862 "new a;",
863 },
864 { // 169
865 "new\nnew \n new new\na",
866 "new new new new a;",
867 "new new new new a;",
868 },
869 { // 170
870 "super()",
871 "super();",
872 "super();",
873 },
874 { // 171
875 "super\n()",
876 "super();",
877 "super();",
878 },
879 { // 172
880 "import(a)",
881 "import(a);",
882 "import(a);",
883 },
884 { // 173
885 "import\n(a)",
886 "import(a);",
887 "import(a);",
888 },
889 { // 174
890 "a()",
891 "a();",
892 "a();",
893 },
894 { // 175
895 "a\n()",
896 "a();",
897 "a();",
898 },
899 { // 176
900 "a\n()\n()",
901 "a()();",
902 "a()();",
903 },
904 { // 177
905 "a()[b]",
906 "a()[b];",
907 "a()[b];",
908 },
909 { // 178
910 "a().b",
911 "a().b;",
912 "a().b;",
913 },
914 { // 179
915 "a()`b`",
916 "a()`b`;",
917 "a()`b`;",
918 },
919 { // 180
920 "var{a}=b",
921 "var {a} = b;",
922 "var {a: a} = b;",
923 },
924 { // 181
925 "var\n{\na\n:\nb\n}\n=\nc\n",
926 "var {a: b} = c;",
927 "var {a: b} = c;",
928 },
929 { // 182
930 "var[a=b]=c",
931 "var [a = b] = c;",
932 "var [a = b] = c;",
933 },
934 { // 183
935 "var[a=[b]] = c",
936 "var [a = [b]] = c;",
937 "var [a = [b]] = c;",
938 },
939 { // 184
940 "var[a={b}] = c",
941 "var [a = {b}] = c;",
942 "var [a = {b: b}] = c;",
943 },
944 { // 185
945 "var a={[\"b\"]:c}",
946 "var a = {[\"b\"]: c};",
947 "var a = {[\"b\"]: c};",
948 },
949 { // 186
950 "a||b",
951 "a || b;",
952 "a || b;",
953 },
954 { // 187
955 "(a,b,c)",
956 "(a, b, c);",
957 "(a, b, c);",
958 },
959 { // 188
960 "(\na\n,\nb\n,\nc\n)\n",
961 "(a, b, c);",
962 "(a, b, c);",
963 },
964 { // 189
965 "var a=(b,c,...d)=>{}",
966 "var a = (b, c, ...d) => {};",
967 "var a = (b, c, ...d) => {};",
968 },
969 { // 190
970 "var a=(b,c,...[e])=>{}",
971 "var a = (b, c, ...[e]) => {};",
972 "var a = (b, c, ...[e]) => {};",
973 },
974 { // 191
975 "var a=(b,c,...{...e})=>{}",
976 "var a = (b, c, ...{...e}) => {};",
977 "var a = (b, c, ...{...e}) => {};",
978 },
979 { // 192
980 "new a()",
981 "new a();",
982 "new a();",
983 },
984 { // 193
985 "new\nnew\na\n(\n)\n(\n)\n",
986 "new new a()();",
987 "new new a()();",
988 },
989 { // 194
990 "a\n[\n1\n]\n",
991 "a[1];",
992 "a[1];",
993 },
994 { // 195
995 "a\n.\nb\n",
996 "a.b;",
997 "a\n.b;",
998 },
999 { // 196
1000 "a\n`b`",
1001 "a`b`;",
1002 "a`b`;",
1003 },
1004 { // 197
1005 "new\nsuper\n[\na\n]\n[\nb\n]\n.\nc`d`\n(\nnew\n.\ntarget\n)\n",
1006 "new super[a][b].c`d`(new.target);",
1007 "new super[a][b]\n.c`d`(new.target);",
1008 },
1009 { // 198
1010 "a(b,c,...d)",
1011 "a(b, c, ...d);",
1012 "a(b, c, ...d);",
1013 },
1014 { // 199
1015 "a\n(\n...\nb\n)\n",
1016 "a(...b);",
1017 "a(...b);",
1018 },
1019 { // 200
1020 "`a`",
1021 "`a`;",
1022 "`a`;",
1023 },
1024 { // 201
1025 "`a${b}c`",
1026 "`a${b}c`;",
1027 "`a${b}c`;",
1028 },
1029 { // 202
1030 "`a${\nb\n}c${\nd\n}e`",
1031 "`a${b}c${d}e`;",
1032 "`a${b}c${d}e`;",
1033 },
1034 { // 203
1035 "a&&b",
1036 "a && b;",
1037 "a && b;",
1038 },
1039 { // 204
1040 "this",
1041 "this;",
1042 "this;",
1043 },
1044 { // 205
1045 "a",
1046 "a;",
1047 "a;",
1048 },
1049 { // 206
1050 "1",
1051 "1;",
1052 "1;",
1053 },
1054 { // 207
1055 "[\n]\n",
1056 "[];",
1057 "[];",
1058 },
1059 { // 208
1060 "var a={}",
1061 "var a = {};",
1062 "var a = {};",
1063 },
1064 { // 209
1065 "var a=function(){}",
1066 "var a = function () {};",
1067 "var a = function () {};",
1068 },
1069 { // 210
1070 "var a=class{}",
1071 "var a = class {};",
1072 "var a = class {};",
1073 },
1074 { // 211
1075 "`a`",
1076 "`a`;",
1077 "`a`;",
1078 },
1079 { // 212
1080 "(a)",
1081 "(a);",
1082 "(a);",
1083 },
1084 { // 213
1085 "a|b",
1086 "a | b;",
1087 "a | b;",
1088 },
1089 { // 214
1090 "[a,b,...c]",
1091 "[a, b, ...c];",
1092 "[a, b, ...c];",
1093 },
1094 { // 215
1095 "[...a]",
1096 "[...a];",
1097 "[...a];",
1098 },
1099 { // 216
1100 "[a]",
1101 "[a];",
1102 "[a];",
1103 },
1104 { // 217
1105 "var a={b:c}",
1106 "var a = {b: c};",
1107 "var a = {b: c};",
1108 },
1109 { // 218
1110 "var a={b:c,d:e}",
1111 "var a = {b: c, d: e};",
1112 "var a = {b: c, d: e};",
1113 },
1114 { // 219
1115 "var a={\nb\n:\nc\n}",
1116 "var a = {b: c};",
1117 "var a = {\n b: c\n};",
1118 },
1119 { // 220
1120 "var a={\nb\n:\nc\n,\nd\n:\ne\n}",
1121 "var a = {b: c, d: e};",
1122 "var a = {\n b: c,\n d: e\n};",
1123 },
1124 { // 221
1125 "a^b",
1126 "a ^ b;",
1127 "a ^ b;",
1128 },
1129 { // 222
1130 "var a\n=\n{\nb\n:\nc\n,\nd\n,\ne\n=\nf\n,\ng\n(\n)\n{\n}\n,\n...\nh\n}\n",
1131 "var a = {b: c, d, e = f, g() {}, ...h};",
1132 "var a = {\n b: c,\n d: d,\n e = f,\n g() {},\n ...h\n};",
1133 },
1134 { // 223
1135 "a&b",
1136 "a & b;",
1137 "a & b;",
1138 },
1139 { // 224
1140 "a==b",
1141 "a == b;",
1142 "a == b;",
1143 },
1144 { // 225
1145 "a!=b",
1146 "a != b;",
1147 "a != b;",
1148 },
1149 { // 226
1150 "a===b",
1151 "a === b;",
1152 "a === b;",
1153 },
1154 { // 227
1155 "a!==b",
1156 "a !== b;",
1157 "a !== b;",
1158 },
1159 { // 228
1160 "a<b",
1161 "a < b;",
1162 "a < b;",
1163 },
1164 { // 229
1165 "a>b",
1166 "a > b;",
1167 "a > b;",
1168 },
1169 { // 230
1170 "a<=b",
1171 "a <= b;",
1172 "a <= b;",
1173 },
1174 { // 231
1175 "a>=b",
1176 "a >= b;",
1177 "a >= b;",
1178 },
1179 { // 232
1180 "a instanceof b",
1181 "a instanceof b;",
1182 "a instanceof b;",
1183 },
1184 { // 233
1185 "a in b",
1186 "a in b;",
1187 "a in b;",
1188 },
1189 { // 234
1190 "a<<b",
1191 "a << b;",
1192 "a << b;",
1193 },
1194 { // 235
1195 "a>>b",
1196 "a >> b;",
1197 "a >> b;",
1198 },
1199 { // 236
1200 "a>>>b",
1201 "a >>> b;",
1202 "a >>> b;",
1203 },
1204 { // 237
1205 "a+b",
1206 "a + b;",
1207 "a + b;",
1208 },
1209 { // 238
1210 "a-b",
1211 "a - b;",
1212 "a - b;",
1213 },
1214 { // 239
1215 "a*b",
1216 "a * b;",
1217 "a * b;",
1218 },
1219 { // 240
1220 "a/b",
1221 "a / b;",
1222 "a / b;",
1223 },
1224 { // 241
1225 "a%b",
1226 "a % b;",
1227 "a % b;",
1228 },
1229 { // 242
1230 "a**b",
1231 "a ** b;",
1232 "a ** b;",
1233 },
1234 { // 243
1235 "delete a",
1236 "delete a;",
1237 "delete a;",
1238 },
1239 { // 244
1240 "void a",
1241 "void a;",
1242 "void a;",
1243 },
1244 { // 245
1245 "typeof a",
1246 "typeof a;",
1247 "typeof a;",
1248 },
1249 { // 246
1250 "+\na",
1251 "+a;",
1252 "+a;",
1253 },
1254 { // 247
1255 "-\na",
1256 "-a;",
1257 "-a;",
1258 },
1259 { // 248
1260 "~\na",
1261 "~a;",
1262 "~a;",
1263 },
1264 { // 249
1265 "!\na",
1266 "!a;",
1267 "!a;",
1268 },
1269 { // 250
1270 "async function a(){await b}",
1271 "async function a() {\n await b;\n}",
1272 "async function a() { await b; }",
1273 },
1274 { // 251
1275 "a ++",
1276 "a++;",
1277 "a++;",
1278 },
1279 { // 252
1280 "a --",
1281 "a--;",
1282 "a--;",
1283 },
1284 { // 253
1285 "++\na",
1286 "++a;",
1287 "++a;",
1288 },
1289 { // 254
1290 "--\na",
1291 "--a;",
1292 "--a;",
1293 },
1294 { // 255
1295 "a: function b(){}",
1296 "a: function b() {}",
1297 "a: function b() {}",
1298 },
1299 { // 256
1300 "a: b",
1301 "a: b;",
1302 "a: b;",
1303 },
1304 { // 257
1305 "continue a",
1306 "continue a;",
1307 "continue a;",
1308 },
1309 { // 258
1310 "debugger",
1311 "debugger;",
1312 "debugger;",
1313 },
1314 { // 259
1315 "for(var a,b,\nc;;){}",
1316 "for (var a, b, c;;) {}",
1317 "for (var a, b,\n c;;) {}",
1318 },
1319 { // 260
1320 "for(var{a}in b){}",
1321 "for (var {a} in b) {}",
1322 "for (var {a: a} in b) {}",
1323 },
1324 { // 261
1325 "for(var[a]in b){}",
1326 "for (var [a] in b) {}",
1327 "for (var [a] in b) {}",
1328 },
1329 { // 262
1330 "switch(a){default:b}",
1331 "switch (a) {\ndefault:\n b;\n}",
1332 "switch (a) {\ndefault:\n b;\n}",
1333 },
1334 { // 263
1335 "function*a(){yield *b}",
1336 "function* a() {\n yield * b;\n}",
1337 "function* a() { yield * b; }",
1338 },
1339 { // 264
1340 "a*=b",
1341 "a *= b;",
1342 "a *= b;",
1343 },
1344 { // 265
1345 "var[[a]]=b",
1346 "var [[a]] = b;",
1347 "var [[a]] = b;",
1348 },
1349 { // 266
1350 "var[{a}]=b",
1351 "var [{a}] = b;",
1352 "var [{a: a}] = b;",
1353 },
1354 { // 267
1355 "super\n.\na\n",
1356 "super.a;",
1357 "super.a;",
1358 },
1359 { // 268
1360 "a\n?.\nb",
1361 "a?.b;",
1362 "a?.b;",
1363 },
1364 { // 269
1365 "a\n??\nb",
1366 "a ?? b;",
1367 "a ?? b;",
1368 },
1369 { // 270
1370 "a\n??\nb\n??\nc",
1371 "a ?? b ?? c;",
1372 "a ?? b ?? c;",
1373 },
1374 { // 271
1375 "a = ([b]) => b",
1376 "a = ([b]) => b;",
1377 "a = ([b]) => b;",
1378 },
1379 { // 272
1380 "a?.b().c",
1381 "a?.b().c;",
1382 "a?.b().c;",
1383 },
1384 { // 273
1385 "a?.b()?.c",
1386 "a?.b()?.c;",
1387 "a?.b()?.c;",
1388 },
1389 { // 274
1390 "a&&=1",
1391 "a &&= 1;",
1392 "a &&= 1;",
1393 },
1394 { // 275
1395 "a||=1",
1396 "a ||= 1;",
1397 "a ||= 1;",
1398 },
1399 { // 276
1400 "a??=1",
1401 "a ??= 1;",
1402 "a ??= 1;",
1403 },
1404 { // 277
1405 "[a, b] = [b, a]",
1406 "[a, b] = [b, a];",
1407 "[a, b] = [b, a];",
1408 },
1409 { // 278
1410 "[a.b, a.c] = [a.c, a.b]",
1411 "[a.b, a.c] = [a.c, a.b];",
1412 "[a.b, a.c] = [a.c, a.b];",
1413 },
1414 { // 279
1415 "{a}",
1416 "{\n a;\n}",
1417 "{ a; }",
1418 },
1419 { // 280
1420 "{a;b}",
1421 "{\n a;\n b;\n}",
1422 "{ a; b; }",
1423 },
1424 { // 281
1425 "{a;\nb}",
1426 "{\n a;\n b;\n}",
1427 "{ a;\n b; }",
1428 },
1429 { // 282
1430 "{\na;\nb\n}",
1431 "{\n a;\n b;\n}",
1432 "{\n a;\n b;\n}",
1433 },
1434 { // 283
1435 "({a, b} = {a: 1, b: 2})",
1436 "({a, b} = {a: 1, b: 2});",
1437 "({a: a, b: b} = {a: 1, b: 2});",
1438 },
1439 { // 284
1440 "[a,b,...c] = [b, a]",
1441 "[a, b, ...c] = [b, a];",
1442 "[a, b, ...c] = [b, a];",
1443 },
1444 { // 285
1445 "({a,b,...c}=d)",
1446 "({a, b, ...c} = d);",
1447 "({a: a, b: b, ...c} = d);",
1448 },
1449 { // 286
1450 "({a:{b,c: d,...e},...f}=g)",
1451 "({a: {b, c: d, ...e}, ...f} = g);",
1452 "({a: {b: b, c: d, ...e}, ...f} = g);",
1453 },
1454 { // 287
1455 "[a, ,[b,{c},,...d],,...e]=f",
1456 "[a, , [b, {c}, , ...d], , ...e] = f;",
1457 "[a, , [b, {c: c}, , ...d], , ...e] = f;",
1458 },
1459 { // 288
1460 "a() ?.\nb",
1461 "a()?.b;",
1462 "a()?.b;",
1463 },
1464 { // 289
1465 "a ?. [1]",
1466 "a?.[1];",
1467 "a?.[1];",
1468 },
1469 { // 290
1470 "a ?. `1`",
1471 "a?.`1`;",
1472 "a?.`1`;",
1473 },
1474 { // 291
1475 "a()\n.then()\n.catch()",
1476 "a().then().catch();",
1477 "a()\n.then()\n.catch();",
1478 },
1479 { // 292
1480 "[a=b]=c",
1481 "[a = b] = c;",
1482 "[a = b] = c;",
1483 },
1484 { // 293
1485 "({a=b}=c)",
1486 "({a = b} = c);",
1487 "({a = b} = c);",
1488 },
1489 { // 294
1490 "a.#b",
1491 "a.#b;",
1492 "a.#b;",
1493 },
1494 { // 295
1495 "a\n.#b",
1496 "a.#b;",
1497 "a\n.#b;",
1498 },
1499 { // 296
1500 "a.#b.c",
1501 "a.#b.c;",
1502 "a.#b.c;",
1503 },
1504 { // 297
1505 "a\n.#b\n.c",
1506 "a.#b.c;",
1507 "a\n.#b\n.c;",
1508 },
1509 { // 298
1510 "class\na\n{\nb\n}",
1511 "class a {\n b;\n}",
1512 "class a {\n b;\n}",
1513 },
1514 { // 299
1515 "class a { b () {} }",
1516 "class a {\n b() {}\n}",
1517 "class a {\n b() {}\n}",
1518 },
1519 { // 300
1520 "class\na\n{\n#b\n}",
1521 "class a {\n #b;\n}",
1522 "class a {\n #b;\n}",
1523 },
1524 { // 301
1525 "class a { #b () {} }",
1526 "class a {\n #b() {}\n}",
1527 "class a {\n #b() {}\n}",
1528 },
1529 { // 302
1530 "class a { #b = 1 }",
1531 "class a {\n #b = 1;\n}",
1532 "class a {\n #b = 1;\n}",
1533 },
1534 { // 303
1535 "class a { #b = 1; #c = 2 }",
1536 "class a {\n #b = 1;\n #c = 2;\n}",
1537 "class a {\n #b = 1;\n #c = 2;\n}",
1538 },
1539 { // 304
1540 "class a { #b = 1\n#c = 2 }",
1541 "class a {\n #b = 1;\n #c = 2;\n}",
1542 "class a {\n #b = 1;\n #c = 2;\n}",
1543 },
1544 { // 305
1545 "class a { #b(){}#c = 2 }",
1546 "class a {\n #b() {}\n #c = 2;\n}",
1547 "class a {\n #b() {}\n #c = 2;\n}",
1548 },
1549 { // 306
1550 "class a { #b\n#c(){}}",
1551 "class a {\n #b;\n #c() {}\n}",
1552 "class a {\n #b;\n #c() {}\n}",
1553 },
1554 { // 307
1555 "class a { #b = 1\n#c(){}}",
1556 "class a {\n #b = 1;\n #c() {}\n}",
1557 "class a {\n #b = 1;\n #c() {}\n}",
1558 },
1559 { // 308
1560 "class a { #b = 1;#c(){}}",
1561 "class a {\n #b = 1;\n #c() {}\n}",
1562 "class a {\n #b = 1;\n #c() {}\n}",
1563 },
1564 { // 309
1565 "class a { #b;#c(){}}",
1566 "class a {\n #b;\n #c() {}\n}",
1567 "class a {\n #b;\n #c() {}\n}",
1568 },
1569 { // 310
1570 "class a {static a;static b\nstatic c = 2;static d(){};static{}static{e}static{e;f}}",
1571 "class a {\n\tstatic a;\n\tstatic b;\n\tstatic c = 2;\n\tstatic d() {}\n\tstatic {}\n\tstatic {\n\t\te;\n\t}\n\tstatic {\n\t\te;\n\t\tf;\n\t}\n}",
1572 "class a {\n\tstatic a;\n\tstatic b;\n\tstatic c = 2;\n\tstatic d() {}\n\tstatic {}\n\tstatic { e; }\n\tstatic { e; f; }\n}",
1573 },
1574 { // 311
1575 "#a in b",
1576 "#a in b;",
1577 "#a in b;",
1578 },
1579 { // 312
1580 "#a\nin\nb",
1581 "#a in b;",
1582 "#a in b;",
1583 },
1584 { // 313
1585 "a().#b",
1586 "a().#b;",
1587 "a().#b;",
1588 },
1589 { // 313
1590 "a\n(\n)\n.\n#b",
1591 "a().#b;",
1592 "a()\n.#b;",
1593 },
1594 { // 314
1595 "a\n?.\n#b",
1596 "a?.#b;",
1597 "a?.#b;",
1598 },
1599 { // 315
1600 "a?.c.#d",
1601 "a?.c.#d;",
1602 "a?.c.#d;",
1603 },
1604 } {
1605 for m, in := range [2]string{test.Input, test.VerboseOutput} {
1606 s, err := ParseScript(makeTokeniser(parser.NewStringTokeniser(in)))
1607 if err != nil {
1608 t.Errorf("test %d.%d.1: unexpected error: %s", n+1, m+1, err)
1609 continue
1610 }
1611 st.Verbose = false
1612 st.Buffer.Reset()
1613 s.Format(&st, 's')
1614 if str := st.String(); str != test.SimpleOutput {
1615 t.Errorf("test %d.%d.2: expecting %q, got %q\n%s", n+1, m+1, test.SimpleOutput, str, s)
1616 }
1617 st.Verbose = true
1618 st.Buffer.Reset()
1619 s.Format(&st, 's')
1620 if str := st.Buffer.String(); str != test.VerboseOutput {
1621 t.Errorf("test %d.%d.3: expecting %q, got %q\n%s", n+1, m+1, test.VerboseOutput, str, s)
1622 }
1623 }
1624 }
1625 }
1626
1627 func TestPrintingModule(t *testing.T) {
1628 var st state
1629 for n, test := range [...]struct {
1630 Input, SimpleOutput, VerboseOutput string
1631 }{
1632 { // 1
1633 "1",
1634 "1;",
1635 "1;",
1636 },
1637 { // 2
1638 "1\n2\n3",
1639 "1;\n\n2;\n\n3;",
1640 "1;\n\n2;\n\n3;",
1641 },
1642 { // 3
1643 "import\n'a'",
1644 "import 'a';",
1645 "import 'a';",
1646 },
1647 { // 4
1648 "import\na\nfrom'b'",
1649 "import a from 'b';",
1650 "import a from 'b';",
1651 },
1652 { // 5
1653 "export\n*\nfrom\n'a'",
1654 "export * from 'a';",
1655 "export * from 'a';",
1656 },
1657 { // 6
1658 "export\n{\na\n}\nfrom\n'b'",
1659 "export {a} from 'b';",
1660 "export {a as a} from 'b';",
1661 },
1662 { // 7
1663 "export\n{a}",
1664 "export {a};",
1665 "export {a as a};",
1666 },
1667 { // 8
1668 "export\nvar\na",
1669 "export var a;",
1670 "export var a;",
1671 },
1672 { // 9
1673 "export\nfunction\na(){}",
1674 "export function a() {}",
1675 "export function a() {}",
1676 },
1677 { // 10
1678 "export\ndefault\nfunction(){}",
1679 "export default function () {}",
1680 "export default function () {}",
1681 },
1682 { // 11
1683 "export\ndefault\nclass{}",
1684 "export default class {}",
1685 "export default class {}",
1686 },
1687 { // 12
1688 "export\ndefault\na",
1689 "export default a;",
1690 "export default a;",
1691 },
1692 { // 13
1693 "import\n{}\nfrom\n'z'",
1694 "import {} from 'z';",
1695 "import {} from 'z';",
1696 },
1697 { // 14
1698 "import\na\nfrom'b'",
1699 "import a from 'b';",
1700 "import a from 'b';",
1701 },
1702 { // 15
1703 "import*as\na\nfrom'b'",
1704 "import * as a from 'b';",
1705 "import * as a from 'b';",
1706 },
1707 { // 16
1708 "import\na,*as\nb\nfrom'c'",
1709 "import a, * as b from 'c';",
1710 "import a, * as b from 'c';",
1711 },
1712 { // 17
1713 "import\na,{b,c}from'd'",
1714 "import a, {b, c} from 'd';",
1715 "import a, {b as b, c as c} from 'd';",
1716 },
1717 { // 18
1718 "export{}",
1719 "export {};",
1720 "export {};",
1721 },
1722 { // 19
1723 "export{a}",
1724 "export {a};",
1725 "export {a as a};",
1726 },
1727 { // 20
1728 "export{a,b}",
1729 "export {a, b};",
1730 "export {a as a, b as b};",
1731 },
1732 { // 21
1733 "import{a\nas\nb}from'c'",
1734 "import {a as b} from 'c';",
1735 "import {a as b} from 'c';",
1736 },
1737 { // 22
1738 "export{a\nas\nb}",
1739 "export {a as b};",
1740 "export {a as b};",
1741 },
1742 { // 23
1743 "import . meta",
1744 "import.meta;",
1745 "import.meta;",
1746 },
1747 { // 24
1748 "export\n*\nas\na\nfrom\n'b'",
1749 "export * as a from 'b';",
1750 "export * as a from 'b';",
1751 },
1752 } {
1753 for m, in := range [2]string{test.Input, test.VerboseOutput} {
1754 s, err := ParseModule(makeTokeniser(parser.NewStringTokeniser(in)))
1755 if err != nil {
1756 t.Errorf("test %d.%d.1: unexpected error: %s", n+1, m+1, err)
1757 continue
1758 }
1759 st.Verbose = false
1760 st.Buffer.Reset()
1761 s.Format(&st, 's')
1762 if str := st.Buffer.String(); str != test.SimpleOutput {
1763 t.Errorf("test %d.%d.2: expecting %q, got %q\n%s", n+1, m+1, test.SimpleOutput, str, s)
1764 }
1765 st.Verbose = true
1766 st.Buffer.Reset()
1767 s.Format(&st, 's')
1768 if str := st.Buffer.String(); str != test.VerboseOutput {
1769 t.Errorf("test %d.%d.3: expecting %q, got %q\n%s", n+1, m+1, test.VerboseOutput, str, s)
1770 }
1771 }
1772 }
1773 }
1774