1 package javascript 2 3 import ( 4 "errors" 5 "reflect" 6 "testing" 7 8 "vimagination.zapto.org/parser" 9 ) 10 11 func TestUnquote(t *testing.T) { 12 for n, test := range [...]struct { 13 Input, Output string 14 Err error 15 }{ 16 { // 1 17 "\"\"", 18 "", 19 nil, 20 }, 21 { // 2 22 "''", 23 "", 24 nil, 25 }, 26 { // 3 27 "\"a\"", 28 "a", 29 nil, 30 }, 31 { // 4 32 "'a'", 33 "a", 34 nil, 35 }, 36 { // 5 37 "\"\\'\\\"\\\\\\b\\f\\n\\r\\t\\v\"", 38 "'\"\\\b\f\n\r\t\v", 39 nil, 40 }, 41 { // 6 42 "\"\x41\"", 43 "A", 44 nil, 45 }, 46 { // 7 47 "", 48 "", 49 ErrInvalidQuoted, 50 }, 51 { // 8 52 "\"\\x41\"", 53 "A", 54 nil, 55 }, 56 { // 9 57 "\"\\x4G\"", 58 "", 59 ErrInvalidQuoted, 60 }, 61 { // 10 62 "\"\\xG1\"", 63 "", 64 ErrInvalidQuoted, 65 }, 66 { // 11 67 "\"\\u0041\"", 68 "A", 69 nil, 70 }, 71 { // 12 72 "\"\\u004G\"", 73 "", 74 ErrInvalidQuoted, 75 }, 76 { // 13 77 "\"\\u00G1\"", 78 "", 79 ErrInvalidQuoted, 80 }, 81 { // 14 82 "\"\\u0G41\"", 83 "", 84 ErrInvalidQuoted, 85 }, 86 { // 15 87 "\"\\uG041\"", 88 "", 89 ErrInvalidQuoted, 90 }, 91 { // 16 92 "\"\\c\"", 93 "c", 94 nil, 95 }, 96 { // 17 97 "\"\n\"", 98 "", 99 ErrInvalidQuoted, 100 }, 101 { // 18 102 "\"\\0\"", 103 "\000", 104 nil, 105 }, 106 { // 19 107 "\"\\01\"", 108 "", 109 ErrInvalidQuoted, 110 }, 111 { // 20 112 "\"\\u{41}\"", 113 "A", 114 nil, 115 }, 116 { // 21 117 "\"\\u{}\"", 118 "", 119 ErrInvalidQuoted, 120 }, 121 { // 22 122 "\"\\u{41G}\"", 123 "", 124 ErrInvalidQuoted, 125 }, 126 { // 23 127 "\"\\u{41\"", 128 "", 129 ErrInvalidQuoted, 130 }, 131 { // 24 132 "'\\'\\\"\\\\\\b\\f\\n\\r\\t\\v'", 133 "'\"\\\b\f\n\r\t\v", 134 nil, 135 }, 136 { // 25 137 "'\x41'", 138 "A", 139 nil, 140 }, 141 { // 26 142 "'\\x41'", 143 "A", 144 nil, 145 }, 146 { // 27 147 "'\\x4G'", 148 "", 149 ErrInvalidQuoted, 150 }, 151 { // 28 152 "'\\xG1'", 153 "", 154 ErrInvalidQuoted, 155 }, 156 { // 29 157 "'\\u0041'", 158 "A", 159 nil, 160 }, 161 { // 30 162 "'\\u004G'", 163 "", 164 ErrInvalidQuoted, 165 }, 166 { // 31 167 "'\\u00G1'", 168 "", 169 ErrInvalidQuoted, 170 }, 171 { // 32 172 "'\\u0G41'", 173 "", 174 ErrInvalidQuoted, 175 }, 176 { // 33 177 "'\\uG041'", 178 "", 179 ErrInvalidQuoted, 180 }, 181 { // 34 182 "'\\c'", 183 "c", 184 nil, 185 }, 186 { // 35 187 "'\n'", 188 "", 189 ErrInvalidQuoted, 190 }, 191 { // 36 192 "'\\0'", 193 "\000", 194 nil, 195 }, 196 { // 37 197 "'\\01'", 198 "", 199 ErrInvalidQuoted, 200 }, 201 { // 38 202 "'\\u{41}'", 203 "A", 204 nil, 205 }, 206 { // 39 207 "'\\u{}'", 208 "", 209 ErrInvalidQuoted, 210 }, 211 { // 40 212 "'\\u{41G}'", 213 "", 214 ErrInvalidQuoted, 215 }, 216 { // 41 217 "'\\u{41'", 218 "", 219 ErrInvalidQuoted, 220 }, 221 { // 42 222 "\"\\/\"", 223 "/", 224 nil, 225 }, 226 } { 227 if o, err := Unquote(test.Input); !errors.Is(err, test.Err) { 228 t.Errorf("test %d: expecting error %q, got %q", n+1, test.Err, err) 229 } else if o != test.Output { 230 t.Errorf("test %d: from %s, expecting output %q, got %q", n+1, test.Input, test.Output, o) 231 } 232 } 233 } 234 235 func TestUnquoteTemplate(t *testing.T) { 236 for n, test := range [...]struct { 237 Input, Output string 238 Err error 239 }{ 240 { // 1 241 "``", 242 "", 243 nil, 244 }, 245 { // 2 246 "}`", 247 "", 248 nil, 249 }, 250 { // 3 251 "`${", 252 "", 253 nil, 254 }, 255 { // 4 256 "}${", 257 "", 258 nil, 259 }, 260 { // 5 261 "`", 262 "", 263 ErrInvalidQuoted, 264 }, 265 { // 6 266 "}", 267 "", 268 ErrInvalidQuoted, 269 }, 270 { // 7 271 "${", 272 "", 273 ErrInvalidQuoted, 274 }, 275 { // 8 276 "`a`", 277 "a", 278 nil, 279 }, 280 { // 9 281 "`\\'\\\"\\\\\\b\\f\\n\\r\\t\\v`", 282 "'\"\\\b\f\n\r\t\v", 283 nil, 284 }, 285 { // 10 286 "`\x41`", 287 "A", 288 nil, 289 }, 290 { // 11 291 "`\n`", 292 "\n", 293 nil, 294 }, 295 { // 12 296 "`\\x4G`", 297 "", 298 ErrInvalidQuoted, 299 }, 300 { // 13 301 "`\\u0041`", 302 "A", 303 nil, 304 }, 305 { // 14 306 "`\\u00G1`", 307 "", 308 ErrInvalidQuoted, 309 }, 310 { // 15 311 "`\\c`", 312 "c", 313 nil, 314 }, 315 { // 16 316 "`\\0`", 317 "\000", 318 nil, 319 }, 320 { // 17 321 "`\\u{41}`", 322 "A", 323 nil, 324 }, 325 { // 18 326 "`\\u{}`", 327 "", 328 ErrInvalidQuoted, 329 }, 330 { // 19 331 "`\\${`", 332 "${", 333 nil, 334 }, 335 } { 336 o, err := UnquoteTemplate(test.Input) 337 if !errors.Is(err, test.Err) { 338 t.Errorf("test %d: expecting error %q, got %q", n+1, test.Err, err) 339 } else if o != test.Output { 340 t.Errorf("test %d: from %s, expecting output %q, got %q", n+1, test.Input, test.Output, o) 341 } 342 } 343 } 344 345 func TestQuoteTemplate(t *testing.T) { 346 for n, test := range [...]struct { 347 Input, Output string 348 templateType TemplateType 349 }{ 350 { // 1 351 "", 352 "``", 353 TemplateNoSubstitution, 354 }, 355 { // 2 356 "a", 357 "`a`", 358 TemplateNoSubstitution, 359 }, 360 { // 3 361 "abc", 362 "`abc`", 363 TemplateNoSubstitution, 364 }, 365 { // 4 366 "a\nb c", 367 "`a\nb c`", 368 TemplateNoSubstitution, 369 }, 370 { // 5 371 "\\n", 372 "`\\\\n`", 373 TemplateNoSubstitution, 374 }, 375 { // 6 376 "a$b", 377 "`a$b`", 378 TemplateNoSubstitution, 379 }, 380 { // 7 381 "a${b", 382 "`a\\${b`", 383 TemplateNoSubstitution, 384 }, 385 { // 8 386 "`", 387 "`\\``", 388 TemplateNoSubstitution, 389 }, 390 { // 9 391 "", 392 "`${", 393 TemplateHead, 394 }, 395 { // 10 396 "a", 397 "`a${", 398 TemplateHead, 399 }, 400 { // 11 401 "abc", 402 "`abc${", 403 TemplateHead, 404 }, 405 { // 12 406 "a\nb c", 407 "`a\nb c${", 408 TemplateHead, 409 }, 410 { // 13 411 "\\n", 412 "`\\\\n${", 413 TemplateHead, 414 }, 415 { // 14 416 "a$b", 417 "`a$b${", 418 TemplateHead, 419 }, 420 { // 15 421 "a${b", 422 "`a\\${b${", 423 TemplateHead, 424 }, 425 { // 16 426 "`", 427 "`\\`${", 428 TemplateHead, 429 }, 430 { // 17 431 "", 432 "}${", 433 TemplateMiddle, 434 }, 435 { // 18 436 "a", 437 "}a${", 438 TemplateMiddle, 439 }, 440 { // 19 441 "abc", 442 "}abc${", 443 TemplateMiddle, 444 }, 445 { // 20 446 "a\nb c", 447 "}a\nb c${", 448 TemplateMiddle, 449 }, 450 { // 21 451 "\\n", 452 "}\\\\n${", 453 TemplateMiddle, 454 }, 455 { // 22 456 "a$b", 457 "}a$b${", 458 TemplateMiddle, 459 }, 460 { // 23 461 "a${b", 462 "}a\\${b${", 463 TemplateMiddle, 464 }, 465 { // 24 466 "`", 467 "}\\`${", 468 TemplateMiddle, 469 }, 470 { // 25 471 "", 472 "}`", 473 TemplateTail, 474 }, 475 { // 26 476 "a", 477 "}a`", 478 TemplateTail, 479 }, 480 { // 27 481 "abc", 482 "}abc`", 483 TemplateTail, 484 }, 485 { // 28 486 "a\nb c", 487 "}a\nb c`", 488 TemplateTail, 489 }, 490 { // 29 491 "\\n", 492 "}\\\\n`", 493 TemplateTail, 494 }, 495 { // 30 496 "a$b", 497 "}a$b`", 498 TemplateTail, 499 }, 500 { // 31 501 "a${b", 502 "}a\\${b`", 503 TemplateTail, 504 }, 505 { // 32 506 "`", 507 "}\\``", 508 TemplateTail, 509 }, 510 } { 511 if out := QuoteTemplate(test.Input, test.templateType); out != test.Output { 512 t.Errorf("test %d: expecting output %s, got %s", n+1, test.Output, out) 513 } 514 } 515 } 516 517 func TestWrapConditional(t *testing.T) { 518 tks := Tokens{ 519 { 520 Token: parser.Token{ 521 Type: TokenNoSubstitutionTemplate, 522 Data: "`abc`", 523 }, 524 }, 525 } 526 template := &TemplateLiteral{ 527 NoSubstitutionTemplate: &tks[0], 528 Tokens: tks, 529 } 530 expectedOutput := ConditionalExpression{ 531 LogicalORExpression: &LogicalORExpression{ 532 LogicalANDExpression: LogicalANDExpression{ 533 BitwiseORExpression: BitwiseORExpression{ 534 BitwiseXORExpression: BitwiseXORExpression{ 535 BitwiseANDExpression: BitwiseANDExpression{ 536 EqualityExpression: EqualityExpression{ 537 RelationalExpression: RelationalExpression{ 538 ShiftExpression: ShiftExpression{ 539 AdditiveExpression: AdditiveExpression{ 540 MultiplicativeExpression: MultiplicativeExpression{ 541 ExponentiationExpression: ExponentiationExpression{ 542 UnaryExpression: UnaryExpression{ 543 UpdateExpression: UpdateExpression{ 544 LeftHandSideExpression: &LeftHandSideExpression{ 545 NewExpression: &NewExpression{ 546 MemberExpression: MemberExpression{ 547 PrimaryExpression: &PrimaryExpression{ 548 TemplateLiteral: template, 549 Tokens: tks, 550 }, 551 Tokens: tks, 552 }, 553 Tokens: tks, 554 }, 555 Tokens: tks, 556 }, 557 Tokens: tks, 558 }, 559 Tokens: tks, 560 }, 561 Tokens: tks, 562 }, 563 Tokens: tks, 564 }, 565 Tokens: tks, 566 }, 567 Tokens: tks, 568 }, 569 Tokens: tks, 570 }, 571 Tokens: tks, 572 }, 573 Tokens: tks, 574 }, 575 Tokens: tks, 576 }, 577 Tokens: tks, 578 }, 579 Tokens: tks, 580 }, 581 Tokens: tks, 582 }, 583 Tokens: tks, 584 } 585 586 for n, test := range [...]ConditionalWrappable{ 587 template, // 1 588 *template, // 2 589 &PrimaryExpression{ // 3 590 TemplateLiteral: template, 591 Tokens: tks, 592 }, 593 PrimaryExpression{ // 4 594 TemplateLiteral: template, 595 Tokens: tks, 596 }, 597 &MemberExpression{ // 5 598 PrimaryExpression: &PrimaryExpression{ 599 TemplateLiteral: template, 600 Tokens: tks, 601 }, 602 Tokens: tks, 603 }, 604 MemberExpression{ // 6 605 PrimaryExpression: &PrimaryExpression{ 606 TemplateLiteral: template, 607 Tokens: tks, 608 }, 609 Tokens: tks, 610 }, 611 &NewExpression{ // 7 612 MemberExpression: MemberExpression{ 613 PrimaryExpression: &PrimaryExpression{ 614 TemplateLiteral: template, 615 Tokens: tks, 616 }, 617 Tokens: tks, 618 }, 619 Tokens: tks, 620 }, 621 NewExpression{ // 8 622 MemberExpression: MemberExpression{ 623 PrimaryExpression: &PrimaryExpression{ 624 TemplateLiteral: template, 625 Tokens: tks, 626 }, 627 Tokens: tks, 628 }, 629 Tokens: tks, 630 }, 631 &LeftHandSideExpression{ // 9 632 NewExpression: &NewExpression{ 633 MemberExpression: MemberExpression{ 634 PrimaryExpression: &PrimaryExpression{ 635 TemplateLiteral: template, 636 Tokens: tks, 637 }, 638 Tokens: tks, 639 }, 640 Tokens: tks, 641 }, 642 Tokens: tks, 643 }, 644 LeftHandSideExpression{ // 10 645 NewExpression: &NewExpression{ 646 MemberExpression: MemberExpression{ 647 PrimaryExpression: &PrimaryExpression{ 648 TemplateLiteral: template, 649 Tokens: tks, 650 }, 651 Tokens: tks, 652 }, 653 Tokens: tks, 654 }, 655 Tokens: tks, 656 }, 657 &UpdateExpression{ // 11 658 LeftHandSideExpression: &LeftHandSideExpression{ 659 NewExpression: &NewExpression{ 660 MemberExpression: MemberExpression{ 661 PrimaryExpression: &PrimaryExpression{ 662 TemplateLiteral: template, 663 Tokens: tks, 664 }, 665 Tokens: tks, 666 }, 667 Tokens: tks, 668 }, 669 Tokens: tks, 670 }, 671 Tokens: tks, 672 }, 673 UpdateExpression{ // 12 674 LeftHandSideExpression: &LeftHandSideExpression{ 675 NewExpression: &NewExpression{ 676 MemberExpression: MemberExpression{ 677 PrimaryExpression: &PrimaryExpression{ 678 TemplateLiteral: template, 679 Tokens: tks, 680 }, 681 Tokens: tks, 682 }, 683 Tokens: tks, 684 }, 685 Tokens: tks, 686 }, 687 Tokens: tks, 688 }, 689 &UnaryExpression{ // 13 690 UpdateExpression: UpdateExpression{ 691 LeftHandSideExpression: &LeftHandSideExpression{ 692 NewExpression: &NewExpression{ 693 MemberExpression: MemberExpression{ 694 PrimaryExpression: &PrimaryExpression{ 695 TemplateLiteral: template, 696 Tokens: tks, 697 }, 698 Tokens: tks, 699 }, 700 Tokens: tks, 701 }, 702 Tokens: tks, 703 }, 704 Tokens: tks, 705 }, 706 Tokens: tks, 707 }, 708 UnaryExpression{ // 14 709 UpdateExpression: UpdateExpression{ 710 LeftHandSideExpression: &LeftHandSideExpression{ 711 NewExpression: &NewExpression{ 712 MemberExpression: MemberExpression{ 713 PrimaryExpression: &PrimaryExpression{ 714 TemplateLiteral: template, 715 Tokens: tks, 716 }, 717 Tokens: tks, 718 }, 719 Tokens: tks, 720 }, 721 Tokens: tks, 722 }, 723 Tokens: tks, 724 }, 725 Tokens: tks, 726 }, 727 &ExponentiationExpression{ // 15 728 UnaryExpression: UnaryExpression{ 729 UpdateExpression: UpdateExpression{ 730 LeftHandSideExpression: &LeftHandSideExpression{ 731 NewExpression: &NewExpression{ 732 MemberExpression: MemberExpression{ 733 PrimaryExpression: &PrimaryExpression{ 734 TemplateLiteral: template, 735 Tokens: tks, 736 }, 737 Tokens: tks, 738 }, 739 Tokens: tks, 740 }, 741 Tokens: tks, 742 }, 743 Tokens: tks, 744 }, 745 Tokens: tks, 746 }, 747 Tokens: tks, 748 }, 749 ExponentiationExpression{ // 16 750 UnaryExpression: UnaryExpression{ 751 UpdateExpression: UpdateExpression{ 752 LeftHandSideExpression: &LeftHandSideExpression{ 753 NewExpression: &NewExpression{ 754 MemberExpression: MemberExpression{ 755 PrimaryExpression: &PrimaryExpression{ 756 TemplateLiteral: template, 757 Tokens: tks, 758 }, 759 Tokens: tks, 760 }, 761 Tokens: tks, 762 }, 763 Tokens: tks, 764 }, 765 Tokens: tks, 766 }, 767 Tokens: tks, 768 }, 769 Tokens: tks, 770 }, 771 &MultiplicativeExpression{ // 17 772 ExponentiationExpression: ExponentiationExpression{ 773 UnaryExpression: UnaryExpression{ 774 UpdateExpression: UpdateExpression{ 775 LeftHandSideExpression: &LeftHandSideExpression{ 776 NewExpression: &NewExpression{ 777 MemberExpression: MemberExpression{ 778 PrimaryExpression: &PrimaryExpression{ 779 TemplateLiteral: template, 780 Tokens: tks, 781 }, 782 Tokens: tks, 783 }, 784 Tokens: tks, 785 }, 786 Tokens: tks, 787 }, 788 Tokens: tks, 789 }, 790 Tokens: tks, 791 }, 792 Tokens: tks, 793 }, 794 Tokens: tks, 795 }, 796 MultiplicativeExpression{ // 18 797 ExponentiationExpression: ExponentiationExpression{ 798 UnaryExpression: UnaryExpression{ 799 UpdateExpression: UpdateExpression{ 800 LeftHandSideExpression: &LeftHandSideExpression{ 801 NewExpression: &NewExpression{ 802 MemberExpression: MemberExpression{ 803 PrimaryExpression: &PrimaryExpression{ 804 TemplateLiteral: template, 805 Tokens: tks, 806 }, 807 Tokens: tks, 808 }, 809 Tokens: tks, 810 }, 811 Tokens: tks, 812 }, 813 Tokens: tks, 814 }, 815 Tokens: tks, 816 }, 817 Tokens: tks, 818 }, 819 Tokens: tks, 820 }, 821 &AdditiveExpression{ // 19 822 MultiplicativeExpression: MultiplicativeExpression{ 823 ExponentiationExpression: ExponentiationExpression{ 824 UnaryExpression: UnaryExpression{ 825 UpdateExpression: UpdateExpression{ 826 LeftHandSideExpression: &LeftHandSideExpression{ 827 NewExpression: &NewExpression{ 828 MemberExpression: MemberExpression{ 829 PrimaryExpression: &PrimaryExpression{ 830 TemplateLiteral: template, 831 Tokens: tks, 832 }, 833 Tokens: tks, 834 }, 835 Tokens: tks, 836 }, 837 Tokens: tks, 838 }, 839 Tokens: tks, 840 }, 841 Tokens: tks, 842 }, 843 Tokens: tks, 844 }, 845 Tokens: tks, 846 }, 847 Tokens: tks, 848 }, 849 AdditiveExpression{ // 20 850 MultiplicativeExpression: MultiplicativeExpression{ 851 ExponentiationExpression: ExponentiationExpression{ 852 UnaryExpression: UnaryExpression{ 853 UpdateExpression: UpdateExpression{ 854 LeftHandSideExpression: &LeftHandSideExpression{ 855 NewExpression: &NewExpression{ 856 MemberExpression: MemberExpression{ 857 PrimaryExpression: &PrimaryExpression{ 858 TemplateLiteral: template, 859 Tokens: tks, 860 }, 861 Tokens: tks, 862 }, 863 Tokens: tks, 864 }, 865 Tokens: tks, 866 }, 867 Tokens: tks, 868 }, 869 Tokens: tks, 870 }, 871 Tokens: tks, 872 }, 873 Tokens: tks, 874 }, 875 Tokens: tks, 876 }, 877 &ShiftExpression{ // 21 878 AdditiveExpression: AdditiveExpression{ 879 MultiplicativeExpression: MultiplicativeExpression{ 880 ExponentiationExpression: ExponentiationExpression{ 881 UnaryExpression: UnaryExpression{ 882 UpdateExpression: UpdateExpression{ 883 LeftHandSideExpression: &LeftHandSideExpression{ 884 NewExpression: &NewExpression{ 885 MemberExpression: MemberExpression{ 886 PrimaryExpression: &PrimaryExpression{ 887 TemplateLiteral: template, 888 Tokens: tks, 889 }, 890 Tokens: tks, 891 }, 892 Tokens: tks, 893 }, 894 Tokens: tks, 895 }, 896 Tokens: tks, 897 }, 898 Tokens: tks, 899 }, 900 Tokens: tks, 901 }, 902 Tokens: tks, 903 }, 904 Tokens: tks, 905 }, 906 Tokens: tks, 907 }, 908 &ShiftExpression{ // 22 909 AdditiveExpression: AdditiveExpression{ 910 MultiplicativeExpression: MultiplicativeExpression{ 911 ExponentiationExpression: ExponentiationExpression{ 912 UnaryExpression: UnaryExpression{ 913 UpdateExpression: UpdateExpression{ 914 LeftHandSideExpression: &LeftHandSideExpression{ 915 NewExpression: &NewExpression{ 916 MemberExpression: MemberExpression{ 917 PrimaryExpression: &PrimaryExpression{ 918 TemplateLiteral: template, 919 Tokens: tks, 920 }, 921 Tokens: tks, 922 }, 923 Tokens: tks, 924 }, 925 Tokens: tks, 926 }, 927 Tokens: tks, 928 }, 929 Tokens: tks, 930 }, 931 Tokens: tks, 932 }, 933 Tokens: tks, 934 }, 935 Tokens: tks, 936 }, 937 Tokens: tks, 938 }, 939 &RelationalExpression{ // 23 940 ShiftExpression: ShiftExpression{ 941 AdditiveExpression: AdditiveExpression{ 942 MultiplicativeExpression: MultiplicativeExpression{ 943 ExponentiationExpression: ExponentiationExpression{ 944 UnaryExpression: UnaryExpression{ 945 UpdateExpression: UpdateExpression{ 946 LeftHandSideExpression: &LeftHandSideExpression{ 947 NewExpression: &NewExpression{ 948 MemberExpression: MemberExpression{ 949 PrimaryExpression: &PrimaryExpression{ 950 TemplateLiteral: template, 951 Tokens: tks, 952 }, 953 Tokens: tks, 954 }, 955 Tokens: tks, 956 }, 957 Tokens: tks, 958 }, 959 Tokens: tks, 960 }, 961 Tokens: tks, 962 }, 963 Tokens: tks, 964 }, 965 Tokens: tks, 966 }, 967 Tokens: tks, 968 }, 969 Tokens: tks, 970 }, 971 Tokens: tks, 972 }, 973 RelationalExpression{ // 24 974 ShiftExpression: ShiftExpression{ 975 AdditiveExpression: AdditiveExpression{ 976 MultiplicativeExpression: MultiplicativeExpression{ 977 ExponentiationExpression: ExponentiationExpression{ 978 UnaryExpression: UnaryExpression{ 979 UpdateExpression: UpdateExpression{ 980 LeftHandSideExpression: &LeftHandSideExpression{ 981 NewExpression: &NewExpression{ 982 MemberExpression: MemberExpression{ 983 PrimaryExpression: &PrimaryExpression{ 984 TemplateLiteral: template, 985 Tokens: tks, 986 }, 987 Tokens: tks, 988 }, 989 Tokens: tks, 990 }, 991 Tokens: tks, 992 }, 993 Tokens: tks, 994 }, 995 Tokens: tks, 996 }, 997 Tokens: tks, 998 }, 999 Tokens: tks, 1000 }, 1001 Tokens: tks, 1002 }, 1003 Tokens: tks, 1004 }, 1005 Tokens: tks, 1006 }, 1007 &EqualityExpression{ // 25 1008 RelationalExpression: RelationalExpression{ 1009 ShiftExpression: ShiftExpression{ 1010 AdditiveExpression: AdditiveExpression{ 1011 MultiplicativeExpression: MultiplicativeExpression{ 1012 ExponentiationExpression: ExponentiationExpression{ 1013 UnaryExpression: UnaryExpression{ 1014 UpdateExpression: UpdateExpression{ 1015 LeftHandSideExpression: &LeftHandSideExpression{ 1016 NewExpression: &NewExpression{ 1017 MemberExpression: MemberExpression{ 1018 PrimaryExpression: &PrimaryExpression{ 1019 TemplateLiteral: template, 1020 Tokens: tks, 1021 }, 1022 Tokens: tks, 1023 }, 1024 Tokens: tks, 1025 }, 1026 Tokens: tks, 1027 }, 1028 Tokens: tks, 1029 }, 1030 Tokens: tks, 1031 }, 1032 Tokens: tks, 1033 }, 1034 Tokens: tks, 1035 }, 1036 Tokens: tks, 1037 }, 1038 Tokens: tks, 1039 }, 1040 Tokens: tks, 1041 }, 1042 Tokens: tks, 1043 }, 1044 EqualityExpression{ // 26 1045 RelationalExpression: RelationalExpression{ 1046 ShiftExpression: ShiftExpression{ 1047 AdditiveExpression: AdditiveExpression{ 1048 MultiplicativeExpression: MultiplicativeExpression{ 1049 ExponentiationExpression: ExponentiationExpression{ 1050 UnaryExpression: UnaryExpression{ 1051 UpdateExpression: UpdateExpression{ 1052 LeftHandSideExpression: &LeftHandSideExpression{ 1053 NewExpression: &NewExpression{ 1054 MemberExpression: MemberExpression{ 1055 PrimaryExpression: &PrimaryExpression{ 1056 TemplateLiteral: template, 1057 Tokens: tks, 1058 }, 1059 Tokens: tks, 1060 }, 1061 Tokens: tks, 1062 }, 1063 Tokens: tks, 1064 }, 1065 Tokens: tks, 1066 }, 1067 Tokens: tks, 1068 }, 1069 Tokens: tks, 1070 }, 1071 Tokens: tks, 1072 }, 1073 Tokens: tks, 1074 }, 1075 Tokens: tks, 1076 }, 1077 Tokens: tks, 1078 }, 1079 Tokens: tks, 1080 }, 1081 &BitwiseANDExpression{ // 27 1082 EqualityExpression: EqualityExpression{ 1083 RelationalExpression: RelationalExpression{ 1084 ShiftExpression: ShiftExpression{ 1085 AdditiveExpression: AdditiveExpression{ 1086 MultiplicativeExpression: MultiplicativeExpression{ 1087 ExponentiationExpression: ExponentiationExpression{ 1088 UnaryExpression: UnaryExpression{ 1089 UpdateExpression: UpdateExpression{ 1090 LeftHandSideExpression: &LeftHandSideExpression{ 1091 NewExpression: &NewExpression{ 1092 MemberExpression: MemberExpression{ 1093 PrimaryExpression: &PrimaryExpression{ 1094 TemplateLiteral: template, 1095 Tokens: tks, 1096 }, 1097 Tokens: tks, 1098 }, 1099 Tokens: tks, 1100 }, 1101 Tokens: tks, 1102 }, 1103 Tokens: tks, 1104 }, 1105 Tokens: tks, 1106 }, 1107 Tokens: tks, 1108 }, 1109 Tokens: tks, 1110 }, 1111 Tokens: tks, 1112 }, 1113 Tokens: tks, 1114 }, 1115 Tokens: tks, 1116 }, 1117 Tokens: tks, 1118 }, 1119 Tokens: tks, 1120 }, 1121 BitwiseANDExpression{ // 28 1122 EqualityExpression: EqualityExpression{ 1123 RelationalExpression: RelationalExpression{ 1124 ShiftExpression: ShiftExpression{ 1125 AdditiveExpression: AdditiveExpression{ 1126 MultiplicativeExpression: MultiplicativeExpression{ 1127 ExponentiationExpression: ExponentiationExpression{ 1128 UnaryExpression: UnaryExpression{ 1129 UpdateExpression: UpdateExpression{ 1130 LeftHandSideExpression: &LeftHandSideExpression{ 1131 NewExpression: &NewExpression{ 1132 MemberExpression: MemberExpression{ 1133 PrimaryExpression: &PrimaryExpression{ 1134 TemplateLiteral: template, 1135 Tokens: tks, 1136 }, 1137 Tokens: tks, 1138 }, 1139 Tokens: tks, 1140 }, 1141 Tokens: tks, 1142 }, 1143 Tokens: tks, 1144 }, 1145 Tokens: tks, 1146 }, 1147 Tokens: tks, 1148 }, 1149 Tokens: tks, 1150 }, 1151 Tokens: tks, 1152 }, 1153 Tokens: tks, 1154 }, 1155 Tokens: tks, 1156 }, 1157 Tokens: tks, 1158 }, 1159 Tokens: tks, 1160 }, 1161 &BitwiseXORExpression{ // 29 1162 BitwiseANDExpression: BitwiseANDExpression{ 1163 EqualityExpression: EqualityExpression{ 1164 RelationalExpression: RelationalExpression{ 1165 ShiftExpression: ShiftExpression{ 1166 AdditiveExpression: AdditiveExpression{ 1167 MultiplicativeExpression: MultiplicativeExpression{ 1168 ExponentiationExpression: ExponentiationExpression{ 1169 UnaryExpression: UnaryExpression{ 1170 UpdateExpression: UpdateExpression{ 1171 LeftHandSideExpression: &LeftHandSideExpression{ 1172 NewExpression: &NewExpression{ 1173 MemberExpression: MemberExpression{ 1174 PrimaryExpression: &PrimaryExpression{ 1175 TemplateLiteral: template, 1176 Tokens: tks, 1177 }, 1178 Tokens: tks, 1179 }, 1180 Tokens: tks, 1181 }, 1182 Tokens: tks, 1183 }, 1184 Tokens: tks, 1185 }, 1186 Tokens: tks, 1187 }, 1188 Tokens: tks, 1189 }, 1190 Tokens: tks, 1191 }, 1192 Tokens: tks, 1193 }, 1194 Tokens: tks, 1195 }, 1196 Tokens: tks, 1197 }, 1198 Tokens: tks, 1199 }, 1200 Tokens: tks, 1201 }, 1202 Tokens: tks, 1203 }, 1204 BitwiseXORExpression{ // 30 1205 BitwiseANDExpression: BitwiseANDExpression{ 1206 EqualityExpression: EqualityExpression{ 1207 RelationalExpression: RelationalExpression{ 1208 ShiftExpression: ShiftExpression{ 1209 AdditiveExpression: AdditiveExpression{ 1210 MultiplicativeExpression: MultiplicativeExpression{ 1211 ExponentiationExpression: ExponentiationExpression{ 1212 UnaryExpression: UnaryExpression{ 1213 UpdateExpression: UpdateExpression{ 1214 LeftHandSideExpression: &LeftHandSideExpression{ 1215 NewExpression: &NewExpression{ 1216 MemberExpression: MemberExpression{ 1217 PrimaryExpression: &PrimaryExpression{ 1218 TemplateLiteral: template, 1219 Tokens: tks, 1220 }, 1221 Tokens: tks, 1222 }, 1223 Tokens: tks, 1224 }, 1225 Tokens: tks, 1226 }, 1227 Tokens: tks, 1228 }, 1229 Tokens: tks, 1230 }, 1231 Tokens: tks, 1232 }, 1233 Tokens: tks, 1234 }, 1235 Tokens: tks, 1236 }, 1237 Tokens: tks, 1238 }, 1239 Tokens: tks, 1240 }, 1241 Tokens: tks, 1242 }, 1243 Tokens: tks, 1244 }, 1245 Tokens: tks, 1246 }, 1247 &BitwiseORExpression{ // 31 1248 BitwiseXORExpression: BitwiseXORExpression{ 1249 BitwiseANDExpression: BitwiseANDExpression{ 1250 EqualityExpression: EqualityExpression{ 1251 RelationalExpression: RelationalExpression{ 1252 ShiftExpression: ShiftExpression{ 1253 AdditiveExpression: AdditiveExpression{ 1254 MultiplicativeExpression: MultiplicativeExpression{ 1255 ExponentiationExpression: ExponentiationExpression{ 1256 UnaryExpression: UnaryExpression{ 1257 UpdateExpression: UpdateExpression{ 1258 LeftHandSideExpression: &LeftHandSideExpression{ 1259 NewExpression: &NewExpression{ 1260 MemberExpression: MemberExpression{ 1261 PrimaryExpression: &PrimaryExpression{ 1262 TemplateLiteral: template, 1263 Tokens: tks, 1264 }, 1265 Tokens: tks, 1266 }, 1267 Tokens: tks, 1268 }, 1269 Tokens: tks, 1270 }, 1271 Tokens: tks, 1272 }, 1273 Tokens: tks, 1274 }, 1275 Tokens: tks, 1276 }, 1277 Tokens: tks, 1278 }, 1279 Tokens: tks, 1280 }, 1281 Tokens: tks, 1282 }, 1283 Tokens: tks, 1284 }, 1285 Tokens: tks, 1286 }, 1287 Tokens: tks, 1288 }, 1289 Tokens: tks, 1290 }, 1291 Tokens: tks, 1292 }, 1293 BitwiseORExpression{ // 32 1294 BitwiseXORExpression: BitwiseXORExpression{ 1295 BitwiseANDExpression: BitwiseANDExpression{ 1296 EqualityExpression: EqualityExpression{ 1297 RelationalExpression: RelationalExpression{ 1298 ShiftExpression: ShiftExpression{ 1299 AdditiveExpression: AdditiveExpression{ 1300 MultiplicativeExpression: MultiplicativeExpression{ 1301 ExponentiationExpression: ExponentiationExpression{ 1302 UnaryExpression: UnaryExpression{ 1303 UpdateExpression: UpdateExpression{ 1304 LeftHandSideExpression: &LeftHandSideExpression{ 1305 NewExpression: &NewExpression{ 1306 MemberExpression: MemberExpression{ 1307 PrimaryExpression: &PrimaryExpression{ 1308 TemplateLiteral: template, 1309 Tokens: tks, 1310 }, 1311 Tokens: tks, 1312 }, 1313 Tokens: tks, 1314 }, 1315 Tokens: tks, 1316 }, 1317 Tokens: tks, 1318 }, 1319 Tokens: tks, 1320 }, 1321 Tokens: tks, 1322 }, 1323 Tokens: tks, 1324 }, 1325 Tokens: tks, 1326 }, 1327 Tokens: tks, 1328 }, 1329 Tokens: tks, 1330 }, 1331 Tokens: tks, 1332 }, 1333 Tokens: tks, 1334 }, 1335 Tokens: tks, 1336 }, 1337 Tokens: tks, 1338 }, 1339 &LogicalANDExpression{ // 33 1340 BitwiseORExpression: BitwiseORExpression{ 1341 BitwiseXORExpression: BitwiseXORExpression{ 1342 BitwiseANDExpression: BitwiseANDExpression{ 1343 EqualityExpression: EqualityExpression{ 1344 RelationalExpression: RelationalExpression{ 1345 ShiftExpression: ShiftExpression{ 1346 AdditiveExpression: AdditiveExpression{ 1347 MultiplicativeExpression: MultiplicativeExpression{ 1348 ExponentiationExpression: ExponentiationExpression{ 1349 UnaryExpression: UnaryExpression{ 1350 UpdateExpression: UpdateExpression{ 1351 LeftHandSideExpression: &LeftHandSideExpression{ 1352 NewExpression: &NewExpression{ 1353 MemberExpression: MemberExpression{ 1354 PrimaryExpression: &PrimaryExpression{ 1355 TemplateLiteral: template, 1356 Tokens: tks, 1357 }, 1358 Tokens: tks, 1359 }, 1360 Tokens: tks, 1361 }, 1362 Tokens: tks, 1363 }, 1364 Tokens: tks, 1365 }, 1366 Tokens: tks, 1367 }, 1368 Tokens: tks, 1369 }, 1370 Tokens: tks, 1371 }, 1372 Tokens: tks, 1373 }, 1374 Tokens: tks, 1375 }, 1376 Tokens: tks, 1377 }, 1378 Tokens: tks, 1379 }, 1380 Tokens: tks, 1381 }, 1382 Tokens: tks, 1383 }, 1384 Tokens: tks, 1385 }, 1386 Tokens: tks, 1387 }, 1388 &LogicalANDExpression{ // 34 1389 BitwiseORExpression: BitwiseORExpression{ 1390 BitwiseXORExpression: BitwiseXORExpression{ 1391 BitwiseANDExpression: BitwiseANDExpression{ 1392 EqualityExpression: EqualityExpression{ 1393 RelationalExpression: RelationalExpression{ 1394 ShiftExpression: ShiftExpression{ 1395 AdditiveExpression: AdditiveExpression{ 1396 MultiplicativeExpression: MultiplicativeExpression{ 1397 ExponentiationExpression: ExponentiationExpression{ 1398 UnaryExpression: UnaryExpression{ 1399 UpdateExpression: UpdateExpression{ 1400 LeftHandSideExpression: &LeftHandSideExpression{ 1401 NewExpression: &NewExpression{ 1402 MemberExpression: MemberExpression{ 1403 PrimaryExpression: &PrimaryExpression{ 1404 TemplateLiteral: template, 1405 Tokens: tks, 1406 }, 1407 Tokens: tks, 1408 }, 1409 Tokens: tks, 1410 }, 1411 Tokens: tks, 1412 }, 1413 Tokens: tks, 1414 }, 1415 Tokens: tks, 1416 }, 1417 Tokens: tks, 1418 }, 1419 Tokens: tks, 1420 }, 1421 Tokens: tks, 1422 }, 1423 Tokens: tks, 1424 }, 1425 Tokens: tks, 1426 }, 1427 Tokens: tks, 1428 }, 1429 Tokens: tks, 1430 }, 1431 Tokens: tks, 1432 }, 1433 Tokens: tks, 1434 }, 1435 Tokens: tks, 1436 }, 1437 &LogicalORExpression{ // 35 1438 LogicalANDExpression: LogicalANDExpression{ 1439 BitwiseORExpression: BitwiseORExpression{ 1440 BitwiseXORExpression: BitwiseXORExpression{ 1441 BitwiseANDExpression: BitwiseANDExpression{ 1442 EqualityExpression: EqualityExpression{ 1443 RelationalExpression: RelationalExpression{ 1444 ShiftExpression: ShiftExpression{ 1445 AdditiveExpression: AdditiveExpression{ 1446 MultiplicativeExpression: MultiplicativeExpression{ 1447 ExponentiationExpression: ExponentiationExpression{ 1448 UnaryExpression: UnaryExpression{ 1449 UpdateExpression: UpdateExpression{ 1450 LeftHandSideExpression: &LeftHandSideExpression{ 1451 NewExpression: &NewExpression{ 1452 MemberExpression: MemberExpression{ 1453 PrimaryExpression: &PrimaryExpression{ 1454 TemplateLiteral: template, 1455 Tokens: tks, 1456 }, 1457 Tokens: tks, 1458 }, 1459 Tokens: tks, 1460 }, 1461 Tokens: tks, 1462 }, 1463 Tokens: tks, 1464 }, 1465 Tokens: tks, 1466 }, 1467 Tokens: tks, 1468 }, 1469 Tokens: tks, 1470 }, 1471 Tokens: tks, 1472 }, 1473 Tokens: tks, 1474 }, 1475 Tokens: tks, 1476 }, 1477 Tokens: tks, 1478 }, 1479 Tokens: tks, 1480 }, 1481 Tokens: tks, 1482 }, 1483 Tokens: tks, 1484 }, 1485 Tokens: tks, 1486 }, 1487 Tokens: tks, 1488 }, 1489 LogicalORExpression{ // 36 1490 LogicalANDExpression: LogicalANDExpression{ 1491 BitwiseORExpression: BitwiseORExpression{ 1492 BitwiseXORExpression: BitwiseXORExpression{ 1493 BitwiseANDExpression: BitwiseANDExpression{ 1494 EqualityExpression: EqualityExpression{ 1495 RelationalExpression: RelationalExpression{ 1496 ShiftExpression: ShiftExpression{ 1497 AdditiveExpression: AdditiveExpression{ 1498 MultiplicativeExpression: MultiplicativeExpression{ 1499 ExponentiationExpression: ExponentiationExpression{ 1500 UnaryExpression: UnaryExpression{ 1501 UpdateExpression: UpdateExpression{ 1502 LeftHandSideExpression: &LeftHandSideExpression{ 1503 NewExpression: &NewExpression{ 1504 MemberExpression: MemberExpression{ 1505 PrimaryExpression: &PrimaryExpression{ 1506 TemplateLiteral: template, 1507 Tokens: tks, 1508 }, 1509 Tokens: tks, 1510 }, 1511 Tokens: tks, 1512 }, 1513 Tokens: tks, 1514 }, 1515 Tokens: tks, 1516 }, 1517 Tokens: tks, 1518 }, 1519 Tokens: tks, 1520 }, 1521 Tokens: tks, 1522 }, 1523 Tokens: tks, 1524 }, 1525 Tokens: tks, 1526 }, 1527 Tokens: tks, 1528 }, 1529 Tokens: tks, 1530 }, 1531 Tokens: tks, 1532 }, 1533 Tokens: tks, 1534 }, 1535 Tokens: tks, 1536 }, 1537 Tokens: tks, 1538 }, 1539 Tokens: tks, 1540 }, 1541 &ConditionalExpression{ // 37 1542 LogicalORExpression: &LogicalORExpression{ 1543 LogicalANDExpression: LogicalANDExpression{ 1544 BitwiseORExpression: BitwiseORExpression{ 1545 BitwiseXORExpression: BitwiseXORExpression{ 1546 BitwiseANDExpression: BitwiseANDExpression{ 1547 EqualityExpression: EqualityExpression{ 1548 RelationalExpression: RelationalExpression{ 1549 ShiftExpression: ShiftExpression{ 1550 AdditiveExpression: AdditiveExpression{ 1551 MultiplicativeExpression: MultiplicativeExpression{ 1552 ExponentiationExpression: ExponentiationExpression{ 1553 UnaryExpression: UnaryExpression{ 1554 UpdateExpression: UpdateExpression{ 1555 LeftHandSideExpression: &LeftHandSideExpression{ 1556 NewExpression: &NewExpression{ 1557 MemberExpression: MemberExpression{ 1558 PrimaryExpression: &PrimaryExpression{ 1559 TemplateLiteral: template, 1560 Tokens: tks, 1561 }, 1562 Tokens: tks, 1563 }, 1564 Tokens: tks, 1565 }, 1566 Tokens: tks, 1567 }, 1568 Tokens: tks, 1569 }, 1570 Tokens: tks, 1571 }, 1572 Tokens: tks, 1573 }, 1574 Tokens: tks, 1575 }, 1576 Tokens: tks, 1577 }, 1578 Tokens: tks, 1579 }, 1580 Tokens: tks, 1581 }, 1582 Tokens: tks, 1583 }, 1584 Tokens: tks, 1585 }, 1586 Tokens: tks, 1587 }, 1588 Tokens: tks, 1589 }, 1590 Tokens: tks, 1591 }, 1592 Tokens: tks, 1593 }, 1594 Tokens: tks, 1595 }, 1596 ConditionalExpression{ // 38 1597 LogicalORExpression: &LogicalORExpression{ 1598 LogicalANDExpression: LogicalANDExpression{ 1599 BitwiseORExpression: BitwiseORExpression{ 1600 BitwiseXORExpression: BitwiseXORExpression{ 1601 BitwiseANDExpression: BitwiseANDExpression{ 1602 EqualityExpression: EqualityExpression{ 1603 RelationalExpression: RelationalExpression{ 1604 ShiftExpression: ShiftExpression{ 1605 AdditiveExpression: AdditiveExpression{ 1606 MultiplicativeExpression: MultiplicativeExpression{ 1607 ExponentiationExpression: ExponentiationExpression{ 1608 UnaryExpression: UnaryExpression{ 1609 UpdateExpression: UpdateExpression{ 1610 LeftHandSideExpression: &LeftHandSideExpression{ 1611 NewExpression: &NewExpression{ 1612 MemberExpression: MemberExpression{ 1613 PrimaryExpression: &PrimaryExpression{ 1614 TemplateLiteral: template, 1615 Tokens: tks, 1616 }, 1617 Tokens: tks, 1618 }, 1619 Tokens: tks, 1620 }, 1621 Tokens: tks, 1622 }, 1623 Tokens: tks, 1624 }, 1625 Tokens: tks, 1626 }, 1627 Tokens: tks, 1628 }, 1629 Tokens: tks, 1630 }, 1631 Tokens: tks, 1632 }, 1633 Tokens: tks, 1634 }, 1635 Tokens: tks, 1636 }, 1637 Tokens: tks, 1638 }, 1639 Tokens: tks, 1640 }, 1641 Tokens: tks, 1642 }, 1643 Tokens: tks, 1644 }, 1645 Tokens: tks, 1646 }, 1647 Tokens: tks, 1648 }, 1649 Tokens: tks, 1650 }, 1651 } { 1652 if output := WrapConditional(test); !reflect.DeepEqual(output, &expectedOutput) { 1653 t.Errorf("test %d: expecting\n%v\n...got...\n%v", n+1, expectedOutput, output) 1654 } 1655 } 1656 } 1657 1658 func TestWrapConditionalExtra(t *testing.T) { 1659 arrayTokens := Tokens{ 1660 { 1661 Token: parser.Token{ 1662 Type: TokenPunctuator, 1663 Data: "[", 1664 }, 1665 }, 1666 { 1667 Token: parser.Token{ 1668 Type: TokenIdentifier, 1669 Data: "a", 1670 }, 1671 }, 1672 { 1673 Token: parser.Token{ 1674 Type: TokenPunctuator, 1675 Data: "]", 1676 }, 1677 }, 1678 } 1679 arrayLiteral := &ArrayLiteral{ 1680 ElementList: []ArrayElement{ 1681 { 1682 AssignmentExpression: AssignmentExpression{ 1683 ConditionalExpression: WrapConditional(&PrimaryExpression{ 1684 IdentifierReference: &arrayTokens[1], 1685 Tokens: arrayTokens[1:2], 1686 }), 1687 Tokens: arrayTokens[1:2], 1688 }, 1689 Tokens: arrayTokens[1:2], 1690 }, 1691 }, 1692 Tokens: arrayTokens, 1693 } 1694 objectTokens := Tokens{ 1695 { 1696 Token: parser.Token{ 1697 Type: TokenPunctuator, 1698 Data: "{", 1699 }, 1700 }, 1701 { 1702 Token: parser.Token{ 1703 Type: TokenPunctuator, 1704 Data: "...", 1705 }, 1706 }, 1707 { 1708 Token: parser.Token{ 1709 Type: TokenIdentifier, 1710 Data: "a", 1711 }, 1712 }, 1713 { 1714 Token: parser.Token{ 1715 Type: TokenRightBracePunctuator, 1716 Data: "}", 1717 }, 1718 }, 1719 } 1720 objectLiteral := &ObjectLiteral{ 1721 PropertyDefinitionList: []PropertyDefinition{ 1722 { 1723 AssignmentExpression: &AssignmentExpression{ 1724 ConditionalExpression: WrapConditional(&PrimaryExpression{ 1725 IdentifierReference: &arrayTokens[2], 1726 Tokens: arrayTokens[2:3], 1727 }), 1728 Tokens: arrayTokens[2:3], 1729 }, 1730 Tokens: arrayTokens[2:3], 1731 }, 1732 }, 1733 Tokens: objectTokens, 1734 } 1735 functionTokens := Tokens{ 1736 { 1737 Token: parser.Token{ 1738 Type: TokenKeyword, 1739 Data: "function", 1740 }, 1741 }, 1742 { 1743 Token: parser.Token{ 1744 Type: TokenPunctuator, 1745 Data: "(", 1746 }, 1747 }, 1748 { 1749 Token: parser.Token{ 1750 Type: TokenPunctuator, 1751 Data: ")", 1752 }, 1753 }, 1754 { 1755 Token: parser.Token{ 1756 Type: TokenPunctuator, 1757 Data: "{", 1758 }, 1759 }, 1760 { 1761 Token: parser.Token{ 1762 Type: TokenRightBracePunctuator, 1763 Data: "}", 1764 }, 1765 }, 1766 } 1767 functionDeclaration := &FunctionDeclaration{ 1768 FormalParameters: FormalParameters{ 1769 Tokens: functionTokens[1:3], 1770 }, 1771 FunctionBody: Block{ 1772 Tokens: functionTokens[3:5], 1773 }, 1774 Tokens: functionTokens, 1775 } 1776 classTokens := Tokens{ 1777 { 1778 Token: parser.Token{ 1779 Type: TokenKeyword, 1780 Data: "class", 1781 }, 1782 }, 1783 { 1784 Token: parser.Token{ 1785 Type: TokenPunctuator, 1786 Data: "{", 1787 }, 1788 }, 1789 { 1790 Token: parser.Token{ 1791 Type: TokenRightBracePunctuator, 1792 Data: "}", 1793 }, 1794 }, 1795 } 1796 classDeclaration := &ClassDeclaration{ 1797 Tokens: classTokens, 1798 } 1799 parenthesizedTokens := Tokens{ 1800 { 1801 Token: parser.Token{ 1802 Type: TokenPunctuator, 1803 Data: "(", 1804 }, 1805 }, 1806 { 1807 Token: parser.Token{ 1808 Type: TokenIdentifier, 1809 Data: "a", 1810 }, 1811 }, 1812 { 1813 Token: parser.Token{ 1814 Type: TokenPunctuator, 1815 Data: ")", 1816 }, 1817 }, 1818 } 1819 parenthesizedExpression := &ParenthesizedExpression{ 1820 Expressions: []AssignmentExpression{ 1821 { 1822 ConditionalExpression: WrapConditional(&PrimaryExpression{ 1823 IdentifierReference: &arrayTokens[1], 1824 Tokens: parenthesizedTokens[1:2], 1825 }), 1826 Tokens: parenthesizedTokens[1:2], 1827 }, 1828 }, 1829 Tokens: parenthesizedTokens, 1830 } 1831 callTokens := Tokens{ 1832 { 1833 Token: parser.Token{ 1834 Type: TokenIdentifier, 1835 Data: "a", 1836 }, 1837 }, 1838 { 1839 Token: parser.Token{ 1840 Type: TokenPunctuator, 1841 Data: "(", 1842 }, 1843 }, 1844 { 1845 Token: parser.Token{ 1846 Type: TokenIdentifier, 1847 Data: "b", 1848 }, 1849 }, 1850 { 1851 Token: parser.Token{ 1852 Type: TokenPunctuator, 1853 Data: ")", 1854 }, 1855 }, 1856 } 1857 callExpression := &CallExpression{ 1858 CallExpression: &CallExpression{ 1859 MemberExpression: &MemberExpression{ 1860 PrimaryExpression: &PrimaryExpression{ 1861 IdentifierReference: &callTokens[0], 1862 Tokens: callTokens[:1], 1863 }, 1864 Tokens: callTokens[:1], 1865 }, 1866 Tokens: callTokens[:1], 1867 }, 1868 Arguments: &Arguments{ 1869 ArgumentList: []Argument{ 1870 { 1871 AssignmentExpression: AssignmentExpression{ 1872 ConditionalExpression: WrapConditional(&PrimaryExpression{ 1873 IdentifierReference: &callTokens[2], 1874 Tokens: callTokens[2:3], 1875 }), 1876 Tokens: callTokens[2:3], 1877 }, 1878 Tokens: callTokens[2:3], 1879 }, 1880 }, 1881 Tokens: callTokens[1:4], 1882 }, 1883 Tokens: callTokens[:4], 1884 } 1885 optionalTokens := Tokens{ 1886 { 1887 Token: parser.Token{ 1888 Type: TokenIdentifier, 1889 Data: "a", 1890 }, 1891 }, 1892 { 1893 Token: parser.Token{ 1894 Type: TokenPunctuator, 1895 Data: "?.", 1896 }, 1897 }, 1898 { 1899 Token: parser.Token{ 1900 Type: TokenIdentifier, 1901 Data: "b", 1902 }, 1903 }, 1904 } 1905 optionalExpression := &OptionalExpression{ 1906 OptionalExpression: &OptionalExpression{ 1907 MemberExpression: &MemberExpression{ 1908 PrimaryExpression: &PrimaryExpression{ 1909 IdentifierReference: &optionalTokens[0], 1910 Tokens: optionalTokens[:1], 1911 }, 1912 Tokens: optionalTokens[:1], 1913 }, 1914 Tokens: optionalTokens[:1], 1915 }, 1916 OptionalChain: OptionalChain{ 1917 IdentifierName: &optionalTokens[2], 1918 Tokens: optionalTokens[2:3], 1919 }, 1920 Tokens: optionalTokens[:3], 1921 } 1922 1923 for n, test := range [...]struct { 1924 inner ConditionalWrappable 1925 outer ConditionalWrappable 1926 }{ 1927 { // 1 1928 arrayLiteral, 1929 &PrimaryExpression{ 1930 ArrayLiteral: arrayLiteral, 1931 Tokens: arrayTokens, 1932 }, 1933 }, 1934 { // 2 1935 *arrayLiteral, 1936 &PrimaryExpression{ 1937 ArrayLiteral: arrayLiteral, 1938 Tokens: arrayTokens, 1939 }, 1940 }, 1941 { // 3 1942 objectLiteral, 1943 &PrimaryExpression{ 1944 ObjectLiteral: objectLiteral, 1945 Tokens: objectTokens, 1946 }, 1947 }, 1948 { // 4 1949 *objectLiteral, 1950 &PrimaryExpression{ 1951 ObjectLiteral: objectLiteral, 1952 Tokens: objectTokens, 1953 }, 1954 }, 1955 { // 5 1956 functionDeclaration, 1957 &PrimaryExpression{ 1958 FunctionExpression: functionDeclaration, 1959 Tokens: functionTokens, 1960 }, 1961 }, 1962 { // 6 1963 *functionDeclaration, 1964 &PrimaryExpression{ 1965 FunctionExpression: functionDeclaration, 1966 Tokens: functionTokens, 1967 }, 1968 }, 1969 { // 7 1970 classDeclaration, 1971 &PrimaryExpression{ 1972 ClassExpression: classDeclaration, 1973 Tokens: classTokens, 1974 }, 1975 }, 1976 { // 8 1977 *classDeclaration, 1978 &PrimaryExpression{ 1979 ClassExpression: classDeclaration, 1980 Tokens: classTokens, 1981 }, 1982 }, 1983 { // 9 1984 parenthesizedExpression, 1985 &PrimaryExpression{ 1986 ParenthesizedExpression: parenthesizedExpression, 1987 Tokens: parenthesizedTokens, 1988 }, 1989 }, 1990 { // 10 1991 *parenthesizedExpression, 1992 &PrimaryExpression{ 1993 ParenthesizedExpression: parenthesizedExpression, 1994 Tokens: parenthesizedTokens, 1995 }, 1996 }, 1997 { // 11 1998 callExpression, 1999 &LeftHandSideExpression{ 2000 CallExpression: callExpression, 2001 Tokens: callTokens, 2002 }, 2003 }, 2004 { // 12 2005 *callExpression, 2006 &LeftHandSideExpression{ 2007 CallExpression: callExpression, 2008 Tokens: callTokens, 2009 }, 2010 }, 2011 { // 13 2012 optionalExpression, 2013 &LeftHandSideExpression{ 2014 OptionalExpression: optionalExpression, 2015 Tokens: optionalTokens, 2016 }, 2017 }, 2018 { // 14 2019 *optionalExpression, 2020 &LeftHandSideExpression{ 2021 OptionalExpression: optionalExpression, 2022 Tokens: optionalTokens, 2023 }, 2024 }, 2025 } { 2026 if output, expectedOutput := WrapConditional(test.inner), WrapConditional(test.outer); !reflect.DeepEqual(output, expectedOutput) { 2027 t.Errorf("test %d: expecting\n%v\n...got...\n%v", n+1, expectedOutput, output) 2028 } 2029 } 2030 } 2031 2032 func TestUnwrapConditional(t *testing.T) { 2033 tks := Tokens{ 2034 { 2035 Token: parser.Token{ 2036 Type: TokenIdentifier, 2037 Data: "a", 2038 }, 2039 }, 2040 { 2041 Token: parser.Token{ 2042 Type: TokenIdentifier, 2043 Data: "b", 2044 }, 2045 }, 2046 } 2047 identA := &tks[0] 2048 identB := &tks[1] 2049 2050 for n, test := range [...]ConditionalWrappable{ 2051 &ParenthesizedExpression{ // 1 2052 Expressions: []AssignmentExpression{ 2053 { 2054 ConditionalExpression: WrapConditional(&PrimaryExpression{ 2055 IdentifierReference: identA, 2056 Tokens: tks[:1], 2057 }), 2058 Tokens: tks[:1], 2059 }, 2060 }, 2061 Tokens: tks[:1], 2062 }, 2063 &TemplateLiteral{ // 2 2064 NoSubstitutionTemplate: identA, 2065 Tokens: tks[:1], 2066 }, 2067 &ClassDeclaration{ // 3 2068 BindingIdentifier: identA, 2069 Tokens: tks[:1], 2070 }, 2071 &FunctionDeclaration{ // 4 2072 BindingIdentifier: identA, 2073 Tokens: tks[:1], 2074 }, 2075 &ObjectLiteral{ // 5 2076 PropertyDefinitionList: []PropertyDefinition{ 2077 { 2078 AssignmentExpression: &AssignmentExpression{ 2079 ConditionalExpression: WrapConditional(&PrimaryExpression{ 2080 IdentifierReference: identA, 2081 Tokens: tks[:1], 2082 }), 2083 Tokens: tks[:1], 2084 }, 2085 Tokens: tks[:1], 2086 }, 2087 }, 2088 Tokens: tks[:1], 2089 }, 2090 &ArrayLiteral{ // 6 2091 ElementList: []ArrayElement{ 2092 { 2093 AssignmentExpression: AssignmentExpression{ 2094 ConditionalExpression: WrapConditional(&PrimaryExpression{ 2095 IdentifierReference: identA, 2096 Tokens: tks[:1], 2097 }), 2098 Tokens: tks[:1], 2099 }, 2100 Tokens: tks[:1], 2101 }, 2102 }, 2103 Tokens: tks[:1], 2104 }, 2105 &PrimaryExpression{ // 7 2106 IdentifierReference: identA, 2107 Tokens: tks[:1], 2108 }, 2109 &MemberExpression{ // 8 2110 MemberExpression: &MemberExpression{ 2111 PrimaryExpression: &PrimaryExpression{ 2112 IdentifierReference: identA, 2113 Tokens: tks[:1], 2114 }, 2115 }, 2116 IdentifierName: identB, 2117 Tokens: tks, 2118 }, 2119 &NewExpression{ // 9 2120 News: []Comments{nil}, 2121 MemberExpression: MemberExpression{ 2122 PrimaryExpression: &PrimaryExpression{ 2123 IdentifierReference: identA, 2124 Tokens: tks[:1], 2125 }, 2126 Tokens: tks[:1], 2127 }, 2128 Tokens: tks[:1], 2129 }, 2130 &CallExpression{ // 10 2131 CallExpression: &CallExpression{ 2132 MemberExpression: &MemberExpression{ 2133 PrimaryExpression: &PrimaryExpression{ 2134 IdentifierReference: identA, 2135 Tokens: tks[:1], 2136 }, 2137 }, 2138 Tokens: tks[:1], 2139 }, 2140 Arguments: &Arguments{ 2141 ArgumentList: []Argument{ 2142 { 2143 AssignmentExpression: AssignmentExpression{ 2144 ConditionalExpression: WrapConditional(&PrimaryExpression{ 2145 IdentifierReference: identB, 2146 Tokens: tks[1:2], 2147 }), 2148 Tokens: tks[1:2], 2149 }, 2150 Tokens: tks[1:2], 2151 }, 2152 }, 2153 Tokens: tks[1:2], 2154 }, 2155 Tokens: tks[:2], 2156 }, 2157 &OptionalExpression{ // 11 2158 OptionalExpression: &OptionalExpression{ 2159 MemberExpression: &MemberExpression{ 2160 PrimaryExpression: &PrimaryExpression{ 2161 IdentifierReference: identA, 2162 Tokens: tks[:1], 2163 }, 2164 }, 2165 Tokens: tks[:1], 2166 }, 2167 OptionalChain: OptionalChain{ 2168 IdentifierName: identB, 2169 Tokens: tks[1:2], 2170 }, 2171 Tokens: tks[:2], 2172 }, 2173 &UpdateExpression{ // 12 2174 UpdateOperator: UpdatePostIncrement, 2175 UnaryExpression: &UnaryExpression{ 2176 UpdateExpression: UpdateExpression{ 2177 LeftHandSideExpression: &LeftHandSideExpression{ 2178 NewExpression: &NewExpression{ 2179 MemberExpression: MemberExpression{ 2180 PrimaryExpression: &PrimaryExpression{ 2181 IdentifierReference: identA, 2182 Tokens: tks[:1], 2183 }, 2184 Tokens: tks[:1], 2185 }, 2186 Tokens: tks[:1], 2187 }, 2188 Tokens: tks[:1], 2189 }, 2190 Tokens: tks[:1], 2191 }, 2192 Tokens: tks[:1], 2193 }, 2194 Tokens: tks[:1], 2195 }, 2196 &UnaryExpression{ // 13 2197 UnaryOperators: []UnaryOperatorComments{{UnaryOperator: UnaryVoid}}, 2198 UpdateExpression: UpdateExpression{ 2199 LeftHandSideExpression: &LeftHandSideExpression{ 2200 NewExpression: &NewExpression{ 2201 MemberExpression: MemberExpression{ 2202 PrimaryExpression: &PrimaryExpression{ 2203 IdentifierReference: identA, 2204 Tokens: tks[:1], 2205 }, 2206 Tokens: tks[:1], 2207 }, 2208 Tokens: tks[:1], 2209 }, 2210 Tokens: tks[:1], 2211 }, 2212 Tokens: tks[:1], 2213 }, 2214 Tokens: tks[:1], 2215 }, 2216 &ExponentiationExpression{ // 14 2217 ExponentiationExpression: &ExponentiationExpression{ 2218 UnaryExpression: UnaryExpression{ 2219 UpdateExpression: UpdateExpression{ 2220 LeftHandSideExpression: &LeftHandSideExpression{ 2221 NewExpression: &NewExpression{ 2222 MemberExpression: MemberExpression{ 2223 PrimaryExpression: &PrimaryExpression{ 2224 IdentifierReference: identA, 2225 Tokens: tks[:1], 2226 }, 2227 Tokens: tks[:1], 2228 }, 2229 Tokens: tks[:1], 2230 }, 2231 Tokens: tks[:1], 2232 }, 2233 Tokens: tks[:1], 2234 }, 2235 Tokens: tks[:1], 2236 }, 2237 Tokens: tks[:1], 2238 }, 2239 UnaryExpression: UnaryExpression{ 2240 UpdateExpression: UpdateExpression{ 2241 LeftHandSideExpression: &LeftHandSideExpression{ 2242 NewExpression: &NewExpression{ 2243 MemberExpression: MemberExpression{ 2244 PrimaryExpression: &PrimaryExpression{ 2245 IdentifierReference: identB, 2246 Tokens: tks[1:2], 2247 }, 2248 Tokens: tks[1:2], 2249 }, 2250 Tokens: tks[1:2], 2251 }, 2252 Tokens: tks[1:2], 2253 }, 2254 Tokens: tks[1:2], 2255 }, 2256 Tokens: tks[1:2], 2257 }, 2258 Tokens: tks[:2], 2259 }, 2260 &MultiplicativeExpression{ // 15 2261 MultiplicativeExpression: &MultiplicativeExpression{ 2262 ExponentiationExpression: ExponentiationExpression{ 2263 UnaryExpression: UnaryExpression{ 2264 UpdateExpression: UpdateExpression{ 2265 LeftHandSideExpression: &LeftHandSideExpression{ 2266 NewExpression: &NewExpression{ 2267 MemberExpression: MemberExpression{ 2268 PrimaryExpression: &PrimaryExpression{ 2269 IdentifierReference: identA, 2270 Tokens: tks[:1], 2271 }, 2272 Tokens: tks[:1], 2273 }, 2274 Tokens: tks[:1], 2275 }, 2276 Tokens: tks[:1], 2277 }, 2278 Tokens: tks[:1], 2279 }, 2280 Tokens: tks[:1], 2281 }, 2282 Tokens: tks[:1], 2283 }, 2284 Tokens: tks[:1], 2285 }, 2286 ExponentiationExpression: ExponentiationExpression{ 2287 UnaryExpression: UnaryExpression{ 2288 UpdateExpression: UpdateExpression{ 2289 LeftHandSideExpression: &LeftHandSideExpression{ 2290 NewExpression: &NewExpression{ 2291 MemberExpression: MemberExpression{ 2292 PrimaryExpression: &PrimaryExpression{ 2293 IdentifierReference: identB, 2294 Tokens: tks[1:2], 2295 }, 2296 Tokens: tks[1:2], 2297 }, 2298 Tokens: tks[1:2], 2299 }, 2300 Tokens: tks[1:2], 2301 }, 2302 Tokens: tks[1:2], 2303 }, 2304 Tokens: tks[1:2], 2305 }, 2306 Tokens: tks[1:2], 2307 }, 2308 Tokens: tks[:2], 2309 }, 2310 &AdditiveExpression{ // 16 2311 AdditiveExpression: &AdditiveExpression{ 2312 MultiplicativeExpression: MultiplicativeExpression{ 2313 ExponentiationExpression: ExponentiationExpression{ 2314 UnaryExpression: UnaryExpression{ 2315 UpdateExpression: UpdateExpression{ 2316 LeftHandSideExpression: &LeftHandSideExpression{ 2317 NewExpression: &NewExpression{ 2318 MemberExpression: MemberExpression{ 2319 PrimaryExpression: &PrimaryExpression{ 2320 IdentifierReference: identA, 2321 Tokens: tks[:1], 2322 }, 2323 Tokens: tks[:1], 2324 }, 2325 Tokens: tks[:1], 2326 }, 2327 Tokens: tks[:1], 2328 }, 2329 Tokens: tks[:1], 2330 }, 2331 Tokens: tks[:1], 2332 }, 2333 Tokens: tks[:1], 2334 }, 2335 Tokens: tks[:1], 2336 }, 2337 Tokens: tks[:1], 2338 }, 2339 MultiplicativeExpression: MultiplicativeExpression{ 2340 ExponentiationExpression: ExponentiationExpression{ 2341 UnaryExpression: UnaryExpression{ 2342 UpdateExpression: UpdateExpression{ 2343 LeftHandSideExpression: &LeftHandSideExpression{ 2344 NewExpression: &NewExpression{ 2345 MemberExpression: MemberExpression{ 2346 PrimaryExpression: &PrimaryExpression{ 2347 IdentifierReference: identB, 2348 Tokens: tks[1:2], 2349 }, 2350 Tokens: tks[1:2], 2351 }, 2352 Tokens: tks[1:2], 2353 }, 2354 Tokens: tks[1:2], 2355 }, 2356 Tokens: tks[1:2], 2357 }, 2358 Tokens: tks[1:2], 2359 }, 2360 Tokens: tks[1:2], 2361 }, 2362 Tokens: tks[1:2], 2363 }, 2364 Tokens: tks[:2], 2365 }, 2366 &ShiftExpression{ // 17 2367 ShiftExpression: &ShiftExpression{ 2368 AdditiveExpression: AdditiveExpression{ 2369 MultiplicativeExpression: MultiplicativeExpression{ 2370 ExponentiationExpression: ExponentiationExpression{ 2371 UnaryExpression: UnaryExpression{ 2372 UpdateExpression: UpdateExpression{ 2373 LeftHandSideExpression: &LeftHandSideExpression{ 2374 NewExpression: &NewExpression{ 2375 MemberExpression: MemberExpression{ 2376 PrimaryExpression: &PrimaryExpression{ 2377 IdentifierReference: identA, 2378 Tokens: tks[:1], 2379 }, 2380 Tokens: tks[:1], 2381 }, 2382 Tokens: tks[:1], 2383 }, 2384 Tokens: tks[:1], 2385 }, 2386 Tokens: tks[:1], 2387 }, 2388 Tokens: tks[:1], 2389 }, 2390 Tokens: tks[:1], 2391 }, 2392 Tokens: tks[:1], 2393 }, 2394 Tokens: tks[:1], 2395 }, 2396 Tokens: tks[:1], 2397 }, 2398 AdditiveExpression: AdditiveExpression{ 2399 MultiplicativeExpression: MultiplicativeExpression{ 2400 ExponentiationExpression: ExponentiationExpression{ 2401 UnaryExpression: UnaryExpression{ 2402 UpdateExpression: UpdateExpression{ 2403 LeftHandSideExpression: &LeftHandSideExpression{ 2404 NewExpression: &NewExpression{ 2405 MemberExpression: MemberExpression{ 2406 PrimaryExpression: &PrimaryExpression{ 2407 IdentifierReference: identB, 2408 Tokens: tks[1:2], 2409 }, 2410 Tokens: tks[1:2], 2411 }, 2412 Tokens: tks[1:2], 2413 }, 2414 Tokens: tks[1:2], 2415 }, 2416 Tokens: tks[1:2], 2417 }, 2418 Tokens: tks[1:2], 2419 }, 2420 Tokens: tks[1:2], 2421 }, 2422 Tokens: tks[1:2], 2423 }, 2424 Tokens: tks[1:2], 2425 }, 2426 Tokens: tks[:2], 2427 }, 2428 &RelationalExpression{ // 18 2429 RelationalExpression: &RelationalExpression{ 2430 ShiftExpression: ShiftExpression{ 2431 AdditiveExpression: AdditiveExpression{ 2432 MultiplicativeExpression: MultiplicativeExpression{ 2433 ExponentiationExpression: ExponentiationExpression{ 2434 UnaryExpression: UnaryExpression{ 2435 UpdateExpression: UpdateExpression{ 2436 LeftHandSideExpression: &LeftHandSideExpression{ 2437 NewExpression: &NewExpression{ 2438 MemberExpression: MemberExpression{ 2439 PrimaryExpression: &PrimaryExpression{ 2440 IdentifierReference: identA, 2441 Tokens: tks[:1], 2442 }, 2443 Tokens: tks[:1], 2444 }, 2445 Tokens: tks[:1], 2446 }, 2447 Tokens: tks[:1], 2448 }, 2449 Tokens: tks[:1], 2450 }, 2451 Tokens: tks[:1], 2452 }, 2453 Tokens: tks[:1], 2454 }, 2455 Tokens: tks[:1], 2456 }, 2457 Tokens: tks[:1], 2458 }, 2459 Tokens: tks[:1], 2460 }, 2461 Tokens: tks[:1], 2462 }, 2463 ShiftExpression: ShiftExpression{ 2464 AdditiveExpression: AdditiveExpression{ 2465 MultiplicativeExpression: MultiplicativeExpression{ 2466 ExponentiationExpression: ExponentiationExpression{ 2467 UnaryExpression: UnaryExpression{ 2468 UpdateExpression: UpdateExpression{ 2469 LeftHandSideExpression: &LeftHandSideExpression{ 2470 NewExpression: &NewExpression{ 2471 MemberExpression: MemberExpression{ 2472 PrimaryExpression: &PrimaryExpression{ 2473 IdentifierReference: identB, 2474 Tokens: tks[1:2], 2475 }, 2476 Tokens: tks[1:2], 2477 }, 2478 Tokens: tks[1:2], 2479 }, 2480 Tokens: tks[1:2], 2481 }, 2482 Tokens: tks[1:2], 2483 }, 2484 Tokens: tks[1:2], 2485 }, 2486 Tokens: tks[1:2], 2487 }, 2488 Tokens: tks[1:2], 2489 }, 2490 Tokens: tks[1:2], 2491 }, 2492 Tokens: tks[1:2], 2493 }, 2494 Tokens: tks[:2], 2495 }, 2496 &EqualityExpression{ // 19 2497 EqualityExpression: &EqualityExpression{ 2498 RelationalExpression: RelationalExpression{ 2499 ShiftExpression: ShiftExpression{ 2500 AdditiveExpression: AdditiveExpression{ 2501 MultiplicativeExpression: MultiplicativeExpression{ 2502 ExponentiationExpression: ExponentiationExpression{ 2503 UnaryExpression: UnaryExpression{ 2504 UpdateExpression: UpdateExpression{ 2505 LeftHandSideExpression: &LeftHandSideExpression{ 2506 NewExpression: &NewExpression{ 2507 MemberExpression: MemberExpression{ 2508 PrimaryExpression: &PrimaryExpression{ 2509 IdentifierReference: identA, 2510 Tokens: tks[:1], 2511 }, 2512 Tokens: tks[:1], 2513 }, 2514 Tokens: tks[:1], 2515 }, 2516 Tokens: tks[:1], 2517 }, 2518 Tokens: tks[:1], 2519 }, 2520 Tokens: tks[:1], 2521 }, 2522 Tokens: tks[:1], 2523 }, 2524 Tokens: tks[:1], 2525 }, 2526 Tokens: tks[:1], 2527 }, 2528 Tokens: tks[:1], 2529 }, 2530 Tokens: tks[:1], 2531 }, 2532 Tokens: tks[:1], 2533 }, 2534 RelationalExpression: RelationalExpression{ 2535 ShiftExpression: ShiftExpression{ 2536 AdditiveExpression: AdditiveExpression{ 2537 MultiplicativeExpression: MultiplicativeExpression{ 2538 ExponentiationExpression: ExponentiationExpression{ 2539 UnaryExpression: UnaryExpression{ 2540 UpdateExpression: UpdateExpression{ 2541 LeftHandSideExpression: &LeftHandSideExpression{ 2542 NewExpression: &NewExpression{ 2543 MemberExpression: MemberExpression{ 2544 PrimaryExpression: &PrimaryExpression{ 2545 IdentifierReference: identB, 2546 Tokens: tks[1:2], 2547 }, 2548 Tokens: tks[1:2], 2549 }, 2550 Tokens: tks[1:2], 2551 }, 2552 Tokens: tks[1:2], 2553 }, 2554 Tokens: tks[1:2], 2555 }, 2556 Tokens: tks[1:2], 2557 }, 2558 Tokens: tks[1:2], 2559 }, 2560 Tokens: tks[1:2], 2561 }, 2562 Tokens: tks[1:2], 2563 }, 2564 Tokens: tks[1:2], 2565 }, 2566 Tokens: tks[1:2], 2567 }, 2568 Tokens: tks[:2], 2569 }, 2570 &BitwiseANDExpression{ // 20 2571 BitwiseANDExpression: &BitwiseANDExpression{ 2572 EqualityExpression: EqualityExpression{ 2573 RelationalExpression: RelationalExpression{ 2574 ShiftExpression: ShiftExpression{ 2575 AdditiveExpression: AdditiveExpression{ 2576 MultiplicativeExpression: MultiplicativeExpression{ 2577 ExponentiationExpression: ExponentiationExpression{ 2578 UnaryExpression: UnaryExpression{ 2579 UpdateExpression: UpdateExpression{ 2580 LeftHandSideExpression: &LeftHandSideExpression{ 2581 NewExpression: &NewExpression{ 2582 MemberExpression: MemberExpression{ 2583 PrimaryExpression: &PrimaryExpression{ 2584 IdentifierReference: identA, 2585 Tokens: tks[:1], 2586 }, 2587 Tokens: tks[:1], 2588 }, 2589 Tokens: tks[:1], 2590 }, 2591 Tokens: tks[:1], 2592 }, 2593 Tokens: tks[:1], 2594 }, 2595 Tokens: tks[:1], 2596 }, 2597 Tokens: tks[:1], 2598 }, 2599 Tokens: tks[:1], 2600 }, 2601 Tokens: tks[:1], 2602 }, 2603 Tokens: tks[:1], 2604 }, 2605 Tokens: tks[:1], 2606 }, 2607 Tokens: tks[:1], 2608 }, 2609 Tokens: tks[:1], 2610 }, 2611 EqualityExpression: EqualityExpression{ 2612 RelationalExpression: RelationalExpression{ 2613 ShiftExpression: ShiftExpression{ 2614 AdditiveExpression: AdditiveExpression{ 2615 MultiplicativeExpression: MultiplicativeExpression{ 2616 ExponentiationExpression: ExponentiationExpression{ 2617 UnaryExpression: UnaryExpression{ 2618 UpdateExpression: UpdateExpression{ 2619 LeftHandSideExpression: &LeftHandSideExpression{ 2620 NewExpression: &NewExpression{ 2621 MemberExpression: MemberExpression{ 2622 PrimaryExpression: &PrimaryExpression{ 2623 IdentifierReference: identB, 2624 Tokens: tks[1:2], 2625 }, 2626 Tokens: tks[1:2], 2627 }, 2628 Tokens: tks[1:2], 2629 }, 2630 Tokens: tks[1:2], 2631 }, 2632 Tokens: tks[1:2], 2633 }, 2634 Tokens: tks[1:2], 2635 }, 2636 Tokens: tks[1:2], 2637 }, 2638 Tokens: tks[1:2], 2639 }, 2640 Tokens: tks[1:2], 2641 }, 2642 Tokens: tks[1:2], 2643 }, 2644 Tokens: tks[1:2], 2645 }, 2646 Tokens: tks[1:2], 2647 }, 2648 Tokens: tks[:2], 2649 }, 2650 &BitwiseXORExpression{ // 21 2651 BitwiseXORExpression: &BitwiseXORExpression{ 2652 BitwiseANDExpression: BitwiseANDExpression{ 2653 EqualityExpression: EqualityExpression{ 2654 RelationalExpression: RelationalExpression{ 2655 ShiftExpression: ShiftExpression{ 2656 AdditiveExpression: AdditiveExpression{ 2657 MultiplicativeExpression: MultiplicativeExpression{ 2658 ExponentiationExpression: ExponentiationExpression{ 2659 UnaryExpression: UnaryExpression{ 2660 UpdateExpression: UpdateExpression{ 2661 LeftHandSideExpression: &LeftHandSideExpression{ 2662 NewExpression: &NewExpression{ 2663 MemberExpression: MemberExpression{ 2664 PrimaryExpression: &PrimaryExpression{ 2665 IdentifierReference: identA, 2666 Tokens: tks[:1], 2667 }, 2668 Tokens: tks[:1], 2669 }, 2670 Tokens: tks[:1], 2671 }, 2672 Tokens: tks[:1], 2673 }, 2674 Tokens: tks[:1], 2675 }, 2676 Tokens: tks[:1], 2677 }, 2678 Tokens: tks[:1], 2679 }, 2680 Tokens: tks[:1], 2681 }, 2682 Tokens: tks[:1], 2683 }, 2684 Tokens: tks[:1], 2685 }, 2686 Tokens: tks[:1], 2687 }, 2688 Tokens: tks[:1], 2689 }, 2690 Tokens: tks[:1], 2691 }, 2692 Tokens: tks[:1], 2693 }, 2694 BitwiseANDExpression: BitwiseANDExpression{ 2695 EqualityExpression: EqualityExpression{ 2696 RelationalExpression: RelationalExpression{ 2697 ShiftExpression: ShiftExpression{ 2698 AdditiveExpression: AdditiveExpression{ 2699 MultiplicativeExpression: MultiplicativeExpression{ 2700 ExponentiationExpression: ExponentiationExpression{ 2701 UnaryExpression: UnaryExpression{ 2702 UpdateExpression: UpdateExpression{ 2703 LeftHandSideExpression: &LeftHandSideExpression{ 2704 NewExpression: &NewExpression{ 2705 MemberExpression: MemberExpression{ 2706 PrimaryExpression: &PrimaryExpression{ 2707 IdentifierReference: identB, 2708 Tokens: tks[1:2], 2709 }, 2710 Tokens: tks[1:2], 2711 }, 2712 Tokens: tks[1:2], 2713 }, 2714 Tokens: tks[1:2], 2715 }, 2716 Tokens: tks[1:2], 2717 }, 2718 Tokens: tks[1:2], 2719 }, 2720 Tokens: tks[1:2], 2721 }, 2722 Tokens: tks[1:2], 2723 }, 2724 Tokens: tks[1:2], 2725 }, 2726 Tokens: tks[1:2], 2727 }, 2728 Tokens: tks[1:2], 2729 }, 2730 Tokens: tks[1:2], 2731 }, 2732 Tokens: tks[1:2], 2733 }, 2734 Tokens: tks[:2], 2735 }, 2736 &BitwiseORExpression{ // 22 2737 BitwiseORExpression: &BitwiseORExpression{ 2738 BitwiseXORExpression: BitwiseXORExpression{ 2739 BitwiseANDExpression: BitwiseANDExpression{ 2740 EqualityExpression: EqualityExpression{ 2741 RelationalExpression: RelationalExpression{ 2742 ShiftExpression: ShiftExpression{ 2743 AdditiveExpression: AdditiveExpression{ 2744 MultiplicativeExpression: MultiplicativeExpression{ 2745 ExponentiationExpression: ExponentiationExpression{ 2746 UnaryExpression: UnaryExpression{ 2747 UpdateExpression: UpdateExpression{ 2748 LeftHandSideExpression: &LeftHandSideExpression{ 2749 NewExpression: &NewExpression{ 2750 MemberExpression: MemberExpression{ 2751 PrimaryExpression: &PrimaryExpression{ 2752 IdentifierReference: identA, 2753 Tokens: tks[:1], 2754 }, 2755 Tokens: tks[:1], 2756 }, 2757 Tokens: tks[:1], 2758 }, 2759 Tokens: tks[:1], 2760 }, 2761 Tokens: tks[:1], 2762 }, 2763 Tokens: tks[:1], 2764 }, 2765 Tokens: tks[:1], 2766 }, 2767 Tokens: tks[:1], 2768 }, 2769 Tokens: tks[:1], 2770 }, 2771 Tokens: tks[:1], 2772 }, 2773 Tokens: tks[:1], 2774 }, 2775 Tokens: tks[:1], 2776 }, 2777 Tokens: tks[:1], 2778 }, 2779 Tokens: tks[:1], 2780 }, 2781 Tokens: tks[:1], 2782 }, 2783 BitwiseXORExpression: BitwiseXORExpression{ 2784 BitwiseANDExpression: BitwiseANDExpression{ 2785 EqualityExpression: EqualityExpression{ 2786 RelationalExpression: RelationalExpression{ 2787 ShiftExpression: ShiftExpression{ 2788 AdditiveExpression: AdditiveExpression{ 2789 MultiplicativeExpression: MultiplicativeExpression{ 2790 ExponentiationExpression: ExponentiationExpression{ 2791 UnaryExpression: UnaryExpression{ 2792 UpdateExpression: UpdateExpression{ 2793 LeftHandSideExpression: &LeftHandSideExpression{ 2794 NewExpression: &NewExpression{ 2795 MemberExpression: MemberExpression{ 2796 PrimaryExpression: &PrimaryExpression{ 2797 IdentifierReference: identB, 2798 Tokens: tks[1:2], 2799 }, 2800 Tokens: tks[1:2], 2801 }, 2802 Tokens: tks[1:2], 2803 }, 2804 Tokens: tks[1:2], 2805 }, 2806 Tokens: tks[1:2], 2807 }, 2808 Tokens: tks[1:2], 2809 }, 2810 Tokens: tks[1:2], 2811 }, 2812 Tokens: tks[1:2], 2813 }, 2814 Tokens: tks[1:2], 2815 }, 2816 Tokens: tks[1:2], 2817 }, 2818 Tokens: tks[1:2], 2819 }, 2820 Tokens: tks[1:2], 2821 }, 2822 Tokens: tks[1:2], 2823 }, 2824 Tokens: tks[1:2], 2825 }, 2826 Tokens: tks[:2], 2827 }, 2828 &LogicalANDExpression{ // 23 2829 LogicalANDExpression: &LogicalANDExpression{ 2830 BitwiseORExpression: BitwiseORExpression{ 2831 BitwiseXORExpression: BitwiseXORExpression{ 2832 BitwiseANDExpression: BitwiseANDExpression{ 2833 EqualityExpression: EqualityExpression{ 2834 RelationalExpression: RelationalExpression{ 2835 ShiftExpression: ShiftExpression{ 2836 AdditiveExpression: AdditiveExpression{ 2837 MultiplicativeExpression: MultiplicativeExpression{ 2838 ExponentiationExpression: ExponentiationExpression{ 2839 UnaryExpression: UnaryExpression{ 2840 UpdateExpression: UpdateExpression{ 2841 LeftHandSideExpression: &LeftHandSideExpression{ 2842 NewExpression: &NewExpression{ 2843 MemberExpression: MemberExpression{ 2844 PrimaryExpression: &PrimaryExpression{ 2845 IdentifierReference: identA, 2846 Tokens: tks[:1], 2847 }, 2848 Tokens: tks[:1], 2849 }, 2850 Tokens: tks[:1], 2851 }, 2852 Tokens: tks[:1], 2853 }, 2854 Tokens: tks[:1], 2855 }, 2856 Tokens: tks[:1], 2857 }, 2858 Tokens: tks[:1], 2859 }, 2860 Tokens: tks[:1], 2861 }, 2862 Tokens: tks[:1], 2863 }, 2864 Tokens: tks[:1], 2865 }, 2866 Tokens: tks[:1], 2867 }, 2868 Tokens: tks[:1], 2869 }, 2870 Tokens: tks[:1], 2871 }, 2872 Tokens: tks[:1], 2873 }, 2874 Tokens: tks[:1], 2875 }, 2876 Tokens: tks[:1], 2877 }, 2878 BitwiseORExpression: BitwiseORExpression{ 2879 BitwiseXORExpression: BitwiseXORExpression{ 2880 BitwiseANDExpression: BitwiseANDExpression{ 2881 EqualityExpression: EqualityExpression{ 2882 RelationalExpression: RelationalExpression{ 2883 ShiftExpression: ShiftExpression{ 2884 AdditiveExpression: AdditiveExpression{ 2885 MultiplicativeExpression: MultiplicativeExpression{ 2886 ExponentiationExpression: ExponentiationExpression{ 2887 UnaryExpression: UnaryExpression{ 2888 UpdateExpression: UpdateExpression{ 2889 LeftHandSideExpression: &LeftHandSideExpression{ 2890 NewExpression: &NewExpression{ 2891 MemberExpression: MemberExpression{ 2892 PrimaryExpression: &PrimaryExpression{ 2893 IdentifierReference: identB, 2894 Tokens: tks[1:2], 2895 }, 2896 Tokens: tks[1:2], 2897 }, 2898 Tokens: tks[1:2], 2899 }, 2900 Tokens: tks[1:2], 2901 }, 2902 Tokens: tks[1:2], 2903 }, 2904 Tokens: tks[1:2], 2905 }, 2906 Tokens: tks[1:2], 2907 }, 2908 Tokens: tks[1:2], 2909 }, 2910 Tokens: tks[1:2], 2911 }, 2912 Tokens: tks[1:2], 2913 }, 2914 Tokens: tks[1:2], 2915 }, 2916 Tokens: tks[1:2], 2917 }, 2918 Tokens: tks[1:2], 2919 }, 2920 Tokens: tks[1:2], 2921 }, 2922 Tokens: tks[1:2], 2923 }, 2924 Tokens: tks[:2], 2925 }, 2926 &LogicalORExpression{ // 24 2927 LogicalORExpression: &LogicalORExpression{ 2928 LogicalANDExpression: LogicalANDExpression{ 2929 BitwiseORExpression: BitwiseORExpression{ 2930 BitwiseXORExpression: BitwiseXORExpression{ 2931 BitwiseANDExpression: BitwiseANDExpression{ 2932 EqualityExpression: EqualityExpression{ 2933 RelationalExpression: RelationalExpression{ 2934 ShiftExpression: ShiftExpression{ 2935 AdditiveExpression: AdditiveExpression{ 2936 MultiplicativeExpression: MultiplicativeExpression{ 2937 ExponentiationExpression: ExponentiationExpression{ 2938 UnaryExpression: UnaryExpression{ 2939 UpdateExpression: UpdateExpression{ 2940 LeftHandSideExpression: &LeftHandSideExpression{ 2941 NewExpression: &NewExpression{ 2942 MemberExpression: MemberExpression{ 2943 PrimaryExpression: &PrimaryExpression{ 2944 IdentifierReference: identA, 2945 Tokens: tks[:1], 2946 }, 2947 Tokens: tks[:1], 2948 }, 2949 Tokens: tks[:1], 2950 }, 2951 Tokens: tks[:1], 2952 }, 2953 Tokens: tks[:1], 2954 }, 2955 Tokens: tks[:1], 2956 }, 2957 Tokens: tks[:1], 2958 }, 2959 Tokens: tks[:1], 2960 }, 2961 Tokens: tks[:1], 2962 }, 2963 Tokens: tks[:1], 2964 }, 2965 Tokens: tks[:1], 2966 }, 2967 Tokens: tks[:1], 2968 }, 2969 Tokens: tks[:1], 2970 }, 2971 Tokens: tks[:1], 2972 }, 2973 Tokens: tks[:1], 2974 }, 2975 Tokens: tks[:1], 2976 }, 2977 Tokens: tks[:1], 2978 }, 2979 LogicalANDExpression: LogicalANDExpression{ 2980 BitwiseORExpression: BitwiseORExpression{ 2981 BitwiseXORExpression: BitwiseXORExpression{ 2982 BitwiseANDExpression: BitwiseANDExpression{ 2983 EqualityExpression: EqualityExpression{ 2984 RelationalExpression: RelationalExpression{ 2985 ShiftExpression: ShiftExpression{ 2986 AdditiveExpression: AdditiveExpression{ 2987 MultiplicativeExpression: MultiplicativeExpression{ 2988 ExponentiationExpression: ExponentiationExpression{ 2989 UnaryExpression: UnaryExpression{ 2990 UpdateExpression: UpdateExpression{ 2991 LeftHandSideExpression: &LeftHandSideExpression{ 2992 NewExpression: &NewExpression{ 2993 MemberExpression: MemberExpression{ 2994 PrimaryExpression: &PrimaryExpression{ 2995 IdentifierReference: identB, 2996 Tokens: tks[1:2], 2997 }, 2998 Tokens: tks[1:2], 2999 }, 3000 Tokens: tks[1:2], 3001 }, 3002 Tokens: tks[1:2], 3003 }, 3004 Tokens: tks[1:2], 3005 }, 3006 Tokens: tks[1:2], 3007 }, 3008 Tokens: tks[1:2], 3009 }, 3010 Tokens: tks[1:2], 3011 }, 3012 Tokens: tks[1:2], 3013 }, 3014 Tokens: tks[1:2], 3015 }, 3016 Tokens: tks[1:2], 3017 }, 3018 Tokens: tks[1:2], 3019 }, 3020 Tokens: tks[1:2], 3021 }, 3022 Tokens: tks[1:2], 3023 }, 3024 Tokens: tks[1:2], 3025 }, 3026 Tokens: tks[1:2], 3027 }, 3028 Tokens: tks[:2], 3029 }, 3030 &ConditionalExpression{ // 25 3031 CoalesceExpression: &CoalesceExpression{ 3032 CoalesceExpressionHead: &CoalesceExpression{ 3033 BitwiseORExpression: BitwiseORExpression{ 3034 BitwiseXORExpression: BitwiseXORExpression{ 3035 BitwiseANDExpression: BitwiseANDExpression{ 3036 EqualityExpression: EqualityExpression{ 3037 RelationalExpression: RelationalExpression{ 3038 ShiftExpression: ShiftExpression{ 3039 AdditiveExpression: AdditiveExpression{ 3040 MultiplicativeExpression: MultiplicativeExpression{ 3041 ExponentiationExpression: ExponentiationExpression{ 3042 UnaryExpression: UnaryExpression{ 3043 UpdateExpression: UpdateExpression{ 3044 LeftHandSideExpression: &LeftHandSideExpression{ 3045 NewExpression: &NewExpression{ 3046 MemberExpression: MemberExpression{ 3047 PrimaryExpression: &PrimaryExpression{ 3048 IdentifierReference: identA, 3049 Tokens: tks[:1], 3050 }, 3051 Tokens: tks[:1], 3052 }, 3053 Tokens: tks[:1], 3054 }, 3055 Tokens: tks[:1], 3056 }, 3057 Tokens: tks[:1], 3058 }, 3059 Tokens: tks[:1], 3060 }, 3061 Tokens: tks[:1], 3062 }, 3063 Tokens: tks[:1], 3064 }, 3065 Tokens: tks[:1], 3066 }, 3067 Tokens: tks[:1], 3068 }, 3069 Tokens: tks[:1], 3070 }, 3071 Tokens: tks[:1], 3072 }, 3073 Tokens: tks[:1], 3074 }, 3075 Tokens: tks[:1], 3076 }, 3077 Tokens: tks[:1], 3078 }, 3079 Tokens: tks[:1], 3080 }, 3081 BitwiseORExpression: BitwiseORExpression{ 3082 BitwiseXORExpression: BitwiseXORExpression{ 3083 BitwiseANDExpression: BitwiseANDExpression{ 3084 EqualityExpression: EqualityExpression{ 3085 RelationalExpression: RelationalExpression{ 3086 ShiftExpression: ShiftExpression{ 3087 AdditiveExpression: AdditiveExpression{ 3088 MultiplicativeExpression: MultiplicativeExpression{ 3089 ExponentiationExpression: ExponentiationExpression{ 3090 UnaryExpression: UnaryExpression{ 3091 UpdateExpression: UpdateExpression{ 3092 LeftHandSideExpression: &LeftHandSideExpression{ 3093 NewExpression: &NewExpression{ 3094 MemberExpression: MemberExpression{ 3095 PrimaryExpression: &PrimaryExpression{ 3096 IdentifierReference: identB, 3097 Tokens: tks[1:2], 3098 }, 3099 Tokens: tks[1:2], 3100 }, 3101 Tokens: tks[1:2], 3102 }, 3103 Tokens: tks[1:2], 3104 }, 3105 Tokens: tks[1:2], 3106 }, 3107 Tokens: tks[1:2], 3108 }, 3109 Tokens: tks[1:2], 3110 }, 3111 Tokens: tks[1:2], 3112 }, 3113 Tokens: tks[1:2], 3114 }, 3115 Tokens: tks[1:2], 3116 }, 3117 Tokens: tks[1:2], 3118 }, 3119 Tokens: tks[1:2], 3120 }, 3121 Tokens: tks[1:2], 3122 }, 3123 Tokens: tks[1:2], 3124 }, 3125 Tokens: tks[1:2], 3126 }, 3127 Tokens: tks[1:2], 3128 }, 3129 Tokens: tks[:2], 3130 }, 3131 } { 3132 if output := UnwrapConditional(WrapConditional(test)); !reflect.DeepEqual(output, test) { 3133 t.Errorf("test %d: expecting\n%v\n...got...\n%v", n+1, test, output) 3134 } 3135 } 3136 } 3137 3138 func TestUnwrapConditionalExtra(t *testing.T) { 3139 if output := UnwrapConditional(nil); output != nil { 3140 t.Errorf("expecting nil got: %v", output) 3141 } 3142 } 3143