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