(terminator: TokenType, allowAnnotations: boolean)
| 563 | // tfpdef: NAME [':' test] |
| 564 | // vfpdef: NAME; |
| 565 | private _parseVarArgsList(terminator: TokenType, allowAnnotations: boolean): ParameterNode[] { |
| 566 | let paramMap = new StringMap<string>(); |
| 567 | let paramList: ParameterNode[] = []; |
| 568 | let sawDefaultParam = false; |
| 569 | let reportedNonDefaultParamErr = false; |
| 570 | let sawKwSeparator = false; |
| 571 | let sawVarArgs = false; |
| 572 | let sawKwArgs = false; |
| 573 | |
| 574 | while (true) { |
| 575 | if (this._peekTokenType() === terminator) { |
| 576 | break; |
| 577 | } |
| 578 | |
| 579 | let param = this._parseParameter(allowAnnotations); |
| 580 | if (!param) { |
| 581 | this._consumeTokensUntilType(terminator); |
| 582 | break; |
| 583 | } |
| 584 | |
| 585 | if (param.name) { |
| 586 | let name = param.name.nameToken.value; |
| 587 | if (!paramMap.set(name, name)) { |
| 588 | this._addError(`Duplicate parameter '${ name }'`, param.name); |
| 589 | } |
| 590 | } |
| 591 | |
| 592 | if (param.category === ParameterCategory.Simple) { |
| 593 | if (param.defaultValue) { |
| 594 | sawDefaultParam = true; |
| 595 | } else if (sawDefaultParam && !sawKwSeparator) { |
| 596 | // Report this error only once. |
| 597 | if (!reportedNonDefaultParamErr) { |
| 598 | this._addError(`Non-default argument follows default argument`, param); |
| 599 | reportedNonDefaultParamErr = true; |
| 600 | } |
| 601 | } |
| 602 | } |
| 603 | |
| 604 | paramList.push(param); |
| 605 | |
| 606 | if (param.category === ParameterCategory.VarArgList) { |
| 607 | if (!param.name) { |
| 608 | if (sawKwSeparator) { |
| 609 | this._addError(`Only one '*' separator is allowed`, param); |
| 610 | } |
| 611 | sawKwSeparator = true; |
| 612 | } else { |
| 613 | if (sawVarArgs) { |
| 614 | this._addError(`Only one '*' parameter is allowed`, param); |
| 615 | } |
| 616 | sawVarArgs = true; |
| 617 | } |
| 618 | } |
| 619 | |
| 620 | if (param.category === ParameterCategory.VarArgDictionary) { |
| 621 | if (sawKwArgs) { |
| 622 | this._addError(`Only one '**' parameter is allowed`, param); |
no test coverage detected