1 package javascript 2 3 import ( 4 "reflect" 5 "testing" 6 7 "vimagination.zapto.org/parser" 8 ) 9 10 type sourceFn struct { 11 Source string 12 Fn func(*test, Tokens) 13 } 14 15 type test struct { 16 Tokens jsParser 17 Yield, Await, In, Def, Ret, Typescript bool 18 Output interface{} 19 Err error 20 } 21 22 func makeTokeniser(tk parser.Tokeniser) *parser.Tokeniser { 23 return &tk 24 } 25 26 func doTests(t *testing.T, tests []sourceFn, fn func(*test) (Type, error)) { 27 t.Helper() 28 var err error 29 for n, tt := range tests { 30 var ts test 31 ts.Tokens, err = newJSParser(makeTokeniser(parser.NewStringTokeniser(tt.Source))) 32 if err != nil { 33 t.Errorf("test %d: unexpected error: %s", n+1, err) 34 continue 35 } 36 tt.Fn(&ts, Tokens(ts.Tokens[:cap(ts.Tokens)])) 37 output, err := fn(&ts) 38 if !reflect.DeepEqual(err, ts.Err) { 39 t.Errorf("test %d: expecting error: %v, got %v", n+1, ts.Err, err) 40 } else if ts.Output != nil && !reflect.DeepEqual(output, ts.Output) { 41 t.Errorf("test %d: expecting \n%+v\n...got...\n%+v", n+1, ts.Output, output) 42 } 43 } 44 } 45 46 func assignmentError(tk Token) Error { 47 return assignmentCustomError(tk, ErrNoIdentifier) 48 } 49 50 func assignmentCustomError(tk Token, err error) Error { 51 return Error{ 52 Err: Error{ 53 Err: Error{ 54 Err: Error{ 55 Err: Error{ 56 Err: Error{ 57 Err: Error{ 58 Err: Error{ 59 Err: Error{ 60 Err: Error{ 61 Err: Error{ 62 Err: Error{ 63 Err: Error{ 64 Err: Error{ 65 Err: Error{ 66 Err: Error{ 67 Err: Error{ 68 Err: Error{ 69 Err: Error{ 70 Err: err, 71 Parsing: "PrimaryExpression", 72 Token: tk, 73 }, 74 Parsing: "MemberExpression", 75 Token: tk, 76 }, 77 Parsing: "NewExpression", 78 Token: tk, 79 }, 80 Parsing: "LeftHandSideExpression", 81 Token: tk, 82 }, 83 Parsing: "UpdateExpression", 84 Token: tk, 85 }, 86 Parsing: "UnaryExpression", 87 Token: tk, 88 }, 89 Parsing: "ExponentiationExpression", 90 Token: tk, 91 }, 92 Parsing: "MultiplicativeExpression", 93 Token: tk, 94 }, 95 Parsing: "AdditiveExpression", 96 Token: tk, 97 }, 98 Parsing: "ShiftExpression", 99 Token: tk, 100 }, 101 Parsing: "RelationalExpression", 102 Token: tk, 103 }, 104 Parsing: "EqualityExpression", 105 Token: tk, 106 }, 107 Parsing: "BitwiseANDExpression", 108 Token: tk, 109 }, 110 Parsing: "BitwiseXORExpression", 111 Token: tk, 112 }, 113 Parsing: "BitwiseORExpression", 114 Token: tk, 115 }, 116 Parsing: "LogicalANDExpression", 117 Token: tk, 118 }, 119 Parsing: "LogicalORExpression", 120 Token: tk, 121 }, 122 Parsing: "ConditionalExpression", 123 Token: tk, 124 }, 125 Parsing: "AssignmentExpression", 126 Token: tk, 127 } 128 } 129 130 func TestIdentifier(t *testing.T) { 131 doTests(t, []sourceFn{ 132 {`hello_world`, func(t *test, tk Tokens) { 133 t.Output = &tk[0] 134 }}, 135 {`yield`, func(t *test, tk Tokens) { 136 t.Output = &tk[0] 137 }}, 138 {`yield`, func(t *test, tk Tokens) { 139 t.Await = true 140 t.Output = &tk[0] 141 }}, 142 {`yield`, func(t *test, tk Tokens) { 143 t.Yield = true 144 t.Output = nil 145 }}, 146 {`await`, func(t *test, tk Tokens) { 147 t.Output = &tk[0] 148 }}, 149 {`await`, func(t *test, tk Tokens) { 150 t.Yield = true 151 t.Output = &tk[0] 152 }}, 153 {`await`, func(t *test, tk Tokens) { 154 t.Await = true 155 t.Output = nil 156 }}, 157 {`for`, func(t *test, tk Tokens) { 158 t.Output = nil 159 }}, 160 {`"for"`, func(t *test, tk Tokens) { 161 t.Output = nil 162 }}, 163 {`1`, func(t *test, tk Tokens) { 164 t.Output = nil 165 }}, 166 {`+`, func(t *test, tk Tokens) { 167 t.Output = nil 168 }}, 169 }, func(t *test) (Type, error) { 170 return t.Tokens.parseIdentifier(t.Yield, t.Await), nil 171 }) 172 } 173 174 func TestScript(t *testing.T) { 175 doTests(t, []sourceFn{ 176 {` 177 "use strict"; 178 179 document.body.innerHTML = 180 "Hello, World"; 181 182 function runMe (v) 183 { 184 let x = v * 2; 185 alert(x); 186 } 187 188 for( 189 var a = 1; 190 a < 10; 191 a ++ 192 ) { 193 runMe ( a ); 194 } 195 `, func(t *test, tk Tokens) { // 1 196 useStrict := makeConditionLiteral(tk, 1) 197 helloWorld := makeConditionLiteral(tk, 13) 198 v := makeConditionLiteral(tk, 34) 199 two := makeConditionLiteral(tk, 38) 200 multiply := wrapConditional(MultiplicativeExpression{ 201 MultiplicativeExpression: &v.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression.MultiplicativeExpression, 202 MultiplicativeOperator: MultiplicativeMultiply, 203 ExponentiationExpression: two.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression.MultiplicativeExpression.ExponentiationExpression, 204 Tokens: tk[34:39], 205 }) 206 x := makeConditionLiteral(tk, 44) 207 alert := wrapConditional(UpdateExpression{ 208 LeftHandSideExpression: &LeftHandSideExpression{ 209 CallExpression: &CallExpression{ 210 MemberExpression: &MemberExpression{ 211 PrimaryExpression: &PrimaryExpression{ 212 IdentifierReference: &tk[42], 213 Tokens: tk[42:43], 214 }, 215 Tokens: tk[42:43], 216 }, 217 Arguments: &Arguments{ 218 ArgumentList: []Argument{ 219 { 220 AssignmentExpression: AssignmentExpression{ 221 ConditionalExpression: &x, 222 Tokens: tk[44:45], 223 }, 224 Tokens: tk[44:45], 225 }, 226 }, 227 Tokens: tk[43:46], 228 }, 229 Tokens: tk[42:46], 230 }, 231 Tokens: tk[42:46], 232 }, 233 Tokens: tk[42:46], 234 }) 235 one := makeConditionLiteral(tk, 60) 236 a := makeConditionLiteral(tk, 64) 237 ten := makeConditionLiteral(tk, 68) 238 aLessThanTen := wrapConditional(RelationalExpression{ 239 RelationalExpression: &a.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression, 240 RelationshipOperator: RelationshipLessThan, 241 ShiftExpression: ten.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression, 242 Tokens: tk[64:69], 243 }) 244 aPlusPlus := wrapConditional(UpdateExpression{ 245 LeftHandSideExpression: &LeftHandSideExpression{ 246 NewExpression: &NewExpression{ 247 MemberExpression: MemberExpression{ 248 PrimaryExpression: &PrimaryExpression{ 249 IdentifierReference: &tk[72], 250 Tokens: tk[72:73], 251 }, 252 Tokens: tk[72:73], 253 }, 254 Tokens: tk[72:73], 255 }, 256 Tokens: tk[72:73], 257 }, 258 UpdateOperator: UpdatePostIncrement, 259 Tokens: tk[72:75], 260 }) 261 argA := makeConditionLiteral(tk, 85) 262 runMe := wrapConditional(UpdateExpression{ 263 LeftHandSideExpression: &LeftHandSideExpression{ 264 CallExpression: &CallExpression{ 265 MemberExpression: &MemberExpression{ 266 PrimaryExpression: &PrimaryExpression{ 267 IdentifierReference: &tk[81], 268 Tokens: tk[81:82], 269 }, 270 Tokens: tk[81:82], 271 }, 272 Arguments: &Arguments{ 273 ArgumentList: []Argument{ 274 { 275 AssignmentExpression: AssignmentExpression{ 276 ConditionalExpression: &argA, 277 Tokens: tk[85:86], 278 }, 279 Tokens: tk[85:86], 280 }, 281 }, 282 Tokens: tk[83:88], 283 }, 284 Tokens: tk[81:88], 285 }, 286 Tokens: tk[81:88], 287 }, 288 Tokens: tk[81:88], 289 }) 290 t.Output = Script{ 291 StatementList: []StatementListItem{ 292 { 293 Statement: &Statement{ 294 ExpressionStatement: &Expression{ 295 Expressions: []AssignmentExpression{ 296 { 297 ConditionalExpression: &useStrict, 298 Tokens: tk[1:2], 299 }, 300 }, 301 Tokens: tk[1:2], 302 }, 303 Tokens: tk[1:3], 304 }, 305 Tokens: tk[1:3], 306 }, 307 { 308 Statement: &Statement{ 309 ExpressionStatement: &Expression{ 310 Expressions: []AssignmentExpression{ 311 { 312 LeftHandSideExpression: &LeftHandSideExpression{ 313 NewExpression: &NewExpression{ 314 MemberExpression: MemberExpression{ 315 MemberExpression: &MemberExpression{ 316 MemberExpression: &MemberExpression{ 317 PrimaryExpression: &PrimaryExpression{ 318 IdentifierReference: &tk[4], 319 Tokens: tk[4:5], 320 }, 321 Tokens: tk[4:5], 322 }, 323 IdentifierName: &tk[6], 324 Tokens: tk[4:7], 325 }, 326 IdentifierName: &tk[8], 327 Tokens: tk[4:9], 328 }, 329 Tokens: tk[4:9], 330 }, 331 Tokens: tk[4:9], 332 }, 333 AssignmentOperator: AssignmentAssign, 334 AssignmentExpression: &AssignmentExpression{ 335 ConditionalExpression: &helloWorld, 336 Tokens: tk[13:14], 337 }, 338 Tokens: tk[4:14], 339 }, 340 }, 341 Tokens: tk[4:14], 342 }, 343 Tokens: tk[4:15], 344 }, 345 Tokens: tk[4:15], 346 }, 347 { 348 Declaration: &Declaration{ 349 FunctionDeclaration: &FunctionDeclaration{ 350 BindingIdentifier: &tk[18], 351 FormalParameters: FormalParameters{ 352 FormalParameterList: []BindingElement{ 353 { 354 SingleNameBinding: &tk[21], 355 Tokens: tk[21:22], 356 }, 357 }, 358 Tokens: tk[20:23], 359 }, 360 FunctionBody: Block{ 361 StatementList: []StatementListItem{ 362 { 363 Declaration: &Declaration{ 364 LexicalDeclaration: &LexicalDeclaration{ 365 LetOrConst: Let, 366 BindingList: []LexicalBinding{ 367 { 368 BindingIdentifier: &tk[30], 369 Initializer: &AssignmentExpression{ 370 ConditionalExpression: &multiply, 371 Tokens: tk[34:39], 372 }, 373 Tokens: tk[30:39], 374 }, 375 }, 376 Tokens: tk[28:40], 377 }, 378 Tokens: tk[28:40], 379 }, 380 Tokens: tk[28:40], 381 }, 382 { 383 Statement: &Statement{ 384 ExpressionStatement: &Expression{ 385 Expressions: []AssignmentExpression{ 386 { 387 ConditionalExpression: &alert, 388 Tokens: tk[42:46], 389 }, 390 }, 391 Tokens: tk[42:46], 392 }, 393 Tokens: tk[42:47], 394 }, 395 Tokens: tk[42:47], 396 }, 397 }, 398 Tokens: tk[25:49], 399 }, 400 Tokens: tk[16:49], 401 }, 402 Tokens: tk[16:49], 403 }, 404 Tokens: tk[16:49], 405 }, 406 { 407 Statement: &Statement{ 408 IterationStatementFor: &IterationStatementFor{ 409 Type: ForNormalVar, 410 InitVar: []VariableDeclaration{ 411 { 412 BindingIdentifier: &tk[56], 413 Initializer: &AssignmentExpression{ 414 ConditionalExpression: &one, 415 Tokens: tk[60:61], 416 }, 417 Tokens: tk[56:61], 418 }, 419 }, 420 Conditional: &Expression{ 421 Expressions: []AssignmentExpression{ 422 { 423 ConditionalExpression: &aLessThanTen, 424 Tokens: tk[64:69], 425 }, 426 }, 427 Tokens: tk[64:69], 428 }, 429 Afterthought: &Expression{ 430 Expressions: []AssignmentExpression{ 431 { 432 ConditionalExpression: &aPlusPlus, 433 Tokens: tk[72:75], 434 }, 435 }, 436 Tokens: tk[72:75], 437 }, 438 Statement: Statement{ 439 BlockStatement: &Block{ 440 StatementList: []StatementListItem{ 441 { 442 Statement: &Statement{ 443 ExpressionStatement: &Expression{ 444 Expressions: []AssignmentExpression{ 445 { 446 ConditionalExpression: &runMe, 447 Tokens: tk[81:88], 448 }, 449 }, 450 Tokens: tk[81:88], 451 }, 452 Tokens: tk[81:89], 453 }, 454 Tokens: tk[81:89], 455 }, 456 }, 457 Tokens: tk[78:91], 458 }, 459 Tokens: tk[78:91], 460 }, 461 Tokens: tk[50:91], 462 }, 463 Tokens: tk[50:91], 464 }, 465 Tokens: tk[50:91], 466 }, 467 }, 468 Tokens: tk[:92], 469 } 470 }}, 471 {`if (typeof a === "b" && typeof c.d == "e") {}`, func(t *test, tk Tokens) { // 2 472 litA := makeConditionLiteral(tk, 5) 473 litB := makeConditionLiteral(tk, 9) 474 litE := makeConditionLiteral(tk, 21) 475 typeOfA := wrapConditional(UnaryExpression{ 476 UnaryOperators: []UnaryOperator{UnaryTypeOf}, 477 UpdateExpression: litA.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression.MultiplicativeExpression.ExponentiationExpression.UnaryExpression.UpdateExpression, 478 Tokens: tk[3:6], 479 }) 480 CD := wrapConditional(UpdateExpression{ 481 LeftHandSideExpression: &LeftHandSideExpression{ 482 NewExpression: &NewExpression{ 483 MemberExpression: MemberExpression{ 484 MemberExpression: &MemberExpression{ 485 PrimaryExpression: &PrimaryExpression{ 486 IdentifierReference: &tk[15], 487 Tokens: tk[15:16], 488 }, 489 Tokens: tk[15:16], 490 }, 491 IdentifierName: &tk[17], 492 Tokens: tk[15:18], 493 }, 494 Tokens: tk[15:18], 495 }, 496 Tokens: tk[15:18], 497 }, 498 Tokens: tk[15:18], 499 }) 500 typeOfCD := wrapConditional(UnaryExpression{ 501 UnaryOperators: []UnaryOperator{UnaryTypeOf}, 502 UpdateExpression: CD.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression.MultiplicativeExpression.ExponentiationExpression.UnaryExpression.UpdateExpression, 503 Tokens: tk[13:18], 504 }) 505 AEquals := wrapConditional(EqualityExpression{ 506 EqualityExpression: &typeOfA.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression, 507 EqualityOperator: EqualityStrictEqual, 508 RelationalExpression: litB.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression, 509 Tokens: tk[3:10], 510 }) 511 CDEquals := wrapConditional(EqualityExpression{ 512 EqualityExpression: &typeOfCD.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression, 513 EqualityOperator: EqualityEqual, 514 RelationalExpression: litE.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression, 515 Tokens: tk[13:22], 516 }) 517 And := wrapConditional(LogicalANDExpression{ 518 LogicalANDExpression: &AEquals.LogicalORExpression.LogicalANDExpression, 519 BitwiseORExpression: CDEquals.LogicalORExpression.LogicalANDExpression.BitwiseORExpression, 520 Tokens: tk[3:22], 521 }) 522 t.Output = Script{ 523 StatementList: []StatementListItem{ 524 { 525 Statement: &Statement{ 526 IfStatement: &IfStatement{ 527 Expression: Expression{ 528 Expressions: []AssignmentExpression{ 529 { 530 ConditionalExpression: &And, 531 Tokens: tk[3:22], 532 }, 533 }, 534 Tokens: tk[3:22], 535 }, 536 Statement: Statement{ 537 BlockStatement: &Block{ 538 Tokens: tk[24:26], 539 }, 540 Tokens: tk[24:26], 541 }, 542 Tokens: tk[:26], 543 }, 544 Tokens: tk[:26], 545 }, 546 Tokens: tk[:26], 547 }, 548 }, 549 Tokens: tk[:26], 550 } 551 }}, 552 {"{ 1 2 } 3", func(t *test, tk Tokens) { // 3 553 t.Err = Error{ 554 Err: Error{ 555 Err: Error{ 556 Err: Error{ 557 Err: Error{ 558 Err: ErrMissingSemiColon, 559 Parsing: "Statement", 560 Token: tk[3], 561 }, 562 Parsing: "StatementListItem", 563 Token: tk[2], 564 }, 565 Parsing: "Block", 566 Token: tk[2], 567 }, 568 Parsing: "Statement", 569 Token: tk[0], 570 }, 571 Parsing: "StatementListItem", 572 Token: tk[0], 573 } 574 }}, 575 {"{ 1\n2 } 3", func(t *test, tk Tokens) { // 4 576 lit1 := makeConditionLiteral(tk, 2) 577 lit2 := makeConditionLiteral(tk, 4) 578 lit3 := makeConditionLiteral(tk, 8) 579 t.Output = Script{ 580 StatementList: []StatementListItem{ 581 { 582 Statement: &Statement{ 583 BlockStatement: &Block{ 584 StatementList: []StatementListItem{ 585 { 586 Statement: &Statement{ 587 ExpressionStatement: &Expression{ 588 Expressions: []AssignmentExpression{ 589 { 590 ConditionalExpression: &lit1, 591 Tokens: tk[2:3], 592 }, 593 }, 594 Tokens: tk[2:3], 595 }, 596 Tokens: tk[2:3], 597 }, 598 Tokens: tk[2:3], 599 }, 600 { 601 Statement: &Statement{ 602 ExpressionStatement: &Expression{ 603 Expressions: []AssignmentExpression{ 604 { 605 ConditionalExpression: &lit2, 606 Tokens: tk[4:5], 607 }, 608 }, 609 Tokens: tk[4:5], 610 }, 611 Tokens: tk[4:5], 612 }, 613 Tokens: tk[4:5], 614 }, 615 }, 616 Tokens: tk[:7], 617 }, 618 Tokens: tk[:7], 619 }, 620 Tokens: tk[:7], 621 }, 622 { 623 Statement: &Statement{ 624 ExpressionStatement: &Expression{ 625 Expressions: []AssignmentExpression{ 626 { 627 ConditionalExpression: &lit3, 628 Tokens: tk[8:9], 629 }, 630 }, 631 Tokens: tk[8:9], 632 }, 633 Tokens: tk[8:9], 634 }, 635 Tokens: tk[8:9], 636 }, 637 }, 638 Tokens: tk[:9], 639 } 640 }}, 641 {"function fn() {\nreturn\na + b\n}", func(t *test, tk Tokens) { // 5 642 litA := makeConditionLiteral(tk, 10) 643 litB := makeConditionLiteral(tk, 14) 644 add := wrapConditional(AdditiveExpression{ 645 AdditiveExpression: &litA.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression, 646 AdditiveOperator: AdditiveAdd, 647 MultiplicativeExpression: litB.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression.MultiplicativeExpression, 648 Tokens: tk[10:15], 649 }) 650 t.Output = Script{ 651 StatementList: []StatementListItem{ 652 { 653 Declaration: &Declaration{ 654 FunctionDeclaration: &FunctionDeclaration{ 655 BindingIdentifier: &tk[2], 656 FormalParameters: FormalParameters{ 657 Tokens: tk[3:5], 658 }, 659 FunctionBody: Block{ 660 StatementList: []StatementListItem{ 661 { 662 Statement: &Statement{ 663 Type: StatementReturn, 664 Tokens: tk[8:9], 665 }, 666 Tokens: tk[8:9], 667 }, 668 { 669 Statement: &Statement{ 670 ExpressionStatement: &Expression{ 671 Expressions: []AssignmentExpression{ 672 { 673 ConditionalExpression: &add, 674 Tokens: tk[10:15], 675 }, 676 }, 677 Tokens: tk[10:15], 678 }, 679 Tokens: tk[10:15], 680 }, 681 Tokens: tk[10:15], 682 }, 683 }, 684 Tokens: tk[6:17], 685 }, 686 Tokens: tk[:17], 687 }, 688 Tokens: tk[:17], 689 }, 690 Tokens: tk[:17], 691 }, 692 }, 693 Tokens: tk[:17], 694 } 695 }}, 696 {"a = b\n++c", func(t *test, tk Tokens) { // 6 697 litA := makeConditionLiteral(tk, 0) 698 litB := makeConditionLiteral(tk, 4) 699 litC := makeConditionLiteral(tk, 7) 700 pa := wrapConditional(UpdateExpression{ 701 UpdateOperator: UpdatePreIncrement, 702 UnaryExpression: &litC.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression.MultiplicativeExpression.ExponentiationExpression.UnaryExpression, 703 Tokens: tk[6:8], 704 }) 705 t.Output = Script{ 706 StatementList: []StatementListItem{ 707 { 708 Statement: &Statement{ 709 ExpressionStatement: &Expression{ 710 Expressions: []AssignmentExpression{ 711 { 712 LeftHandSideExpression: litA.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression.MultiplicativeExpression.ExponentiationExpression.UnaryExpression.UpdateExpression.LeftHandSideExpression, 713 AssignmentOperator: AssignmentAssign, 714 AssignmentExpression: &AssignmentExpression{ 715 ConditionalExpression: &litB, 716 Tokens: tk[4:5], 717 }, 718 Tokens: tk[:5], 719 }, 720 }, 721 Tokens: tk[:5], 722 }, 723 Tokens: tk[:5], 724 }, 725 Tokens: tk[:5], 726 }, 727 { 728 Statement: &Statement{ 729 ExpressionStatement: &Expression{ 730 Expressions: []AssignmentExpression{ 731 { 732 ConditionalExpression: &pa, 733 Tokens: tk[6:8], 734 }, 735 }, 736 Tokens: tk[6:8], 737 }, 738 Tokens: tk[6:8], 739 }, 740 Tokens: tk[6:8], 741 }, 742 }, 743 Tokens: tk[:8], 744 } 745 }}, 746 {"if (a > b)\nelse d = e", func(t *test, tk Tokens) { // 7 747 t.Err = Error{ 748 Err: Error{ 749 Err: Error{ 750 Err: Error{ 751 Err: Error{ 752 Err: assignmentError(tk[10]), 753 Parsing: "Expression", 754 Token: tk[10], 755 }, 756 Parsing: "Statement", 757 Token: tk[10], 758 }, 759 Parsing: "IfStatement", 760 Token: tk[10], 761 }, 762 Parsing: "Statement", 763 Token: tk[0], 764 }, 765 Parsing: "StatementListItem", 766 Token: tk[0], 767 } 768 }}, 769 {"if\n(a\n>\nb)\nc\nelse\nd\n=\ne", func(t *test, tk Tokens) { // 8 770 litA := makeConditionLiteral(tk, 3) 771 litB := makeConditionLiteral(tk, 7) 772 litC := makeConditionLiteral(tk, 10) 773 litD := makeConditionLiteral(tk, 14) 774 litE := makeConditionLiteral(tk, 18) 775 ab := wrapConditional(RelationalExpression{ 776 RelationalExpression: &litA.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression, 777 RelationshipOperator: RelationshipGreaterThan, 778 ShiftExpression: litB.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression, 779 Tokens: tk[3:8], 780 }) 781 t.Output = Script{ 782 StatementList: []StatementListItem{ 783 { 784 Statement: &Statement{ 785 IfStatement: &IfStatement{ 786 Expression: Expression{ 787 Expressions: []AssignmentExpression{ 788 { 789 ConditionalExpression: &ab, 790 Tokens: tk[3:8], 791 }, 792 }, 793 Tokens: tk[3:8], 794 }, 795 Statement: Statement{ 796 ExpressionStatement: &Expression{ 797 Expressions: []AssignmentExpression{ 798 { 799 ConditionalExpression: &litC, 800 Tokens: tk[10:11], 801 }, 802 }, 803 Tokens: tk[10:11], 804 }, 805 Tokens: tk[10:11], 806 }, 807 ElseStatement: &Statement{ 808 ExpressionStatement: &Expression{ 809 Expressions: []AssignmentExpression{ 810 { 811 LeftHandSideExpression: litD.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression.MultiplicativeExpression.ExponentiationExpression.UnaryExpression.UpdateExpression.LeftHandSideExpression, 812 AssignmentOperator: AssignmentAssign, 813 AssignmentExpression: &AssignmentExpression{ 814 ConditionalExpression: &litE, 815 Tokens: tk[18:19], 816 }, 817 Tokens: tk[14:19], 818 }, 819 }, 820 Tokens: tk[14:19], 821 }, 822 Tokens: tk[14:19], 823 }, 824 Tokens: tk[:19], 825 }, 826 Tokens: tk[:19], 827 }, 828 Tokens: tk[:19], 829 }, 830 }, 831 Tokens: tk[:19], 832 } 833 }}, 834 {"a = b + c\n(d + e).print()", func(t *test, tk Tokens) { // 9 835 litA := makeConditionLiteral(tk, 0) 836 litB := makeConditionLiteral(tk, 4) 837 litD := makeConditionLiteral(tk, 11) 838 litE := makeConditionLiteral(tk, 15) 839 de := wrapConditional(AdditiveExpression{ 840 AdditiveExpression: &litD.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression, 841 AdditiveOperator: AdditiveAdd, 842 MultiplicativeExpression: litE.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression.MultiplicativeExpression, 843 Tokens: tk[11:16], 844 }) 845 bc := wrapConditional(AdditiveExpression{ 846 AdditiveExpression: &litB.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression, 847 AdditiveOperator: AdditiveAdd, 848 MultiplicativeExpression: wrapConditional(UpdateExpression{ 849 LeftHandSideExpression: &LeftHandSideExpression{ 850 CallExpression: &CallExpression{ 851 CallExpression: &CallExpression{ 852 CallExpression: &CallExpression{ 853 MemberExpression: &MemberExpression{ 854 PrimaryExpression: &PrimaryExpression{ 855 IdentifierReference: &tk[8], 856 Tokens: tk[8:9], 857 }, 858 Tokens: tk[8:9], 859 }, 860 Arguments: &Arguments{ 861 ArgumentList: []Argument{ 862 { 863 AssignmentExpression: AssignmentExpression{ 864 ConditionalExpression: &de, 865 Tokens: tk[11:16], 866 }, 867 Tokens: tk[11:16], 868 }, 869 }, 870 Tokens: tk[10:17], 871 }, 872 Tokens: tk[8:17], 873 }, 874 IdentifierName: &tk[18], 875 Tokens: tk[8:19], 876 }, 877 Arguments: &Arguments{ 878 Tokens: tk[19:21], 879 }, 880 Tokens: tk[8:21], 881 }, 882 Tokens: tk[8:21], 883 }, 884 Tokens: tk[8:21], 885 }).LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression.MultiplicativeExpression, 886 Tokens: tk[4:21], 887 }) 888 t.Output = Script{ 889 StatementList: []StatementListItem{ 890 { 891 Statement: &Statement{ 892 ExpressionStatement: &Expression{ 893 Expressions: []AssignmentExpression{ 894 { 895 LeftHandSideExpression: litA.LogicalORExpression.LogicalANDExpression.BitwiseORExpression.BitwiseXORExpression.BitwiseANDExpression.EqualityExpression.RelationalExpression.ShiftExpression.AdditiveExpression.MultiplicativeExpression.ExponentiationExpression.UnaryExpression.UpdateExpression.LeftHandSideExpression, 896 AssignmentOperator: AssignmentAssign, 897 AssignmentExpression: &AssignmentExpression{ 898 ConditionalExpression: &bc, 899 Tokens: tk[4:21], 900 }, 901 Tokens: tk[:21], 902 }, 903 }, 904 Tokens: tk[:21], 905 }, 906 Tokens: tk[:21], 907 }, 908 Tokens: tk[:21], 909 }, 910 }, 911 Tokens: tk[:21], 912 } 913 }}, 914 {"await a", func(t *test, tk Tokens) { // 10 915 t.Err = Error{ 916 Err: Error{ 917 Err: ErrMissingSemiColon, 918 Parsing: "Statement", 919 Token: tk[1], 920 }, 921 Parsing: "StatementListItem", 922 Token: tk[0], 923 } 924 }}, 925 }, func(t *test) (Type, error) { 926 var s Script 927 err := s.parse(&t.Tokens) 928 return s, err 929 }) 930 } 931 932 func TestDeclaration(t *testing.T) { 933 doTests(t, []sourceFn{ 934 {`class`, func(t *test, tk Tokens) { // 1 935 t.Err = Error{ 936 Err: Error{ 937 Err: ErrNoIdentifier, 938 Parsing: "ClassDeclaration", 939 Token: tk[1], 940 }, 941 Parsing: "Declaration", 942 Token: tk[0], 943 } 944 }}, 945 {`class a{}`, func(t *test, tk Tokens) { // 2 946 t.Output = Declaration{ 947 ClassDeclaration: &ClassDeclaration{ 948 BindingIdentifier: &tk[2], 949 Tokens: tk[:5], 950 }, 951 Tokens: tk[:5], 952 } 953 }}, 954 {`const`, func(t *test, tk Tokens) { // 3 955 t.Err = Error{ 956 Err: Error{ 957 Err: Error{ 958 Err: ErrNoIdentifier, 959 Parsing: "LexicalBinding", 960 Token: tk[1], 961 }, 962 Parsing: "LexicalDeclaration", 963 Token: tk[1], 964 }, 965 Parsing: "Declaration", 966 Token: tk[0], 967 } 968 }}, 969 {`const a = 1;`, func(t *test, tk Tokens) { // 4 970 lit1 := makeConditionLiteral(tk, 6) 971 t.Output = Declaration{ 972 LexicalDeclaration: &LexicalDeclaration{ 973 LetOrConst: Const, 974 BindingList: []LexicalBinding{ 975 { 976 BindingIdentifier: &tk[2], 977 Initializer: &AssignmentExpression{ 978 ConditionalExpression: &lit1, 979 Tokens: tk[6:7], 980 }, 981 Tokens: tk[2:7], 982 }, 983 }, 984 Tokens: tk[:8], 985 }, 986 Tokens: tk[:8], 987 } 988 }}, 989 {`let`, func(t *test, tk Tokens) { // 5 990 t.Err = Error{ 991 Err: Error{ 992 Err: Error{ 993 Err: ErrNoIdentifier, 994 Parsing: "LexicalBinding", 995 Token: tk[1], 996 }, 997 Parsing: "LexicalDeclaration", 998 Token: tk[1], 999 }, 1000 Parsing: "Declaration", 1001 Token: tk[0], 1002 } 1003 }}, 1004 {`let a = 1;`, func(t *test, tk Tokens) { // 4 1005 lit1 := makeConditionLiteral(tk, 6) 1006 t.Output = Declaration{ 1007 LexicalDeclaration: &LexicalDeclaration{ 1008 LetOrConst: Let, 1009 BindingList: []LexicalBinding{ 1010 { 1011 BindingIdentifier: &tk[2], 1012 Initializer: &AssignmentExpression{ 1013 ConditionalExpression: &lit1, 1014 Tokens: tk[6:7], 1015 }, 1016 Tokens: tk[2:7], 1017 }, 1018 }, 1019 Tokens: tk[:8], 1020 }, 1021 Tokens: tk[:8], 1022 } 1023 }}, 1024 {`function`, func(t *test, tk Tokens) { // 7 { 1025 t.Err = Error{ 1026 Err: Error{ 1027 Err: ErrNoIdentifier, 1028 Parsing: "FunctionDeclaration", 1029 Token: tk[1], 1030 }, 1031 Parsing: "Declaration", 1032 Token: tk[0], 1033 } 1034 }}, 1035 {`function a(){}`, func(t *test, tk Tokens) { // 8 1036 t.Output = Declaration{ 1037 FunctionDeclaration: &FunctionDeclaration{ 1038 BindingIdentifier: &tk[2], 1039 FormalParameters: FormalParameters{ 1040 Tokens: tk[3:5], 1041 }, 1042 FunctionBody: Block{ 1043 Tokens: tk[5:7], 1044 }, 1045 Tokens: tk[:7], 1046 }, 1047 Tokens: tk[:7], 1048 } 1049 }}, 1050 {`wrong`, func(t *test, tk Tokens) { // 9 1051 t.Err = Error{ 1052 Err: ErrInvalidDeclaration, 1053 Parsing: "Declaration", 1054 Token: tk[0], 1055 } 1056 }}, 1057 }, func(t *test) (Type, error) { 1058 var d Declaration 1059 err := d.parse(&t.Tokens, t.Yield, t.Await) 1060 return d, err 1061 }) 1062 } 1063 1064 func TestLexicalDeclaration(t *testing.T) { 1065 doTests(t, []sourceFn{ 1066 {`wrong`, func(t *test, tk Tokens) { // 1 1067 t.Err = Error{ 1068 Err: ErrInvalidLexicalDeclaration, 1069 Parsing: "LexicalDeclaration", 1070 Token: tk[0], 1071 } 1072 }}, 1073 {`const`, func(t *test, tk Tokens) { // 2 1074 t.Err = Error{ 1075 Err: Error{ 1076 Err: ErrNoIdentifier, 1077 Parsing: "LexicalBinding", 1078 Token: tk[1], 1079 }, 1080 Parsing: "LexicalDeclaration", 1081 Token: tk[1], 1082 } 1083 }}, 1084 {"const\na", func(t *test, tk Tokens) { // 3 1085 t.Output = LexicalDeclaration{ 1086 LetOrConst: Const, 1087 BindingList: []LexicalBinding{ 1088 { 1089 BindingIdentifier: &tk[2], 1090 Tokens: tk[2:3], 1091 }, 1092 }, 1093 Tokens: tk[:3], 1094 } 1095 }}, 1096 {"const\na\n", func(t *test, tk Tokens) { // 4 1097 t.Output = LexicalDeclaration{ 1098 LetOrConst: Const, 1099 BindingList: []LexicalBinding{ 1100 { 1101 BindingIdentifier: &tk[2], 1102 Tokens: tk[2:3], 1103 }, 1104 }, 1105 Tokens: tk[:3], 1106 } 1107 }}, 1108 {"const\na;", func(t *test, tk Tokens) { // 5 1109 t.Output = LexicalDeclaration{ 1110 LetOrConst: Const, 1111 BindingList: []LexicalBinding{ 1112 { 1113 BindingIdentifier: &tk[2], 1114 Tokens: tk[2:3], 1115 }, 1116 }, 1117 Tokens: tk[:4], 1118 } 1119 }}, 1120 {"const\na,\nb;", func(t *test, tk Tokens) { // 6 1121 t.Output = LexicalDeclaration{ 1122 LetOrConst: Const, 1123 BindingList: []LexicalBinding{ 1124 { 1125 BindingIdentifier: &tk[2], 1126 Tokens: tk[2:3], 1127 }, 1128 { 1129 BindingIdentifier: &tk[5], 1130 Tokens: tk[5:6], 1131 }, 1132 }, 1133 Tokens: tk[:7], 1134 } 1135 }}, 1136 {"const \n a;", func(t *test, tk Tokens) { // 7 1137 t.Output = LexicalDeclaration{ 1138 LetOrConst: Const, 1139 BindingList: []LexicalBinding{ 1140 { 1141 BindingIdentifier: &tk[4], 1142 Tokens: tk[4:5], 1143 }, 1144 }, 1145 Tokens: tk[:6], 1146 } 1147 }}, 1148 {"const \n a, \n b;", func(t *test, tk Tokens) { // 8 1149 t.Output = LexicalDeclaration{ 1150 LetOrConst: Const, 1151 BindingList: []LexicalBinding{ 1152 { 1153 BindingIdentifier: &tk[4], 1154 Tokens: tk[4:5], 1155 }, 1156 { 1157 BindingIdentifier: &tk[9], 1158 Tokens: tk[9:10], 1159 }, 1160 }, 1161 Tokens: tk[:11], 1162 } 1163 }}, 1164 {`let`, func(t *test, tk Tokens) { // 9 1165 t.Err = Error{ 1166 Err: Error{ 1167 Err: ErrNoIdentifier, 1168 Parsing: "LexicalBinding", 1169 Token: tk[1], 1170 }, 1171 Parsing: "LexicalDeclaration", 1172 Token: tk[1], 1173 } 1174 }}, 1175 {"let\na", func(t *test, tk Tokens) { // 10 1176 t.Output = LexicalDeclaration{ 1177 LetOrConst: Let, 1178 BindingList: []LexicalBinding{ 1179 { 1180 BindingIdentifier: &tk[2], 1181 Tokens: tk[2:3], 1182 }, 1183 }, 1184 Tokens: tk[:3], 1185 } 1186 }}, 1187 {"let\na\n", func(t *test, tk Tokens) { // 11 1188 t.Output = LexicalDeclaration{ 1189 LetOrConst: Let, 1190 BindingList: []LexicalBinding{ 1191 { 1192 BindingIdentifier: &tk[2], 1193 Tokens: tk[2:3], 1194 }, 1195 }, 1196 Tokens: tk[:3], 1197 } 1198 }}, 1199 {"let\na;", func(t *test, tk Tokens) { // 12 1200 t.Output = LexicalDeclaration{ 1201 LetOrConst: Let, 1202 BindingList: []LexicalBinding{ 1203 { 1204 BindingIdentifier: &tk[2], 1205 Tokens: tk[2:3], 1206 }, 1207 }, 1208 Tokens: tk[:4], 1209 } 1210 }}, 1211 {"let\na,\nb;", func(t *test, tk Tokens) { // 13 1212 t.Output = LexicalDeclaration{ 1213 LetOrConst: Let, 1214 BindingList: []LexicalBinding{ 1215 { 1216 BindingIdentifier: &tk[2], 1217 Tokens: tk[2:3], 1218 }, 1219 { 1220 BindingIdentifier: &tk[5], 1221 Tokens: tk[5:6], 1222 }, 1223 }, 1224 Tokens: tk[:7], 1225 } 1226 }}, 1227 {"let \n a;", func(t *test, tk Tokens) { // 14 1228 t.Output = LexicalDeclaration{ 1229 LetOrConst: Let, 1230 BindingList: []LexicalBinding{ 1231 { 1232 BindingIdentifier: &tk[4], 1233 Tokens: tk[4:5], 1234 }, 1235 }, 1236 Tokens: tk[:6], 1237 } 1238 }}, 1239 {"let \n a, \n b;", func(t *test, tk Tokens) { // 15 1240 t.Output = LexicalDeclaration{ 1241 LetOrConst: Let, 1242 BindingList: []LexicalBinding{ 1243 { 1244 BindingIdentifier: &tk[4], 1245 Tokens: tk[4:5], 1246 }, 1247 { 1248 BindingIdentifier: &tk[9], 1249 Tokens: tk[9:10], 1250 }, 1251 }, 1252 Tokens: tk[:11], 1253 } 1254 }}, 1255 {"let\na b;", func(t *test, tk Tokens) { // 12 1256 t.Err = Error{ 1257 Err: ErrInvalidLexicalDeclaration, 1258 Parsing: "LexicalDeclaration", 1259 Token: tk[3], 1260 } 1261 }}, 1262 }, func(t *test) (Type, error) { // 13 1263 var ld LexicalDeclaration 1264 err := ld.parse(&t.Tokens, t.In, t.Yield, t.Await) 1265 return ld, err 1266 }) 1267 } 1268 1269 func TestLexicalBinding(t *testing.T) { 1270 doTests(t, []sourceFn{ 1271 {``, func(t *test, tk Tokens) { // 1 1272 t.Err = Error{ 1273 Err: ErrNoIdentifier, 1274 Parsing: "LexicalBinding", 1275 Token: tk[0], 1276 } 1277 }}, 1278 {`a`, func(t *test, tk Tokens) { // 2 1279 t.Output = LexicalBinding{ 1280 BindingIdentifier: &tk[0], 1281 Tokens: tk[:1], 1282 } 1283 }}, 1284 {"a\n=\n1", func(t *test, tk Tokens) { // 3 1285 lit1 := makeConditionLiteral(tk, 4) 1286 t.Output = LexicalBinding{ 1287 BindingIdentifier: &tk[0], 1288 Initializer: &AssignmentExpression{ 1289 ConditionalExpression: &lit1, 1290 Tokens: tk[4:5], 1291 }, 1292 Tokens: tk[:5], 1293 } 1294 }}, 1295 {`[a]`, func(t *test, tk Tokens) { // 4 1296 t.Err = Error{ 1297 Err: ErrMissingInitializer, 1298 Parsing: "LexicalBinding", 1299 Token: tk[3], 1300 } 1301 }}, 1302 {"[a]\n=\n", func(t *test, tk Tokens) { // 5 1303 t.Err = Error{ 1304 Err: assignmentError(tk[6]), 1305 Parsing: "LexicalBinding", 1306 Token: tk[6], 1307 } 1308 }}, 1309 {"[]\n=\na", func(t *test, tk Tokens) { // 6 1310 litA := makeConditionLiteral(tk, 5) 1311 t.Output = LexicalBinding{ 1312 ArrayBindingPattern: &ArrayBindingPattern{ 1313 Tokens: tk[:2], 1314 }, 1315 Initializer: &AssignmentExpression{ 1316 ConditionalExpression: &litA, 1317 Tokens: tk[5:6], 1318 }, 1319 Tokens: tk[:6], 1320 } 1321 }}, 1322 {`{a}`, func(t *test, tk Tokens) { // 7 1323 t.Err = Error{ 1324 Err: ErrMissingInitializer, 1325 Parsing: "LexicalBinding", 1326 Token: tk[3], 1327 } 1328 }}, 1329 {"{a}\n=\n", func(t *test, tk Tokens) { // 8 1330 t.Err = Error{ 1331 Err: assignmentError(tk[6]), 1332 Parsing: "LexicalBinding", 1333 Token: tk[6], 1334 } 1335 }}, 1336 {"{}\n=\na", func(t *test, tk Tokens) { // 9 1337 litA := makeConditionLiteral(tk, 5) 1338 t.Output = LexicalBinding{ 1339 ObjectBindingPattern: &ObjectBindingPattern{ 1340 Tokens: tk[:2], 1341 }, 1342 Initializer: &AssignmentExpression{ 1343 ConditionalExpression: &litA, 1344 Tokens: tk[5:6], 1345 }, 1346 Tokens: tk[:6], 1347 } 1348 }}, 1349 {`[!]`, func(t *test, tk Tokens) { // 10 1350 t.Err = Error{ 1351 Err: Error{ 1352 Err: Error{ 1353 Err: ErrNoIdentifier, 1354 Parsing: "BindingElement", 1355 Token: tk[1], 1356 }, 1357 Parsing: "ArrayBindingPattern", 1358 Token: tk[1], 1359 }, 1360 Parsing: "LexicalBinding", 1361 Token: tk[0], 1362 } 1363 }}, 1364 {`{!}`, func(t *test, tk Tokens) { // 11 1365 t.Err = Error{ 1366 Err: Error{ 1367 Err: Error{ 1368 Err: Error{ 1369 Err: ErrInvalidPropertyName, 1370 Parsing: "PropertyName", 1371 Token: tk[1], 1372 }, 1373 Parsing: "BindingProperty", 1374 Token: tk[1], 1375 }, 1376 Parsing: "ObjectBindingPattern", 1377 Token: tk[1], 1378 }, 1379 Parsing: "LexicalBinding", 1380 Token: tk[0], 1381 } 1382 }}, 1383 }, func(t *test) (Type, error) { 1384 var lb LexicalBinding 1385 err := lb.parse(&t.Tokens, t.In, t.Yield, t.Await) 1386 return lb, err 1387 }) 1388 } 1389 1390 func TestArrayBindingPattern(t *testing.T) { 1391 doTests(t, []sourceFn{ 1392 {``, func(t *test, tk Tokens) { // 1 1393 t.Err = Error{ 1394 Err: ErrMissingOpeningBracket, 1395 Parsing: "ArrayBindingPattern", 1396 Token: tk[0], 1397 } 1398 }}, 1399 {`{}`, func(t *test, tk Tokens) { // 2 1400 t.Err = Error{ 1401 Err: ErrMissingOpeningBracket, 1402 Parsing: "ArrayBindingPattern", 1403 Token: tk[0], 1404 } 1405 }}, 1406 {"[\n]", func(t *test, tk Tokens) { // 3 1407 t.Output = ArrayBindingPattern{ 1408 Tokens: tk[:3], 1409 } 1410 }}, 1411 {"[\nnull\n]", func(t *test, tk Tokens) { // 4 1412 t.Err = Error{ 1413 Err: Error{ 1414 Err: ErrNoIdentifier, 1415 Parsing: "BindingElement", 1416 Token: tk[2], 1417 }, 1418 Parsing: "ArrayBindingPattern", 1419 Token: tk[2], 1420 } 1421 }}, 1422 {"[\n,\n]", func(t *test, tk Tokens) { // 5 1423 t.Output = ArrayBindingPattern{ 1424 BindingElementList: []BindingElement{ 1425 {}, 1426 }, 1427 Tokens: tk[:5], 1428 } 1429 }}, 1430 {"[\n,\n]", func(t *test, tk Tokens) { // 6 1431 t.Output = ArrayBindingPattern{ 1432 BindingElementList: []BindingElement{ 1433 {}, 1434 }, 1435 Tokens: tk[:5], 1436 } 1437 }}, 1438 {"[\n,\n,\n]", func(t *test, tk Tokens) { // 7 1439 t.Output = ArrayBindingPattern{ 1440 BindingElementList: []BindingElement{ 1441 {}, 1442 {}, 1443 }, 1444 Tokens: tk[:7], 1445 } 1446 }}, 1447 {"[\n...\na\n]", func(t *test, tk Tokens) { // 8 1448 t.Output = ArrayBindingPattern{ 1449 BindingRestElement: &BindingElement{ 1450 SingleNameBinding: &tk[4], 1451 Tokens: tk[4:5], 1452 }, 1453 Tokens: tk[:7], 1454 } 1455 }}, 1456 {"[\n...\nnull\n]", func(t *test, tk Tokens) { // 9 1457 t.Err = Error{ 1458 Err: Error{ 1459 Err: ErrNoIdentifier, 1460 Parsing: "BindingElement", 1461 Token: tk[4], 1462 }, 1463 Parsing: "ArrayBindingPattern", 1464 Token: tk[4], 1465 } 1466 }}, 1467 {"[\n...\na\n,]", func(t *test, tk Tokens) { // 10 1468 t.Err = Error{ 1469 Err: ErrMissingClosingBracket, 1470 Parsing: "ArrayBindingPattern", 1471 Token: tk[6], 1472 } 1473 }}, 1474 {"[\na\n]", func(t *test, tk Tokens) { // 11 1475 t.Output = ArrayBindingPattern{ 1476 BindingElementList: []BindingElement{ 1477 { 1478 SingleNameBinding: &tk[2], 1479 Tokens: tk[2:3], 1480 }, 1481 }, 1482 Tokens: tk[:5], 1483 } 1484 }}, 1485 {"[\na\n,\n]", func(t *test, tk Tokens) { // 12 1486 t.Output = ArrayBindingPattern{ 1487 BindingElementList: []BindingElement{ 1488 { 1489 SingleNameBinding: &tk[2], 1490 Tokens: tk[2:3], 1491 }, 1492 }, 1493 Tokens: tk[:7], 1494 } 1495 }}, 1496 {"[\na\n,\n,\n]", func(t *test, tk Tokens) { // 13 1497 t.Output = ArrayBindingPattern{ 1498 BindingElementList: []BindingElement{ 1499 { 1500 SingleNameBinding: &tk[2], 1501 Tokens: tk[2:3], 1502 }, 1503 {}, 1504 }, 1505 Tokens: tk[:9], 1506 } 1507 }}, 1508 {"[\n,\na\n]", func(t *test, tk Tokens) { // 14 1509 t.Output = ArrayBindingPattern{ 1510 BindingElementList: []BindingElement{ 1511 {}, 1512 { 1513 SingleNameBinding: &tk[4], 1514 Tokens: tk[4:5], 1515 }, 1516 }, 1517 Tokens: tk[:7], 1518 } 1519 }}, 1520 {"[\n,\nnull\n]", func(t *test, tk Tokens) { // 15 1521 t.Err = Error{ 1522 Err: Error{ 1523 Err: ErrNoIdentifier, 1524 Parsing: "BindingElement", 1525 Token: tk[4], 1526 }, 1527 Parsing: "ArrayBindingPattern", 1528 Token: tk[4], 1529 } 1530 }}, 1531 {"[\na,\n,\n...\nb\n]", func(t *test, tk Tokens) { // 16 1532 t.Output = ArrayBindingPattern{ 1533 BindingElementList: []BindingElement{ 1534 { 1535 SingleNameBinding: &tk[2], 1536 Tokens: tk[2:3], 1537 }, 1538 {}, 1539 }, 1540 BindingRestElement: &BindingElement{ 1541 SingleNameBinding: &tk[9], 1542 Tokens: tk[9:10], 1543 }, 1544 Tokens: tk[:12], 1545 } 1546 }}, 1547 {"[\na\nb\n]", func(t *test, tk Tokens) { // 17 1548 t.Err = Error{ 1549 Err: ErrMissingComma, 1550 Parsing: "ArrayBindingPattern", 1551 Token: tk[4], 1552 } 1553 }}, 1554 }, func(t *test) (Type, error) { 1555 var ab ArrayBindingPattern 1556 err := ab.parse(&t.Tokens, t.Yield, t.Await) 1557 return ab, err 1558 }) 1559 } 1560 1561 func TestObjectBindingPattern(t *testing.T) { 1562 doTests(t, []sourceFn{ 1563 {``, func(t *test, tk Tokens) { // 1 1564 t.Err = Error{ 1565 Err: ErrMissingOpeningBrace, 1566 Parsing: "ObjectBindingPattern", 1567 Token: tk[0], 1568 } 1569 }}, 1570 {`[]`, func(t *test, tk Tokens) { // 2 1571 t.Err = Error{ 1572 Err: ErrMissingOpeningBrace, 1573 Parsing: "ObjectBindingPattern", 1574 Token: tk[0], 1575 } 1576 }}, 1577 {"{\n}", func(t *test, tk Tokens) { // 3 1578 t.Output = ObjectBindingPattern{ 1579 Tokens: tk[:3], 1580 } 1581 }}, 1582 {"{\n...\nnull\n}", func(t *test, tk Tokens) { // 4 1583 t.Err = Error{ 1584 Err: ErrNoIdentifier, 1585 Parsing: "ObjectBindingPattern", 1586 Token: tk[4], 1587 } 1588 }}, 1589 {"{\n...\na\n}", func(t *test, tk Tokens) { // 5 1590 t.Output = ObjectBindingPattern{ 1591 BindingRestProperty: &tk[4], 1592 Tokens: tk[:7], 1593 } 1594 }}, 1595 {"{\n...\na\nb\n}", func(t *test, tk Tokens) { // 6 1596 t.Err = Error{ 1597 Err: ErrMissingClosingBrace, 1598 Parsing: "ObjectBindingPattern", 1599 Token: tk[6], 1600 } 1601 }}, 1602 {"{\nnull\n}", func(t *test, tk Tokens) { // 7 1603 t.Err = Error{ 1604 Err: Error{ 1605 Err: Error{ 1606 Err: ErrInvalidPropertyName, 1607 Parsing: "PropertyName", 1608 Token: tk[2], 1609 }, 1610 Parsing: "BindingProperty", 1611 Token: tk[2], 1612 }, 1613 Parsing: "ObjectBindingPattern", 1614 Token: tk[2], 1615 } 1616 }}, 1617 {"{\na\n}", func(t *test, tk Tokens) { // 8 1618 t.Output = ObjectBindingPattern{ 1619 BindingPropertyList: []BindingProperty{ 1620 { 1621 PropertyName: PropertyName{ 1622 LiteralPropertyName: &tk[2], 1623 Tokens: tk[2:3], 1624 }, 1625 BindingElement: BindingElement{ 1626 SingleNameBinding: &tk[2], 1627 Tokens: tk[2:3], 1628 }, 1629 Tokens: tk[2:3], 1630 }, 1631 }, 1632 Tokens: tk[:5], 1633 } 1634 }}, 1635 {"{\na\nb\n}", func(t *test, tk Tokens) { // 9 1636 t.Err = Error{ 1637 Err: ErrMissingComma, 1638 Parsing: "ObjectBindingPattern", 1639 Token: tk[4], 1640 } 1641 }}, 1642 {"{\na,\nb\n}", func(t *test, tk Tokens) { // 10 1643 t.Output = ObjectBindingPattern{ 1644 BindingPropertyList: []BindingProperty{ 1645 { 1646 PropertyName: PropertyName{ 1647 LiteralPropertyName: &tk[2], 1648 Tokens: tk[2:3], 1649 }, 1650 BindingElement: BindingElement{ 1651 SingleNameBinding: &tk[2], 1652 Tokens: tk[2:3], 1653 }, 1654 Tokens: tk[2:3], 1655 }, 1656 { 1657 PropertyName: PropertyName{ 1658 LiteralPropertyName: &tk[5], 1659 Tokens: tk[5:6], 1660 }, 1661 BindingElement: BindingElement{ 1662 SingleNameBinding: &tk[5], 1663 Tokens: tk[5:6], 1664 }, 1665 Tokens: tk[5:6], 1666 }, 1667 }, 1668 Tokens: tk[:8], 1669 } 1670 }}, 1671 {"{\na,\n...\nb\n}", func(t *test, tk Tokens) { // 11 1672 t.Output = ObjectBindingPattern{ 1673 BindingPropertyList: []BindingProperty{ 1674 { 1675 PropertyName: PropertyName{ 1676 LiteralPropertyName: &tk[2], 1677 Tokens: tk[2:3], 1678 }, 1679 BindingElement: BindingElement{ 1680 SingleNameBinding: &tk[2], 1681 Tokens: tk[2:3], 1682 }, 1683 Tokens: tk[2:3], 1684 }, 1685 }, 1686 BindingRestProperty: &tk[7], 1687 Tokens: tk[:10], 1688 } 1689 }}, 1690 }, func(t *test) (Type, error) { 1691 var ob ObjectBindingPattern 1692 err := ob.parse(&t.Tokens, t.Yield, t.Await) 1693 return ob, err 1694 }) 1695 } 1696 1697 func TestBindingProperty(t *testing.T) { 1698 doTests(t, []sourceFn{ 1699 {``, func(t *test, tk Tokens) { // 1 1700 t.Err = Error{ 1701 Err: Error{ 1702 Err: ErrInvalidPropertyName, 1703 Parsing: "PropertyName", 1704 Token: tk[0], 1705 }, 1706 Parsing: "BindingProperty", 1707 Token: tk[0], 1708 } 1709 }}, 1710 {`null`, func(t *test, tk Tokens) { // 2 1711 t.Err = Error{ 1712 Err: Error{ 1713 Err: ErrInvalidPropertyName, 1714 Parsing: "PropertyName", 1715 Token: tk[0], 1716 }, 1717 Parsing: "BindingProperty", 1718 Token: tk[0], 1719 } 1720 }}, 1721 {`a`, func(t *test, tk Tokens) { // 3 1722 t.Output = BindingProperty{ 1723 PropertyName: PropertyName{ 1724 LiteralPropertyName: &tk[0], 1725 Tokens: tk[:1], 1726 }, 1727 BindingElement: BindingElement{ 1728 SingleNameBinding: &tk[0], 1729 Tokens: tk[:1], 1730 }, 1731 Tokens: tk[:1], 1732 } 1733 }}, 1734 {"a\n=\n", func(t *test, tk Tokens) { // 4 1735 t.Err = Error{ 1736 Err: Error{ 1737 Err: assignmentError(tk[4]), 1738 Parsing: "BindingElement", 1739 Token: tk[4], 1740 }, 1741 Parsing: "BindingProperty", 1742 Token: tk[0], 1743 } 1744 }}, 1745 {"a\n=\n1", func(t *test, tk Tokens) { // 5 1746 lit1 := makeConditionLiteral(tk, 4) 1747 t.Output = BindingProperty{ 1748 PropertyName: PropertyName{ 1749 LiteralPropertyName: &tk[0], 1750 Tokens: tk[:1], 1751 }, 1752 BindingElement: BindingElement{ 1753 SingleNameBinding: &tk[0], 1754 Initializer: &AssignmentExpression{ 1755 ConditionalExpression: &lit1, 1756 Tokens: tk[4:5], 1757 }, 1758 Tokens: tk[:5], 1759 }, 1760 Tokens: tk[:5], 1761 } 1762 }}, 1763 {"a\n:\n", func(t *test, tk Tokens) { // 6 1764 t.Err = Error{ 1765 Err: Error{ 1766 Err: ErrNoIdentifier, 1767 Parsing: "BindingElement", 1768 Token: tk[4], 1769 }, 1770 Parsing: "BindingProperty", 1771 Token: tk[4], 1772 } 1773 }}, 1774 {"'a'", func(t *test, tk Tokens) { // 7 1775 t.Err = Error{ 1776 Err: ErrMissingColon, 1777 Parsing: "BindingProperty", 1778 Token: tk[1], 1779 } 1780 }}, 1781 {"a\n:\n''", func(t *test, tk Tokens) { // 8 1782 t.Err = Error{ 1783 Err: Error{ 1784 Err: ErrNoIdentifier, 1785 Parsing: "BindingElement", 1786 Token: tk[4], 1787 }, 1788 Parsing: "BindingProperty", 1789 Token: tk[4], 1790 } 1791 }}, 1792 {"a\n:\nb", func(t *test, tk Tokens) { // 9 1793 t.Output = BindingProperty{ 1794 PropertyName: PropertyName{ 1795 LiteralPropertyName: &tk[0], 1796 Tokens: tk[:1], 1797 }, 1798 BindingElement: BindingElement{ 1799 SingleNameBinding: &tk[4], 1800 Tokens: tk[4:5], 1801 }, 1802 Tokens: tk[:5], 1803 } 1804 }}, 1805 }, func(t *test) (Type, error) { 1806 var bp BindingProperty 1807 err := bp.parse(&t.Tokens, t.Yield, t.Await) 1808 return bp, err 1809 }) 1810 } 1811 1812 func TestArrayLiteral(t *testing.T) { 1813 doTests(t, []sourceFn{ 1814 {``, func(t *test, tk Tokens) { // 1 1815 t.Err = Error{ 1816 Err: ErrMissingOpeningBracket, 1817 Parsing: "ArrayLiteral", 1818 Token: tk[0], 1819 } 1820 }}, 1821 {`{}`, func(t *test, tk Tokens) { // 2 1822 t.Err = Error{ 1823 Err: ErrMissingOpeningBracket, 1824 Parsing: "ArrayLiteral", 1825 Token: tk[0], 1826 } 1827 }}, 1828 {"[\n]", func(t *test, tk Tokens) { // 3 1829 t.Output = ArrayLiteral{ 1830 Tokens: tk[:3], 1831 } 1832 }}, 1833 {"[\n,\n]", func(t *test, tk Tokens) { // 4 1834 t.Output = ArrayLiteral{ 1835 ElementList: []ArrayElement{ 1836 {}, 1837 }, 1838 Tokens: tk[:5], 1839 } 1840 }}, 1841 {"[\n,\n,\n]", func(t *test, tk Tokens) { // 5 1842 t.Output = ArrayLiteral{ 1843 ElementList: []ArrayElement{ 1844 {}, 1845 {}, 1846 }, 1847 Tokens: tk[:7], 1848 } 1849 }}, 1850 {"[\n...\n]", func(t *test, tk Tokens) { // 6 1851 t.Err = Error{ 1852 Err: Error{ 1853 Err: assignmentError(tk[4]), 1854 Parsing: "ArrayElement", 1855 Token: tk[2], 1856 }, 1857 Parsing: "ArrayLiteral", 1858 Token: tk[2], 1859 } 1860 }}, 1861 {"[\n...\na\n]", func(t *test, tk Tokens) { // 7 1862 litA := makeConditionLiteral(tk, 4) 1863 t.Output = ArrayLiteral{ 1864 ElementList: []ArrayElement{ 1865 { 1866 Spread: true, 1867 AssignmentExpression: AssignmentExpression{ 1868 ConditionalExpression: &litA, 1869 Tokens: tk[4:5], 1870 }, 1871 Tokens: tk[2:5], 1872 }, 1873 }, 1874 Tokens: tk[:7], 1875 } 1876 }}, 1877 {"[\n...\na\nb]", func(t *test, tk Tokens) { // 8 1878 t.Err = Error{ 1879 Err: ErrMissingComma, 1880 Parsing: "ArrayLiteral", 1881 Token: tk[6], 1882 } 1883 }}, 1884 {"[\n*\n]", func(t *test, tk Tokens) { // 9 1885 t.Err = Error{ 1886 Err: Error{ 1887 Err: assignmentError(tk[2]), 1888 Parsing: "ArrayElement", 1889 Token: tk[2], 1890 }, 1891 Parsing: "ArrayLiteral", 1892 Token: tk[2], 1893 } 1894 }}, 1895 {"[\na\n]", func(t *test, tk Tokens) { // 10 1896 litA := makeConditionLiteral(tk, 2) 1897 t.Output = ArrayLiteral{ 1898 ElementList: []ArrayElement{ 1899 { 1900 AssignmentExpression: AssignmentExpression{ 1901 ConditionalExpression: &litA, 1902 Tokens: tk[2:3], 1903 }, 1904 Tokens: tk[2:3], 1905 }, 1906 }, 1907 Tokens: tk[:5], 1908 } 1909 }}, 1910 {"[\na\nb\n]", func(t *test, tk Tokens) { // 11 1911 t.Err = Error{ 1912 Err: ErrMissingComma, 1913 Parsing: "ArrayLiteral", 1914 Token: tk[4], 1915 } 1916 }}, 1917 {"[\na\n,\nb\n]", func(t *test, tk Tokens) { // 12 1918 litA := makeConditionLiteral(tk, 2) 1919 litB := makeConditionLiteral(tk, 6) 1920 t.Output = ArrayLiteral{ 1921 ElementList: []ArrayElement{ 1922 { 1923 AssignmentExpression: AssignmentExpression{ 1924 ConditionalExpression: &litA, 1925 Tokens: tk[2:3], 1926 }, 1927 Tokens: tk[2:3], 1928 }, 1929 { 1930 AssignmentExpression: AssignmentExpression{ 1931 ConditionalExpression: &litB, 1932 Tokens: tk[6:7], 1933 }, 1934 Tokens: tk[6:7], 1935 }, 1936 }, 1937 Tokens: tk[:9], 1938 } 1939 }}, 1940 {"[\na\n,\n,\nb\n,\n,\n...\nc\n]", func(t *test, tk Tokens) { // 13 1941 litA := makeConditionLiteral(tk, 2) 1942 litB := makeConditionLiteral(tk, 8) 1943 litC := makeConditionLiteral(tk, 16) 1944 t.Output = ArrayLiteral{ 1945 ElementList: []ArrayElement{ 1946 { 1947 AssignmentExpression: AssignmentExpression{ 1948 ConditionalExpression: &litA, 1949 Tokens: tk[2:3], 1950 }, 1951 Tokens: tk[2:3], 1952 }, 1953 {}, 1954 { 1955 AssignmentExpression: AssignmentExpression{ 1956 ConditionalExpression: &litB, 1957 Tokens: tk[8:9], 1958 }, 1959 Tokens: tk[8:9], 1960 }, 1961 {}, 1962 { 1963 Spread: true, 1964 AssignmentExpression: AssignmentExpression{ 1965 ConditionalExpression: &litC, 1966 Tokens: tk[16:17], 1967 }, 1968 Tokens: tk[14:17], 1969 }, 1970 }, 1971 Tokens: tk[:19], 1972 } 1973 }}, 1974 {"[...a, b]", func(t *test, tk Tokens) { // 14 1975 litA := makeConditionLiteral(tk, 2) 1976 litB := makeConditionLiteral(tk, 5) 1977 t.Output = ArrayLiteral{ 1978 ElementList: []ArrayElement{ 1979 { 1980 Spread: true, 1981 AssignmentExpression: AssignmentExpression{ 1982 ConditionalExpression: &litA, 1983 Tokens: tk[2:3], 1984 }, 1985 Tokens: tk[1:3], 1986 }, 1987 { 1988 AssignmentExpression: AssignmentExpression{ 1989 ConditionalExpression: &litB, 1990 Tokens: tk[5:6], 1991 }, 1992 Tokens: tk[5:6], 1993 }, 1994 }, 1995 Tokens: tk[:7], 1996 } 1997 }}, 1998 }, func(t *test) (Type, error) { 1999 var al ArrayLiteral 2000 err := al.parse(&t.Tokens, t.Yield, t.Await) 2001 return al, err 2002 }) 2003 } 2004 2005 func TestObjectLiteral(t *testing.T) { 2006 doTests(t, []sourceFn{ 2007 {``, func(t *test, tk Tokens) { // 1 2008 t.Err = Error{ 2009 Err: ErrMissingOpeningBrace, 2010 Parsing: "ObjectLiteral", 2011 Token: tk[0], 2012 } 2013 }}, 2014 {`[]`, func(t *test, tk Tokens) { // 2 2015 t.Err = Error{ 2016 Err: ErrMissingOpeningBrace, 2017 Parsing: "ObjectLiteral", 2018 Token: tk[0], 2019 } 2020 }}, 2021 {"{\n}", func(t *test, tk Tokens) { // 3 2022 t.Output = ObjectLiteral{ 2023 Tokens: tk[:3], 2024 } 2025 }}, 2026 {"{\n,\n}", func(t *test, tk Tokens) { // 4 2027 t.Err = Error{ 2028 Err: Error{ 2029 Err: Error{ 2030 Err: ErrInvalidPropertyName, 2031 Parsing: "PropertyName", 2032 Token: tk[2], 2033 }, 2034 Parsing: "PropertyDefinition", 2035 Token: tk[2], 2036 }, 2037 Parsing: "ObjectLiteral", 2038 Token: tk[2], 2039 } 2040 }}, 2041 {"{\na\n}", func(t *test, tk Tokens) { // 5 2042 litA := makeConditionLiteral(tk, 2) 2043 t.Output = ObjectLiteral{ 2044 PropertyDefinitionList: []PropertyDefinition{ 2045 { 2046 PropertyName: &PropertyName{ 2047 LiteralPropertyName: &tk[2], 2048 Tokens: tk[2:3], 2049 }, 2050 AssignmentExpression: &AssignmentExpression{ 2051 ConditionalExpression: &litA, 2052 Tokens: tk[2:3], 2053 }, 2054 Tokens: tk[2:3], 2055 }, 2056 }, 2057 Tokens: tk[:5], 2058 } 2059 }}, 2060 {"{\n...a\nb\n}", func(t *test, tk Tokens) { // 6 2061 t.Err = Error{ 2062 Err: ErrMissingComma, 2063 Parsing: "ObjectLiteral", 2064 Token: tk[5], 2065 } 2066 }}, 2067 {"{\na\n,\nb\n}", func(t *test, tk Tokens) { // 7 2068 litA := makeConditionLiteral(tk, 2) 2069 litB := makeConditionLiteral(tk, 6) 2070 t.Output = ObjectLiteral{ 2071 PropertyDefinitionList: []PropertyDefinition{ 2072 { 2073 PropertyName: &PropertyName{ 2074 LiteralPropertyName: &tk[2], 2075 Tokens: tk[2:3], 2076 }, 2077 AssignmentExpression: &AssignmentExpression{ 2078 ConditionalExpression: &litA, 2079 Tokens: tk[2:3], 2080 }, 2081 Tokens: tk[2:3], 2082 }, 2083 { 2084 PropertyName: &PropertyName{ 2085 LiteralPropertyName: &tk[6], 2086 Tokens: tk[6:7], 2087 }, 2088 AssignmentExpression: &AssignmentExpression{ 2089 ConditionalExpression: &litB, 2090 Tokens: tk[6:7], 2091 }, 2092 Tokens: tk[6:7], 2093 }, 2094 }, 2095 Tokens: tk[:9], 2096 } 2097 }}, 2098 }, func(t *test) (Type, error) { 2099 var ol ObjectLiteral 2100 err := ol.parse(&t.Tokens, t.Yield, t.Await) 2101 return ol, err 2102 }) 2103 } 2104 2105 func TestPropertyDefinition(t *testing.T) { 2106 doTests(t, []sourceFn{ 2107 {``, func(t *test, tk Tokens) { // 1 2108 t.Err = Error{ 2109 Err: Error{ 2110 Err: ErrInvalidPropertyName, 2111 Parsing: "PropertyName", 2112 Token: tk[0], 2113 }, 2114 Parsing: "PropertyDefinition", 2115 Token: tk[0], 2116 } 2117 }}, 2118 {`...`, func(t *test, tk Tokens) { // 2 2119 t.Err = Error{ 2120 Err: assignmentError(tk[1]), 2121 Parsing: "PropertyDefinition", 2122 Token: tk[1], 2123 } 2124 }}, 2125 {"...\na", func(t *test, tk Tokens) { // 3 2126 litA := makeConditionLiteral(tk, 2) 2127 t.Output = PropertyDefinition{ 2128 AssignmentExpression: &AssignmentExpression{ 2129 ConditionalExpression: &litA, 2130 Tokens: tk[2:3], 2131 }, 2132 Tokens: tk[:3], 2133 } 2134 }}, 2135 {"a\n,", func(t *test, tk Tokens) { // 4 2136 litA := makeConditionLiteral(tk, 0) 2137 t.Output = PropertyDefinition{ 2138 PropertyName: &PropertyName{ 2139 LiteralPropertyName: &tk[0], 2140 Tokens: tk[:1], 2141 }, 2142 AssignmentExpression: &AssignmentExpression{ 2143 ConditionalExpression: &litA, 2144 Tokens: tk[:1], 2145 }, 2146 Tokens: tk[:1], 2147 } 2148 }}, 2149 {"{\na\n}", func(t *test, tk Tokens) { // 5 2150 litA := makeConditionLiteral(tk, 2) 2151 t.Output = PropertyDefinition{ 2152 PropertyName: &PropertyName{ 2153 LiteralPropertyName: &tk[2], 2154 Tokens: tk[2:3], 2155 }, 2156 AssignmentExpression: &AssignmentExpression{ 2157 ConditionalExpression: &litA, 2158 Tokens: tk[2:3], 2159 }, 2160 Tokens: tk[2:3], 2161 } 2162 t.Tokens = jsParser(tk[2:2]) 2163 }}, 2164 {"a\n=\n", func(t *test, tk Tokens) { // 6 2165 t.Err = Error{ 2166 Err: assignmentError(tk[4]), 2167 Parsing: "PropertyDefinition", 2168 Token: tk[4], 2169 } 2170 }}, 2171 {"a\n=\nb", func(t *test, tk Tokens) { // 7 2172 litB := makeConditionLiteral(tk, 4) 2173 t.Output = PropertyDefinition{ 2174 IsCoverInitializedName: true, 2175 PropertyName: &PropertyName{ 2176 LiteralPropertyName: &tk[0], 2177 Tokens: tk[:1], 2178 }, 2179 AssignmentExpression: &AssignmentExpression{ 2180 ConditionalExpression: &litB, 2181 Tokens: tk[4:5], 2182 }, 2183 Tokens: tk[:5], 2184 } 2185 }}, 2186 {"a\n:\n", func(t *test, tk Tokens) { // 8 2187 t.Err = Error{ 2188 Err: assignmentError(tk[4]), 2189 Parsing: "PropertyDefinition", 2190 Token: tk[4], 2191 } 2192 }}, 2193 {"a\n:\nb", func(t *test, tk Tokens) { // 9 2194 litB := makeConditionLiteral(tk, 4) 2195 t.Output = PropertyDefinition{ 2196 PropertyName: &PropertyName{ 2197 LiteralPropertyName: &tk[0], 2198 Tokens: tk[:1], 2199 }, 2200 AssignmentExpression: &AssignmentExpression{ 2201 ConditionalExpression: &litB, 2202 Tokens: tk[4:5], 2203 }, 2204 Tokens: tk[:5], 2205 } 2206 }}, 2207 {"[\na\n]\n:\nb", func(t *test, tk Tokens) { // 10 2208 litA := makeConditionLiteral(tk, 2) 2209 litB := makeConditionLiteral(tk, 8) 2210 t.Output = PropertyDefinition{ 2211 PropertyName: &PropertyName{ 2212 ComputedPropertyName: &AssignmentExpression{ 2213 ConditionalExpression: &litA, 2214 Tokens: tk[2:3], 2215 }, 2216 Tokens: tk[:5], 2217 }, 2218 AssignmentExpression: &AssignmentExpression{ 2219 ConditionalExpression: &litB, 2220 Tokens: tk[8:9], 2221 }, 2222 Tokens: tk[:9], 2223 } 2224 }}, 2225 {"[\na\n]\n", func(t *test, tk Tokens) { // 11 2226 t.Err = Error{ 2227 Err: Error{ 2228 Err: Error{ 2229 Err: ErrMissingOpeningParenthesis, 2230 Parsing: "FormalParameters", 2231 Token: tk[6], 2232 }, 2233 Parsing: "MethodDefinition", 2234 Token: tk[6], 2235 }, 2236 Parsing: "PropertyDefinition", 2237 Token: tk[0], 2238 } 2239 }}, 2240 {"a\n(){}", func(t *test, tk Tokens) { // 12 2241 t.Output = PropertyDefinition{ 2242 MethodDefinition: &MethodDefinition{ 2243 ClassElementName: ClassElementName{ 2244 PropertyName: &PropertyName{ 2245 LiteralPropertyName: &tk[0], 2246 Tokens: tk[:1], 2247 }, 2248 Tokens: tk[:1], 2249 }, 2250 Params: FormalParameters{ 2251 Tokens: tk[2:4], 2252 }, 2253 FunctionBody: Block{ 2254 Tokens: tk[4:6], 2255 }, 2256 Tokens: tk[:6], 2257 }, 2258 Tokens: tk[:6], 2259 } 2260 }}, 2261 {"*\na\n(){}", func(t *test, tk Tokens) { // 13 2262 t.Output = PropertyDefinition{ 2263 MethodDefinition: &MethodDefinition{ 2264 Type: MethodGenerator, 2265 ClassElementName: ClassElementName{ 2266 PropertyName: &PropertyName{ 2267 LiteralPropertyName: &tk[2], 2268 Tokens: tk[2:3], 2269 }, 2270 Tokens: tk[2:3], 2271 }, 2272 Params: FormalParameters{ 2273 Tokens: tk[4:6], 2274 }, 2275 FunctionBody: Block{ 2276 Tokens: tk[6:8], 2277 }, 2278 Tokens: tk[:8], 2279 }, 2280 Tokens: tk[:8], 2281 } 2282 }}, 2283 {"async a\n(){}", func(t *test, tk Tokens) { // 14 2284 t.Output = PropertyDefinition{ 2285 MethodDefinition: &MethodDefinition{ 2286 Type: MethodAsync, 2287 ClassElementName: ClassElementName{ 2288 PropertyName: &PropertyName{ 2289 LiteralPropertyName: &tk[2], 2290 Tokens: tk[2:3], 2291 }, 2292 Tokens: tk[2:3], 2293 }, 2294 Params: FormalParameters{ 2295 Tokens: tk[4:6], 2296 }, 2297 FunctionBody: Block{ 2298 Tokens: tk[6:8], 2299 }, 2300 Tokens: tk[:8], 2301 }, 2302 Tokens: tk[:8], 2303 } 2304 }}, 2305 {"get\na\n(){}", func(t *test, tk Tokens) { // 15 2306 t.Output = PropertyDefinition{ 2307 MethodDefinition: &MethodDefinition{ 2308 Type: MethodGetter, 2309 ClassElementName: ClassElementName{ 2310 PropertyName: &PropertyName{ 2311 LiteralPropertyName: &tk[2], 2312 Tokens: tk[2:3], 2313 }, 2314 Tokens: tk[2:3], 2315 }, 2316 Params: FormalParameters{ 2317 Tokens: tk[4:6], 2318 }, 2319 FunctionBody: Block{ 2320 Tokens: tk[6:8], 2321 }, 2322 Tokens: tk[:8], 2323 }, 2324 Tokens: tk[:8], 2325 } 2326 }}, 2327 {"set\na\n(b){}", func(t *test, tk Tokens) { // 16 2328 t.Output = PropertyDefinition{ 2329 MethodDefinition: &MethodDefinition{ 2330 Type: MethodSetter, 2331 ClassElementName: ClassElementName{ 2332 PropertyName: &PropertyName{ 2333 LiteralPropertyName: &tk[2], 2334 Tokens: tk[2:3], 2335 }, 2336 Tokens: tk[2:3], 2337 }, 2338 Params: FormalParameters{ 2339 FormalParameterList: []BindingElement{ 2340 { 2341 SingleNameBinding: &tk[5], 2342 Tokens: tk[5:6], 2343 }, 2344 }, 2345 Tokens: tk[4:7], 2346 }, 2347 FunctionBody: Block{ 2348 Tokens: tk[7:9], 2349 }, 2350 Tokens: tk[:9], 2351 }, 2352 Tokens: tk[:9], 2353 } 2354 }}, 2355 {"[\n\"a\"\n]\n()\n{}", func(t *test, tk Tokens) { // 17 2356 litA := makeConditionLiteral(tk, 2) 2357 t.Output = PropertyDefinition{ 2358 MethodDefinition: &MethodDefinition{ 2359 ClassElementName: ClassElementName{ 2360 PropertyName: &PropertyName{ 2361 ComputedPropertyName: &AssignmentExpression{ 2362 ConditionalExpression: &litA, 2363 Tokens: tk[2:3], 2364 }, 2365 Tokens: tk[:5], 2366 }, 2367 Tokens: tk[:5], 2368 }, 2369 Params: FormalParameters{ 2370 Tokens: tk[6:8], 2371 }, 2372 FunctionBody: Block{ 2373 Tokens: tk[9:11], 2374 }, 2375 Tokens: tk[:11], 2376 }, 2377 Tokens: tk[:11], 2378 } 2379 }}, 2380 {"async/* */a (){}", func(t *test, tk Tokens) { // 18 2381 t.Output = PropertyDefinition{ 2382 MethodDefinition: &MethodDefinition{ 2383 Type: MethodAsync, 2384 ClassElementName: ClassElementName{ 2385 PropertyName: &PropertyName{ 2386 LiteralPropertyName: &tk[2], 2387 Tokens: tk[2:3], 2388 }, 2389 Tokens: tk[2:3], 2390 }, 2391 Params: FormalParameters{ 2392 Tokens: tk[4:6], 2393 }, 2394 FunctionBody: Block{ 2395 Tokens: tk[6:8], 2396 }, 2397 Tokens: tk[:8], 2398 }, 2399 Tokens: tk[:8], 2400 } 2401 }}, 2402 {"async/*\n*/a (){}", func(t *test, tk Tokens) { // 19 2403 t.Err = Error{ 2404 Err: Error{ 2405 Err: Error{ 2406 Err: ErrMissingOpeningParenthesis, 2407 Parsing: "FormalParameters", 2408 Token: tk[2], 2409 }, 2410 Parsing: "MethodDefinition", 2411 Token: tk[2], 2412 }, 2413 Parsing: "PropertyDefinition", 2414 Token: tk[0], 2415 } 2416 }}, 2417 }, func(t *test) (Type, error) { 2418 var pd PropertyDefinition 2419 err := pd.parse(&t.Tokens, t.Yield, t.Await) 2420 return pd, err 2421 }) 2422 } 2423 2424 func TestTemplateLiteral(t *testing.T) { 2425 doTests(t, []sourceFn{ 2426 {``, func(t *test, tk Tokens) { // 1 2427 t.Err = Error{ 2428 Err: ErrInvalidTemplate, 2429 Parsing: "TemplateLiteral", 2430 Token: tk[0], 2431 } 2432 }}, 2433 {"``", func(t *test, tk Tokens) { // 2 2434 t.Output = TemplateLiteral{ 2435 NoSubstitutionTemplate: &tk[0], 2436 Tokens: tk[:1], 2437 } 2438 }}, 2439 {"`${\na\n}`", func(t *test, tk Tokens) { // 3 2440 litA := makeConditionLiteral(tk, 2) 2441 t.Output = TemplateLiteral{ 2442 TemplateHead: &tk[0], 2443 Expressions: []Expression{ 2444 { 2445 Expressions: []AssignmentExpression{ 2446 { 2447 ConditionalExpression: &litA, 2448 Tokens: tk[2:3], 2449 }, 2450 }, 2451 Tokens: tk[2:3], 2452 }, 2453 }, 2454 TemplateTail: &tk[4], 2455 Tokens: tk[:5], 2456 } 2457 }}, 2458 {"`${\na\nb\n}`", func(t *test, tk Tokens) { // 4 2459 t.Err = Error{ 2460 Err: ErrInvalidTemplate, 2461 Parsing: "TemplateLiteral", 2462 Token: tk[4], 2463 } 2464 }}, 2465 {"`${\na\n}${\nb\n}`", func(t *test, tk Tokens) { // 5 2466 litA := makeConditionLiteral(tk, 2) 2467 litB := makeConditionLiteral(tk, 6) 2468 t.Output = TemplateLiteral{ 2469 TemplateHead: &tk[0], 2470 Expressions: []Expression{ 2471 { 2472 Expressions: []AssignmentExpression{ 2473 { 2474 ConditionalExpression: &litA, 2475 Tokens: tk[2:3], 2476 }, 2477 }, 2478 Tokens: tk[2:3], 2479 }, 2480 { 2481 Expressions: []AssignmentExpression{ 2482 { 2483 ConditionalExpression: &litB, 2484 Tokens: tk[6:7], 2485 }, 2486 }, 2487 Tokens: tk[6:7], 2488 }, 2489 }, 2490 TemplateMiddleList: []*Token{ 2491 &tk[4], 2492 }, 2493 TemplateTail: &tk[8], 2494 Tokens: tk[:9], 2495 } 2496 }}, 2497 {"`${\na\n}${\nb\n}${\nc\n}`", func(t *test, tk Tokens) { // 6 2498 litA := makeConditionLiteral(tk, 2) 2499 litB := makeConditionLiteral(tk, 6) 2500 litC := makeConditionLiteral(tk, 10) 2501 t.Output = TemplateLiteral{ 2502 TemplateHead: &tk[0], 2503 Expressions: []Expression{ 2504 { 2505 Expressions: []AssignmentExpression{ 2506 { 2507 ConditionalExpression: &litA, 2508 Tokens: tk[2:3], 2509 }, 2510 }, 2511 Tokens: tk[2:3], 2512 }, 2513 { 2514 Expressions: []AssignmentExpression{ 2515 { 2516 ConditionalExpression: &litB, 2517 Tokens: tk[6:7], 2518 }, 2519 }, 2520 Tokens: tk[6:7], 2521 }, 2522 { 2523 Expressions: []AssignmentExpression{ 2524 { 2525 ConditionalExpression: &litC, 2526 Tokens: tk[10:11], 2527 }, 2528 }, 2529 Tokens: tk[10:11], 2530 }, 2531 }, 2532 TemplateMiddleList: []*Token{ 2533 &tk[4], 2534 &tk[8], 2535 }, 2536 TemplateTail: &tk[12], 2537 Tokens: tk[:13], 2538 } 2539 }}, 2540 {"`${,}`", func(t *test, tk Tokens) { // 7 2541 t.Err = Error{ 2542 Err: Error{ 2543 Err: assignmentError(tk[1]), 2544 Parsing: "Expression", 2545 Token: tk[1], 2546 }, 2547 Parsing: "TemplateLiteral", 2548 Token: tk[1], 2549 } 2550 }}, 2551 }, func(t *test) (Type, error) { 2552 var tl TemplateLiteral 2553 err := tl.parse(&t.Tokens, t.Yield, t.Await) 2554 return tl, err 2555 }) 2556 } 2557 2558 func TestArrowFunction(t *testing.T) { 2559 doTests(t, []sourceFn{ 2560 {``, func(t *test, tk Tokens) { // 1 2561 t.Err = Error{ 2562 Err: ErrInvalidAsyncArrowFunction, 2563 Parsing: "ArrowFunction", 2564 Token: tk[0], 2565 } 2566 }}, 2567 {"async (\nnull\n)", func(t *test, tk Tokens) { // 2 2568 t.Err = Error{ 2569 Err: Error{ 2570 Err: Error{ 2571 Err: ErrNoIdentifier, 2572 Parsing: "BindingElement", 2573 Token: tk[4], 2574 }, 2575 Parsing: "FormalParameters", 2576 Token: tk[4], 2577 }, 2578 Parsing: "ArrowFunction", 2579 Token: tk[2], 2580 } 2581 }}, 2582 {"async (\n...\na\nb)", func(t *test, tk Tokens) { // 3 2583 t.Err = Error{ 2584 Err: Error{ 2585 Err: ErrMissingClosingParenthesis, 2586 Parsing: "FormalParameters", 2587 Token: tk[8], 2588 }, 2589 Parsing: "ArrowFunction", 2590 Token: tk[2], 2591 } 2592 }}, 2593 {"async", func(t *test, tk Tokens) { // 4 2594 t.Err = Error{ 2595 Err: ErrNoIdentifier, 2596 Parsing: "ArrowFunction", 2597 Token: tk[1], 2598 } 2599 }}, 2600 {"async\n", func(t *test, tk Tokens) { // 5 2601 t.Err = Error{ 2602 Err: ErrNoIdentifier, 2603 Parsing: "ArrowFunction", 2604 Token: tk[1], 2605 } 2606 }}, 2607 {"a\n", func(t *test, tk Tokens) { // 6 2608 t.Err = Error{ 2609 Err: ErrMissingArrow, 2610 Parsing: "ArrowFunction", 2611 Token: tk[1], 2612 } 2613 }}, 2614 {"a ", func(t *test, tk Tokens) { // 7 2615 t.Err = Error{ 2616 Err: ErrMissingArrow, 2617 Parsing: "ArrowFunction", 2618 Token: tk[2], 2619 } 2620 }}, 2621 {"(a)\n", func(t *test, tk Tokens) { // 8 2622 t.Err = Error{ 2623 Err: ErrMissingArrow, 2624 Parsing: "ArrowFunction", 2625 Token: tk[3], 2626 } 2627 }}, 2628 {"(a) ", func(t *test, tk Tokens) { // 9 2629 t.Err = Error{ 2630 Err: ErrMissingArrow, 2631 Parsing: "ArrowFunction", 2632 Token: tk[4], 2633 } 2634 }}, 2635 {"async a\n", func(t *test, tk Tokens) { // 10 2636 t.Err = Error{ 2637 Err: ErrMissingArrow, 2638 Parsing: "ArrowFunction", 2639 Token: tk[3], 2640 } 2641 }}, 2642 {"async a ", func(t *test, tk Tokens) { // 11 2643 t.Err = Error{ 2644 Err: ErrMissingArrow, 2645 Parsing: "ArrowFunction", 2646 Token: tk[4], 2647 } 2648 }}, 2649 {"async (a)\n", func(t *test, tk Tokens) { // 12 2650 t.Err = Error{ 2651 Err: ErrMissingArrow, 2652 Parsing: "ArrowFunction", 2653 Token: tk[5], 2654 } 2655 }}, 2656 {"async (a) ", func(t *test, tk Tokens) { // 13 2657 t.Err = Error{ 2658 Err: ErrMissingArrow, 2659 Parsing: "ArrowFunction", 2660 Token: tk[6], 2661 } 2662 }}, 2663 {"a=>{:}", func(t *test, tk Tokens) { // 14 2664 t.Err = Error{ 2665 Err: Error{ 2666 Err: Error{ 2667 Err: Error{ 2668 Err: Error{ 2669 Err: assignmentError(tk[3]), 2670 Parsing: "Expression", 2671 Token: tk[3], 2672 }, 2673 Parsing: "Statement", 2674 Token: tk[3], 2675 }, 2676 Parsing: "StatementListItem", 2677 Token: tk[3], 2678 }, 2679 Parsing: "Block", 2680 Token: tk[3], 2681 }, 2682 Parsing: "ArrowFunction", 2683 Token: tk[2], 2684 } 2685 }}, 2686 {"a =>\n{}", func(t *test, tk Tokens) { // 15 2687 t.Output = ArrowFunction{ 2688 BindingIdentifier: &tk[0], 2689 FunctionBody: &Block{ 2690 Tokens: tk[4:6], 2691 }, 2692 Tokens: tk[:6], 2693 } 2694 }}, 2695 {"() =>\n{}", func(t *test, tk Tokens) { // 16 2696 t.Output = ArrowFunction{ 2697 FormalParameters: &FormalParameters{ 2698 Tokens: tk[:2], 2699 }, 2700 FunctionBody: &Block{ 2701 Tokens: tk[5:7], 2702 }, 2703 Tokens: tk[:7], 2704 } 2705 }}, 2706 {"async a =>\n{}", func(t *test, tk Tokens) { // 17 2707 t.Output = ArrowFunction{ 2708 Async: true, 2709 BindingIdentifier: &tk[2], 2710 FunctionBody: &Block{ 2711 Tokens: tk[6:8], 2712 }, 2713 Tokens: tk[:8], 2714 } 2715 }}, 2716 {"async () =>\n{}", func(t *test, tk Tokens) { // 18 2717 t.Output = ArrowFunction{ 2718 Async: true, 2719 FormalParameters: &FormalParameters{ 2720 Tokens: tk[2:4], 2721 }, 2722 FunctionBody: &Block{ 2723 Tokens: tk[7:9], 2724 }, 2725 Tokens: tk[:9], 2726 } 2727 }}, 2728 {"a=>:", func(t *test, tk Tokens) { // 19 2729 t.Err = Error{ 2730 Err: assignmentError(tk[2]), 2731 Parsing: "ArrowFunction", 2732 Token: tk[2], 2733 } 2734 }}, 2735 {"a =>\nb", func(t *test, tk Tokens) { // 20 2736 litB := makeConditionLiteral(tk, 4) 2737 t.Output = ArrowFunction{ 2738 BindingIdentifier: &tk[0], 2739 AssignmentExpression: &AssignmentExpression{ 2740 ConditionalExpression: &litB, 2741 Tokens: tk[4:5], 2742 }, 2743 Tokens: tk[:5], 2744 } 2745 }}, 2746 {"() =>\nb", func(t *test, tk Tokens) { // 21 2747 litB := makeConditionLiteral(tk, 5) 2748 t.Output = ArrowFunction{ 2749 FormalParameters: &FormalParameters{ 2750 Tokens: tk[:2], 2751 }, 2752 AssignmentExpression: &AssignmentExpression{ 2753 ConditionalExpression: &litB, 2754 Tokens: tk[5:6], 2755 }, 2756 Tokens: tk[:6], 2757 } 2758 }}, 2759 {"async a =>\nb", func(t *test, tk Tokens) { // 22 2760 litB := makeConditionLiteral(tk, 6) 2761 t.Output = ArrowFunction{ 2762 Async: true, 2763 BindingIdentifier: &tk[2], 2764 AssignmentExpression: &AssignmentExpression{ 2765 ConditionalExpression: &litB, 2766 Tokens: tk[6:7], 2767 }, 2768 Tokens: tk[:7], 2769 } 2770 }}, 2771 {"async () =>\nb", func(t *test, tk Tokens) { // 23 2772 litB := makeConditionLiteral(tk, 7) 2773 t.Output = ArrowFunction{ 2774 Async: true, 2775 FormalParameters: &FormalParameters{ 2776 Tokens: tk[2:4], 2777 }, 2778 AssignmentExpression: &AssignmentExpression{ 2779 ConditionalExpression: &litB, 2780 Tokens: tk[7:8], 2781 }, 2782 Tokens: tk[:8], 2783 } 2784 }}, 2785 {"([a]) => a", func(t *test, tk Tokens) { // 24 2786 litAb := makeConditionLiteral(tk, 8) 2787 t.Output = ArrowFunction{ 2788 FormalParameters: &FormalParameters{ 2789 FormalParameterList: []BindingElement{ 2790 { 2791 ArrayBindingPattern: &ArrayBindingPattern{ 2792 BindingElementList: []BindingElement{ 2793 { 2794 SingleNameBinding: &tk[2], 2795 Tokens: tk[2:3], 2796 }, 2797 }, 2798 Tokens: tk[1:4], 2799 }, 2800 Tokens: tk[1:4], 2801 }, 2802 }, 2803 Tokens: tk[:5], 2804 }, 2805 AssignmentExpression: &AssignmentExpression{ 2806 ConditionalExpression: &litAb, 2807 Tokens: tk[8:9], 2808 }, 2809 Tokens: tk[:9], 2810 } 2811 }}, 2812 {"({a}) => a", func(t *test, tk Tokens) { // 25 2813 litAb := makeConditionLiteral(tk, 8) 2814 t.Output = ArrowFunction{ 2815 FormalParameters: &FormalParameters{ 2816 FormalParameterList: []BindingElement{ 2817 { 2818 ObjectBindingPattern: &ObjectBindingPattern{ 2819 BindingPropertyList: []BindingProperty{ 2820 { 2821 PropertyName: PropertyName{ 2822 LiteralPropertyName: &tk[2], 2823 Tokens: tk[2:3], 2824 }, 2825 BindingElement: BindingElement{ 2826 SingleNameBinding: &tk[2], 2827 Tokens: tk[2:3], 2828 }, 2829 Tokens: tk[2:3], 2830 }, 2831 }, 2832 Tokens: tk[1:4], 2833 }, 2834 Tokens: tk[1:4], 2835 }, 2836 }, 2837 Tokens: tk[:5], 2838 }, 2839 AssignmentExpression: &AssignmentExpression{ 2840 ConditionalExpression: &litAb, 2841 Tokens: tk[8:9], 2842 }, 2843 Tokens: tk[:9], 2844 } 2845 }}, 2846 {"([a, {b}, {c: d}, {e, f, ...g}, {h: {i = j}}, ...k], {l: [m, n] = [o, p]}, ...q) => r", func(t *test, tk Tokens) { // 26 2847 litJ := makeConditionLiteral(tk, 39) 2848 litR := makeConditionLiteral(tk, 77) 2849 t.Output = ArrowFunction{ 2850 FormalParameters: &FormalParameters{ 2851 FormalParameterList: []BindingElement{ 2852 { 2853 ArrayBindingPattern: &ArrayBindingPattern{ 2854 BindingElementList: []BindingElement{ 2855 { 2856 SingleNameBinding: &tk[2], 2857 Tokens: tk[2:3], 2858 }, 2859 { 2860 ObjectBindingPattern: &ObjectBindingPattern{ 2861 BindingPropertyList: []BindingProperty{ 2862 { 2863 PropertyName: PropertyName{ 2864 LiteralPropertyName: &tk[6], 2865 Tokens: tk[6:7], 2866 }, 2867 BindingElement: BindingElement{ 2868 SingleNameBinding: &tk[6], 2869 Tokens: tk[6:7], 2870 }, 2871 Tokens: tk[6:7], 2872 }, 2873 }, 2874 Tokens: tk[5:8], 2875 }, 2876 Tokens: tk[5:8], 2877 }, 2878 { 2879 ObjectBindingPattern: &ObjectBindingPattern{ 2880 BindingPropertyList: []BindingProperty{ 2881 { 2882 PropertyName: PropertyName{ 2883 LiteralPropertyName: &tk[11], 2884 Tokens: tk[11:12], 2885 }, 2886 BindingElement: BindingElement{ 2887 SingleNameBinding: &tk[14], 2888 Tokens: tk[14:15], 2889 }, 2890 Tokens: tk[11:15], 2891 }, 2892 }, 2893 Tokens: tk[10:16], 2894 }, 2895 Tokens: tk[10:16], 2896 }, 2897 { 2898 ObjectBindingPattern: &ObjectBindingPattern{ 2899 BindingPropertyList: []BindingProperty{ 2900 { 2901 PropertyName: PropertyName{ 2902 LiteralPropertyName: &tk[19], 2903 Tokens: tk[19:20], 2904 }, 2905 BindingElement: BindingElement{ 2906 SingleNameBinding: &tk[19], 2907 Tokens: tk[19:20], 2908 }, 2909 Tokens: tk[19:20], 2910 }, 2911 { 2912 PropertyName: PropertyName{ 2913 LiteralPropertyName: &tk[22], 2914 Tokens: tk[22:23], 2915 }, 2916 BindingElement: BindingElement{ 2917 SingleNameBinding: &tk[22], 2918 Tokens: tk[22:23], 2919 }, 2920 Tokens: tk[22:23], 2921 }, 2922 }, 2923 BindingRestProperty: &tk[26], 2924 Tokens: tk[18:28], 2925 }, 2926 Tokens: tk[18:28], 2927 }, 2928 { 2929 ObjectBindingPattern: &ObjectBindingPattern{ 2930 BindingPropertyList: []BindingProperty{ 2931 { 2932 PropertyName: PropertyName{ 2933 LiteralPropertyName: &tk[31], 2934 Tokens: tk[31:32], 2935 }, 2936 BindingElement: BindingElement{ 2937 ObjectBindingPattern: &ObjectBindingPattern{ 2938 BindingPropertyList: []BindingProperty{ 2939 { 2940 PropertyName: PropertyName{ 2941 LiteralPropertyName: &tk[35], 2942 Tokens: tk[35:36], 2943 }, 2944 BindingElement: BindingElement{ 2945 SingleNameBinding: &tk[35], 2946 Initializer: &AssignmentExpression{ 2947 ConditionalExpression: &litJ, 2948 Tokens: tk[39:40], 2949 }, 2950 Tokens: tk[35:40], 2951 }, 2952 Tokens: tk[35:40], 2953 }, 2954 }, 2955 Tokens: tk[34:41], 2956 }, 2957 Tokens: tk[34:41], 2958 }, 2959 Tokens: tk[31:41], 2960 }, 2961 }, 2962 Tokens: tk[30:42], 2963 }, 2964 Tokens: tk[30:42], 2965 }, 2966 }, 2967 BindingRestElement: &BindingElement{ 2968 SingleNameBinding: &tk[45], 2969 Tokens: tk[45:46], 2970 }, 2971 Tokens: tk[1:47], 2972 }, 2973 Tokens: tk[1:47], 2974 }, 2975 { 2976 ObjectBindingPattern: &ObjectBindingPattern{ 2977 BindingPropertyList: []BindingProperty{ 2978 { 2979 PropertyName: PropertyName{ 2980 LiteralPropertyName: &tk[50], 2981 Tokens: tk[50:51], 2982 }, 2983 BindingElement: BindingElement{ 2984 ArrayBindingPattern: &ArrayBindingPattern{ 2985 BindingElementList: []BindingElement{ 2986 { 2987 SingleNameBinding: &tk[54], 2988 Tokens: tk[54:55], 2989 }, 2990 { 2991 SingleNameBinding: &tk[57], 2992 Tokens: tk[57:58], 2993 }, 2994 }, 2995 Tokens: tk[53:59], 2996 }, 2997 Initializer: &AssignmentExpression{ 2998 ConditionalExpression: WrapConditional(&ArrayLiteral{ 2999 ElementList: []ArrayElement{ 3000 { 3001 AssignmentExpression: AssignmentExpression{ 3002 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3003 IdentifierReference: &tk[63], 3004 Tokens: tk[63:64], 3005 }), 3006 Tokens: tk[63:64], 3007 }, 3008 Tokens: tk[63:64], 3009 }, 3010 { 3011 AssignmentExpression: AssignmentExpression{ 3012 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3013 IdentifierReference: &tk[66], 3014 Tokens: tk[66:67], 3015 }), 3016 Tokens: tk[66:67], 3017 }, 3018 Tokens: tk[66:67], 3019 }, 3020 }, 3021 Tokens: tk[62:68], 3022 }), 3023 Tokens: tk[62:68], 3024 }, 3025 Tokens: tk[53:68], 3026 }, 3027 Tokens: tk[50:68], 3028 }, 3029 }, 3030 Tokens: tk[49:69], 3031 }, 3032 Tokens: tk[49:69], 3033 }, 3034 }, 3035 BindingIdentifier: &tk[72], 3036 Tokens: tk[:74], 3037 }, 3038 AssignmentExpression: &AssignmentExpression{ 3039 ConditionalExpression: &litR, 3040 Tokens: tk[77:78], 3041 }, 3042 Tokens: tk[:78], 3043 } 3044 }}, 3045 {"([, a]) => b", func(t *test, tk Tokens) { // 27 3046 litB := makeConditionLiteral(tk, 10) 3047 t.Output = ArrowFunction{ 3048 FormalParameters: &FormalParameters{ 3049 FormalParameterList: []BindingElement{ 3050 { 3051 ArrayBindingPattern: &ArrayBindingPattern{ 3052 BindingElementList: []BindingElement{ 3053 {}, 3054 { 3055 SingleNameBinding: &tk[4], 3056 Tokens: tk[4:5], 3057 }, 3058 }, 3059 Tokens: tk[1:6], 3060 }, 3061 Tokens: tk[1:6], 3062 }, 3063 }, 3064 Tokens: tk[0:7], 3065 }, 3066 AssignmentExpression: &AssignmentExpression{ 3067 ConditionalExpression: &litB, 3068 Tokens: tk[10:11], 3069 }, 3070 Tokens: tk[:11], 3071 } 3072 }}, 3073 {"(()=>a) => b", func(t *test, tk Tokens) { // 28 3074 t.Err = Error{ 3075 Err: Error{ 3076 Err: ErrNoIdentifier, 3077 Parsing: "FormalParameters", 3078 Token: tk[0], 3079 }, 3080 Parsing: "ArrowFunction", 3081 Token: tk[0], 3082 } 3083 }}, 3084 {"(a/=b) => b", func(t *test, tk Tokens) { // 29 3085 t.Err = Error{ 3086 Err: Error{ 3087 Err: Error{ 3088 Err: ErrInvalidAssignment, 3089 Parsing: "BindingElement", 3090 Token: tk[1], 3091 }, 3092 Parsing: "FormalParameters", 3093 Token: tk[0], 3094 }, 3095 Parsing: "ArrowFunction", 3096 Token: tk[0], 3097 } 3098 }}, 3099 {"([a /= b]) => 1", func(t *test, tk Tokens) { // 30 3100 t.Err = Error{ 3101 Err: Error{ 3102 Err: Error{ 3103 Err: Error{ 3104 Err: Error{ 3105 Err: ErrInvalidAssignment, 3106 Parsing: "BindingElement", 3107 Token: tk[2], 3108 }, 3109 Parsing: "ArrayBindingPattern", 3110 Token: tk[1], 3111 }, 3112 Parsing: "BindingElement", 3113 Token: tk[1], 3114 }, 3115 Parsing: "FormalParameters", 3116 Token: tk[0], 3117 }, 3118 Parsing: "ArrowFunction", 3119 Token: tk[0], 3120 } 3121 }}, 3122 {"([...a /= b]) => 1", func(t *test, tk Tokens) { // 31 3123 t.Err = Error{ 3124 Err: Error{ 3125 Err: Error{ 3126 Err: Error{ 3127 Err: Error{ 3128 Err: ErrInvalidAssignment, 3129 Parsing: "BindingElement", 3130 Token: tk[3], 3131 }, 3132 Parsing: "ArrayBindingPattern", 3133 Token: tk[1], 3134 }, 3135 Parsing: "BindingElement", 3136 Token: tk[1], 3137 }, 3138 Parsing: "FormalParameters", 3139 Token: tk[0], 3140 }, 3141 Parsing: "ArrowFunction", 3142 Token: tk[0], 3143 } 3144 }}, 3145 {"({a() {}}) => 1", func(t *test, tk Tokens) { // 32 3146 t.Err = Error{ 3147 Err: Error{ 3148 Err: Error{ 3149 Err: Error{ 3150 Err: ErrNoIdentifier, 3151 Parsing: "ObjectBindingPattern", 3152 Token: tk[1], 3153 }, 3154 Parsing: "BindingElement", 3155 Token: tk[1], 3156 }, 3157 Parsing: "FormalParameters", 3158 Token: tk[0], 3159 }, 3160 Parsing: "ArrowFunction", 3161 Token: tk[0], 3162 } 3163 }}, 3164 {"({a: b /= 1}) => 1", func(t *test, tk Tokens) { // 33 3165 t.Err = Error{ 3166 Err: Error{ 3167 Err: Error{ 3168 Err: Error{ 3169 Err: Error{ 3170 Err: ErrInvalidAssignment, 3171 Parsing: "BindingElement", 3172 Token: tk[5], 3173 }, 3174 Parsing: "ObjectBindingPattern", 3175 Token: tk[1], 3176 }, 3177 Parsing: "BindingElement", 3178 Token: tk[1], 3179 }, 3180 Parsing: "FormalParameters", 3181 Token: tk[0], 3182 }, 3183 Parsing: "ArrowFunction", 3184 Token: tk[0], 3185 } 3186 }}, 3187 {"({...a=>1}) => 1", func(t *test, tk Tokens) { // 34 3188 t.Err = Error{ 3189 Err: Error{ 3190 Err: Error{ 3191 Err: Error{ 3192 Err: ErrNoIdentifier, 3193 Parsing: "ObjectBindingPattern", 3194 Token: tk[1], 3195 }, 3196 Parsing: "BindingElement", 3197 Token: tk[1], 3198 }, 3199 Parsing: "FormalParameters", 3200 Token: tk[0], 3201 }, 3202 Parsing: "ArrowFunction", 3203 Token: tk[0], 3204 } 3205 }}, 3206 {"(``) => 1", func(t *test, tk Tokens) { // 35 3207 t.Err = Error{ 3208 Err: Error{ 3209 Err: Error{ 3210 Err: ErrNoIdentifier, 3211 Parsing: "BindingElement", 3212 Token: tk[1], 3213 }, 3214 Parsing: "FormalParameters", 3215 Token: tk[0], 3216 }, 3217 Parsing: "ArrowFunction", 3218 Token: tk[0], 3219 } 3220 }}, 3221 {"(`` = 1) => 1", func(t *test, tk Tokens) { // 36 3222 t.Err = Error{ 3223 Err: Error{ 3224 Err: Error{ 3225 Err: ErrNoIdentifier, 3226 Parsing: "BindingElement", 3227 Token: tk[1], 3228 }, 3229 Parsing: "FormalParameters", 3230 Token: tk[0], 3231 }, 3232 Parsing: "ArrowFunction", 3233 Token: tk[0], 3234 } 3235 }}, 3236 {"([`` = 1] = 1) => 1", func(t *test, tk Tokens) { // 37 3237 t.Err = Error{ 3238 Err: Error{ 3239 Err: Error{ 3240 Err: Error{ 3241 Err: Error{ 3242 Err: ErrNoIdentifier, 3243 Parsing: "BindingElement", 3244 Token: tk[2], 3245 }, 3246 Parsing: "ArrayBindingPattern", 3247 Token: tk[1], 3248 }, 3249 Parsing: "BindingElement", 3250 Token: tk[1], 3251 }, 3252 Parsing: "FormalParameters", 3253 Token: tk[0], 3254 }, 3255 Parsing: "ArrowFunction", 3256 Token: tk[0], 3257 } 3258 }}, 3259 {"({} = {}) => 1", func(t *test, tk Tokens) { // 38 3260 t.Output = ArrowFunction{ 3261 FormalParameters: &FormalParameters{ 3262 FormalParameterList: []BindingElement{ 3263 { 3264 ObjectBindingPattern: &ObjectBindingPattern{ 3265 BindingPropertyList: []BindingProperty{}, 3266 Tokens: tk[1:3], 3267 }, 3268 Initializer: &AssignmentExpression{ 3269 ConditionalExpression: WrapConditional(&ObjectLiteral{ 3270 Tokens: tk[6:8], 3271 }), 3272 Tokens: tk[6:8], 3273 }, 3274 Tokens: tk[1:8], 3275 }, 3276 }, 3277 Tokens: tk[:9], 3278 }, 3279 AssignmentExpression: &AssignmentExpression{ 3280 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3281 Literal: &tk[12], 3282 Tokens: tk[12:13], 3283 }), 3284 Tokens: tk[12:13], 3285 }, 3286 Tokens: tk[:13], 3287 } 3288 }}, 3289 {"([...a] = []) => 1", func(t *test, tk Tokens) { // 39 3290 t.Output = ArrowFunction{ 3291 FormalParameters: &FormalParameters{ 3292 FormalParameterList: []BindingElement{ 3293 { 3294 ArrayBindingPattern: &ArrayBindingPattern{ 3295 BindingElementList: []BindingElement{}, 3296 BindingRestElement: &BindingElement{ 3297 SingleNameBinding: &tk[3], 3298 Tokens: tk[3:4], 3299 }, 3300 Tokens: tk[1:5], 3301 }, 3302 Initializer: &AssignmentExpression{ 3303 ConditionalExpression: WrapConditional(&ArrayLiteral{ 3304 Tokens: tk[8:10], 3305 }), 3306 Tokens: tk[8:10], 3307 }, 3308 Tokens: tk[1:10], 3309 }, 3310 }, 3311 Tokens: tk[:11], 3312 }, 3313 AssignmentExpression: &AssignmentExpression{ 3314 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3315 Literal: &tk[14], 3316 Tokens: tk[14:15], 3317 }), 3318 Tokens: tk[14:15], 3319 }, 3320 Tokens: tk[:15], 3321 } 3322 }}, 3323 {"([...a.b] = []) => 1", func(t *test, tk Tokens) { // 40 3324 t.Err = Error{ 3325 Err: Error{ 3326 Err: Error{ 3327 Err: Error{ 3328 Err: Error{ 3329 Err: ErrNoIdentifier, 3330 Parsing: "BindingElement", 3331 Token: tk[3], 3332 }, 3333 Parsing: "ArrayBindingPattern", 3334 Token: tk[1], 3335 }, 3336 Parsing: "BindingElement", 3337 Token: tk[1], 3338 }, 3339 Parsing: "FormalParameters", 3340 Token: tk[0], 3341 }, 3342 Parsing: "ArrowFunction", 3343 Token: tk[0], 3344 } 3345 }}, 3346 {"({a} = {}) => 1", func(t *test, tk Tokens) { // 41 3347 t.Output = ArrowFunction{ 3348 FormalParameters: &FormalParameters{ 3349 FormalParameterList: []BindingElement{ 3350 { 3351 ObjectBindingPattern: &ObjectBindingPattern{ 3352 BindingPropertyList: []BindingProperty{ 3353 { 3354 PropertyName: PropertyName{ 3355 LiteralPropertyName: &tk[2], 3356 Tokens: tk[2:3], 3357 }, 3358 BindingElement: BindingElement{ 3359 SingleNameBinding: &tk[2], 3360 Tokens: tk[2:3], 3361 }, 3362 Tokens: tk[2:3], 3363 }, 3364 }, 3365 Tokens: tk[1:4], 3366 }, 3367 Initializer: &AssignmentExpression{ 3368 ConditionalExpression: WrapConditional(&ObjectLiteral{ 3369 Tokens: tk[7:9], 3370 }), 3371 Tokens: tk[7:9], 3372 }, 3373 Tokens: tk[1:9], 3374 }, 3375 }, 3376 Tokens: tk[:10], 3377 }, 3378 AssignmentExpression: &AssignmentExpression{ 3379 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3380 Literal: &tk[13], 3381 Tokens: tk[13:14], 3382 }), 3383 Tokens: tk[13:14], 3384 }, 3385 Tokens: tk[:14], 3386 } 3387 }}, 3388 {"({a: a.b} = {}) => 1", func(t *test, tk Tokens) { // 42 3389 t.Err = Error{ 3390 Err: Error{ 3391 Err: Error{ 3392 Err: Error{ 3393 Err: Error{ 3394 Err: Error{ 3395 Err: ErrNoIdentifier, 3396 Parsing: "BindingElement", 3397 Token: tk[5], 3398 }, 3399 Parsing: "BindingProperty", 3400 Token: tk[2], 3401 }, 3402 Parsing: "ObjectBindingPattern", 3403 Token: tk[1], 3404 }, 3405 Parsing: "BindingElement", 3406 Token: tk[1], 3407 }, 3408 Parsing: "FormalParameters", 3409 Token: tk[0], 3410 }, 3411 Parsing: "ArrowFunction", 3412 Token: tk[0], 3413 } 3414 }}, 3415 {"({...a} = {}) => 1", func(t *test, tk Tokens) { // 43 3416 t.Output = ArrowFunction{ 3417 FormalParameters: &FormalParameters{ 3418 FormalParameterList: []BindingElement{ 3419 { 3420 ObjectBindingPattern: &ObjectBindingPattern{ 3421 BindingPropertyList: []BindingProperty{}, 3422 BindingRestProperty: &tk[3], 3423 Tokens: tk[1:5], 3424 }, 3425 Initializer: &AssignmentExpression{ 3426 ConditionalExpression: WrapConditional(&ObjectLiteral{ 3427 Tokens: tk[8:10], 3428 }), 3429 Tokens: tk[8:10], 3430 }, 3431 Tokens: tk[1:10], 3432 }, 3433 }, 3434 Tokens: tk[:11], 3435 }, 3436 AssignmentExpression: &AssignmentExpression{ 3437 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3438 Literal: &tk[14], 3439 Tokens: tk[14:15], 3440 }), 3441 Tokens: tk[14:15], 3442 }, 3443 Tokens: tk[:15], 3444 } 3445 }}, 3446 {"({...a.b} = {}) => 1", func(t *test, tk Tokens) { // 44 3447 t.Err = Error{ 3448 Err: Error{ 3449 Err: Error{ 3450 Err: Error{ 3451 Err: ErrBadRestElement, 3452 Parsing: "ObjectBindingPattern", 3453 Token: tk[1], 3454 }, 3455 Parsing: "BindingElement", 3456 Token: tk[1], 3457 }, 3458 Parsing: "FormalParameters", 3459 Token: tk[0], 3460 }, 3461 Parsing: "ArrowFunction", 3462 Token: tk[0], 3463 } 3464 }}, 3465 {"({a: []} = {}) => 1", func(t *test, tk Tokens) { // 45 3466 t.Output = ArrowFunction{ 3467 FormalParameters: &FormalParameters{ 3468 FormalParameterList: []BindingElement{ 3469 { 3470 ObjectBindingPattern: &ObjectBindingPattern{ 3471 BindingPropertyList: []BindingProperty{ 3472 { 3473 PropertyName: PropertyName{ 3474 LiteralPropertyName: &tk[2], 3475 Tokens: tk[2:3], 3476 }, 3477 BindingElement: BindingElement{ 3478 ArrayBindingPattern: &ArrayBindingPattern{ 3479 BindingElementList: []BindingElement{}, 3480 Tokens: tk[5:7], 3481 }, 3482 Tokens: tk[5:7], 3483 }, 3484 Tokens: tk[2:7], 3485 }, 3486 }, 3487 Tokens: tk[1:8], 3488 }, 3489 Initializer: &AssignmentExpression{ 3490 ConditionalExpression: WrapConditional(&ObjectLiteral{ 3491 Tokens: tk[11:13], 3492 }), 3493 Tokens: tk[11:13], 3494 }, 3495 Tokens: tk[1:13], 3496 }, 3497 }, 3498 Tokens: tk[:14], 3499 }, 3500 AssignmentExpression: &AssignmentExpression{ 3501 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3502 Literal: &tk[17], 3503 Tokens: tk[17:18], 3504 }), 3505 Tokens: tk[17:18], 3506 }, 3507 Tokens: tk[:18], 3508 } 3509 }}, 3510 {"({a: [b.c]} = {}) => 1", func(t *test, tk Tokens) { // 46 3511 t.Err = Error{ 3512 Err: Error{ 3513 Err: Error{ 3514 Err: Error{ 3515 Err: Error{ 3516 Err: Error{ 3517 Err: Error{ 3518 Err: ErrNoIdentifier, 3519 Parsing: "BindingElement", 3520 Token: tk[6], 3521 }, 3522 Parsing: "ArrayBindingPattern", 3523 Token: tk[5], 3524 }, 3525 Parsing: "BindingProperty", 3526 Token: tk[2], 3527 }, 3528 Parsing: "ObjectBindingPattern", 3529 Token: tk[1], 3530 }, 3531 Parsing: "BindingElement", 3532 Token: tk[1], 3533 }, 3534 Parsing: "FormalParameters", 3535 Token: tk[0], 3536 }, 3537 Parsing: "ArrowFunction", 3538 Token: tk[0], 3539 } 3540 }}, 3541 {"({a: {}} = {}) => 1", func(t *test, tk Tokens) { // 47 3542 t.Output = ArrowFunction{ 3543 FormalParameters: &FormalParameters{ 3544 FormalParameterList: []BindingElement{ 3545 { 3546 ObjectBindingPattern: &ObjectBindingPattern{ 3547 BindingPropertyList: []BindingProperty{ 3548 { 3549 PropertyName: PropertyName{ 3550 LiteralPropertyName: &tk[2], 3551 Tokens: tk[2:3], 3552 }, 3553 BindingElement: BindingElement{ 3554 ObjectBindingPattern: &ObjectBindingPattern{ 3555 BindingPropertyList: []BindingProperty{}, 3556 Tokens: tk[5:7], 3557 }, 3558 Tokens: tk[5:7], 3559 }, 3560 Tokens: tk[2:7], 3561 }, 3562 }, 3563 Tokens: tk[1:8], 3564 }, 3565 Initializer: &AssignmentExpression{ 3566 ConditionalExpression: WrapConditional(&ObjectLiteral{ 3567 Tokens: tk[11:13], 3568 }), 3569 Tokens: tk[11:13], 3570 }, 3571 Tokens: tk[1:13], 3572 }, 3573 }, 3574 Tokens: tk[:14], 3575 }, 3576 AssignmentExpression: &AssignmentExpression{ 3577 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3578 Literal: &tk[17], 3579 Tokens: tk[17:18], 3580 }), 3581 Tokens: tk[17:18], 3582 }, 3583 Tokens: tk[:18], 3584 } 3585 }}, 3586 {"({a: {b: c.d}} = {}) => 1", func(t *test, tk Tokens) { // 48 3587 t.Err = Error{ 3588 Err: Error{ 3589 Err: Error{ 3590 Err: Error{ 3591 Err: Error{ 3592 Err: Error{ 3593 Err: Error{ 3594 Err: Error{ 3595 Err: ErrNoIdentifier, 3596 Parsing: "BindingElement", 3597 Token: tk[9], 3598 }, 3599 Parsing: "BindingProperty", 3600 Token: tk[6], 3601 }, 3602 Parsing: "ObjectBindingPattern", 3603 Token: tk[5], 3604 }, 3605 Parsing: "BindingProperty", 3606 Token: tk[2], 3607 }, 3608 Parsing: "ObjectBindingPattern", 3609 Token: tk[1], 3610 }, 3611 Parsing: "BindingElement", 3612 Token: tk[1], 3613 }, 3614 Parsing: "FormalParameters", 3615 Token: tk[0], 3616 }, 3617 Parsing: "ArrowFunction", 3618 Token: tk[0], 3619 } 3620 }}, 3621 {"({a: {b = 1}} = {}) => 2", func(t *test, tk Tokens) { // 49 3622 t.Output = ArrowFunction{ 3623 FormalParameters: &FormalParameters{ 3624 FormalParameterList: []BindingElement{ 3625 { 3626 ObjectBindingPattern: &ObjectBindingPattern{ 3627 BindingPropertyList: []BindingProperty{ 3628 { 3629 PropertyName: PropertyName{ 3630 LiteralPropertyName: &tk[2], 3631 Tokens: tk[2:3], 3632 }, 3633 BindingElement: BindingElement{ 3634 ObjectBindingPattern: &ObjectBindingPattern{ 3635 BindingPropertyList: []BindingProperty{ 3636 { 3637 PropertyName: PropertyName{ 3638 LiteralPropertyName: &tk[6], 3639 Tokens: tk[6:7], 3640 }, 3641 BindingElement: BindingElement{ 3642 SingleNameBinding: &tk[6], 3643 Initializer: &AssignmentExpression{ 3644 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3645 Literal: &tk[10], 3646 Tokens: tk[10:11], 3647 }), 3648 Tokens: tk[10:11], 3649 }, 3650 Tokens: tk[6:11], 3651 }, 3652 Tokens: tk[6:11], 3653 }, 3654 }, 3655 Tokens: tk[5:12], 3656 }, 3657 Tokens: tk[5:12], 3658 }, 3659 Tokens: tk[2:12], 3660 }, 3661 }, 3662 Tokens: tk[1:13], 3663 }, 3664 Initializer: &AssignmentExpression{ 3665 ConditionalExpression: WrapConditional(&ObjectLiteral{ 3666 Tokens: tk[16:18], 3667 }), 3668 Tokens: tk[16:18], 3669 }, 3670 Tokens: tk[1:18], 3671 }, 3672 }, 3673 Tokens: tk[:19], 3674 }, 3675 AssignmentExpression: &AssignmentExpression{ 3676 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3677 Literal: &tk[22], 3678 Tokens: tk[22:23], 3679 }), 3680 Tokens: tk[22:23], 3681 }, 3682 Tokens: tk[:23], 3683 } 3684 }}, 3685 {"([[a] = []] = []) => 1", func(t *test, tk Tokens) { // 50 3686 t.Output = ArrowFunction{ 3687 FormalParameters: &FormalParameters{ 3688 FormalParameterList: []BindingElement{ 3689 { 3690 ArrayBindingPattern: &ArrayBindingPattern{ 3691 BindingElementList: []BindingElement{ 3692 { 3693 ArrayBindingPattern: &ArrayBindingPattern{ 3694 BindingElementList: []BindingElement{ 3695 { 3696 SingleNameBinding: &tk[3], 3697 Tokens: tk[3:4], 3698 }, 3699 }, 3700 Tokens: tk[2:5], 3701 }, 3702 Initializer: &AssignmentExpression{ 3703 ConditionalExpression: WrapConditional(&ArrayLiteral{ 3704 Tokens: tk[8:10], 3705 }), 3706 Tokens: tk[8:10], 3707 }, 3708 Tokens: tk[2:10], 3709 }, 3710 }, 3711 Tokens: tk[1:11], 3712 }, 3713 Initializer: &AssignmentExpression{ 3714 ConditionalExpression: WrapConditional(&ArrayLiteral{ 3715 Tokens: tk[14:16], 3716 }), 3717 Tokens: tk[14:16], 3718 }, 3719 Tokens: tk[1:16], 3720 }, 3721 }, 3722 Tokens: tk[:17], 3723 }, 3724 AssignmentExpression: &AssignmentExpression{ 3725 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3726 Literal: &tk[20], 3727 Tokens: tk[20:21], 3728 }), 3729 Tokens: tk[20:21], 3730 }, 3731 Tokens: tk[:21], 3732 } 3733 }}, 3734 {"([[a.b] = []] = []) => 1", func(t *test, tk Tokens) { // 51 3735 t.Err = Error{ 3736 Err: Error{ 3737 Err: Error{ 3738 Err: Error{ 3739 Err: Error{ 3740 Err: Error{ 3741 Err: Error{ 3742 Err: ErrNoIdentifier, 3743 Parsing: "BindingElement", 3744 Token: tk[3], 3745 }, 3746 Parsing: "ArrayBindingPattern", 3747 Token: tk[2], 3748 }, 3749 Parsing: "BindingElement", 3750 Token: tk[2], 3751 }, 3752 Parsing: "ArrayBindingPattern", 3753 Token: tk[1], 3754 }, 3755 Parsing: "BindingElement", 3756 Token: tk[1], 3757 }, 3758 Parsing: "FormalParameters", 3759 Token: tk[0], 3760 }, 3761 Parsing: "ArrowFunction", 3762 Token: tk[0], 3763 } 3764 }}, 3765 {"({a: {b: c = 1} = {}} = {}) => 2", func(t *test, tk Tokens) { // 52 3766 t.Output = ArrowFunction{ 3767 FormalParameters: &FormalParameters{ 3768 FormalParameterList: []BindingElement{ 3769 { 3770 ObjectBindingPattern: &ObjectBindingPattern{ 3771 BindingPropertyList: []BindingProperty{ 3772 { 3773 PropertyName: PropertyName{ 3774 LiteralPropertyName: &tk[2], 3775 Tokens: tk[2:3], 3776 }, 3777 BindingElement: BindingElement{ 3778 ObjectBindingPattern: &ObjectBindingPattern{ 3779 BindingPropertyList: []BindingProperty{ 3780 { 3781 PropertyName: PropertyName{ 3782 LiteralPropertyName: &tk[6], 3783 Tokens: tk[6:7], 3784 }, 3785 BindingElement: BindingElement{ 3786 SingleNameBinding: &tk[9], 3787 Initializer: &AssignmentExpression{ 3788 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3789 Literal: &tk[13], 3790 Tokens: tk[13:14], 3791 }), 3792 Tokens: tk[13:14], 3793 }, 3794 Tokens: tk[9:14], 3795 }, 3796 Tokens: tk[6:14], 3797 }, 3798 }, 3799 Tokens: tk[5:15], 3800 }, 3801 Initializer: &AssignmentExpression{ 3802 ConditionalExpression: WrapConditional(&ObjectLiteral{ 3803 Tokens: tk[18:20], 3804 }), 3805 Tokens: tk[18:20], 3806 }, 3807 Tokens: tk[5:20], 3808 }, 3809 Tokens: tk[2:20], 3810 }, 3811 }, 3812 Tokens: tk[1:21], 3813 }, 3814 Initializer: &AssignmentExpression{ 3815 ConditionalExpression: WrapConditional(&ObjectLiteral{ 3816 Tokens: tk[24:26], 3817 }), 3818 Tokens: tk[24:26], 3819 }, 3820 Tokens: tk[1:26], 3821 }, 3822 }, 3823 Tokens: tk[:27], 3824 }, 3825 AssignmentExpression: &AssignmentExpression{ 3826 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3827 Literal: &tk[30], 3828 Tokens: tk[30:31], 3829 }), 3830 Tokens: tk[30:31], 3831 }, 3832 Tokens: tk[:31], 3833 } 3834 }}, 3835 {"([{a: b} = {}] = []) => 1", func(t *test, tk Tokens) { // 53 3836 t.Output = ArrowFunction{ 3837 FormalParameters: &FormalParameters{ 3838 FormalParameterList: []BindingElement{ 3839 { 3840 ArrayBindingPattern: &ArrayBindingPattern{ 3841 BindingElementList: []BindingElement{ 3842 { 3843 ObjectBindingPattern: &ObjectBindingPattern{ 3844 BindingPropertyList: []BindingProperty{ 3845 { 3846 PropertyName: PropertyName{ 3847 LiteralPropertyName: &tk[3], 3848 Tokens: tk[3:4], 3849 }, 3850 BindingElement: BindingElement{ 3851 SingleNameBinding: &tk[6], 3852 Tokens: tk[6:7], 3853 }, 3854 Tokens: tk[3:7], 3855 }, 3856 }, 3857 Tokens: tk[2:8], 3858 }, 3859 Initializer: &AssignmentExpression{ 3860 ConditionalExpression: WrapConditional(&ObjectLiteral{ 3861 Tokens: tk[11:13], 3862 }), 3863 Tokens: tk[11:13], 3864 }, 3865 Tokens: tk[2:13], 3866 }, 3867 }, 3868 Tokens: tk[1:14], 3869 }, 3870 Initializer: &AssignmentExpression{ 3871 ConditionalExpression: WrapConditional(&ArrayLiteral{ 3872 Tokens: tk[17:19], 3873 }), 3874 Tokens: tk[17:19], 3875 }, 3876 Tokens: tk[1:19], 3877 }, 3878 }, 3879 Tokens: tk[:20], 3880 }, 3881 AssignmentExpression: &AssignmentExpression{ 3882 ConditionalExpression: WrapConditional(&PrimaryExpression{ 3883 Literal: &tk[23], 3884 Tokens: tk[23:24], 3885 }), 3886 Tokens: tk[23:24], 3887 }, 3888 Tokens: tk[:24], 3889 } 3890 }}, 3891 {"([{a: b.c} = {}] = []) => 1", func(t *test, tk Tokens) { // 54 3892 t.Err = Error{ 3893 Err: Error{ 3894 Err: Error{ 3895 Err: Error{ 3896 Err: Error{ 3897 Err: Error{ 3898 Err: Error{ 3899 Err: Error{ 3900 Err: ErrNoIdentifier, 3901 Parsing: "BindingElement", 3902 Token: tk[6], 3903 }, 3904 Parsing: "BindingProperty", 3905 Token: tk[3], 3906 }, 3907 Parsing: "ObjectBindingPattern", 3908 Token: tk[2], 3909 }, 3910 Parsing: "BindingElement", 3911 Token: tk[2], 3912 }, 3913 Parsing: "ArrayBindingPattern", 3914 Token: tk[1], 3915 }, 3916 Parsing: "BindingElement", 3917 Token: tk[1], 3918 }, 3919 Parsing: "FormalParameters", 3920 Token: tk[0], 3921 }, 3922 Parsing: "ArrowFunction", 3923 Token: tk[0], 3924 } 3925 }}, 3926 {"([...a, ...b]) => 1", func(t *test, tk Tokens) { // 55 3927 t.Err = Error{ 3928 Err: Error{ 3929 Err: Error{ 3930 Err: Error{ 3931 Err: ErrBadRestElement, 3932 Parsing: "ArrayBindingPattern", 3933 Token: tk[1], 3934 }, 3935 Parsing: "BindingElement", 3936 Token: tk[1], 3937 }, 3938 Parsing: "FormalParameters", 3939 Token: tk[0], 3940 }, 3941 Parsing: "ArrowFunction", 3942 Token: tk[0], 3943 } 3944 }}, 3945 }, func(t *test) (Type, error) { 3946 var ( 3947 pe PrimaryExpression 3948 af ArrowFunction 3949 err error 3950 ) 3951 g := t.Tokens.NewGoal() 3952 if err = pe.parse(&g, t.Yield, t.Await); err == nil { 3953 t.Tokens.Score(g) 3954 err = af.parse(&t.Tokens, &pe, t.In, t.Yield, t.Await) 3955 } else { 3956 err = af.parse(&t.Tokens, nil, t.In, t.Yield, t.Await) 3957 } 3958 return af, err 3959 }) 3960 } 3961