| 1635 | return null; |
| 1636 | } |
| 1637 | _parseArguments(terminal) { |
| 1638 | let posonlyargs = []; |
| 1639 | let args = []; |
| 1640 | let vararg = null; |
| 1641 | const kwonlyargs = []; |
| 1642 | const kw_defaults = []; |
| 1643 | let kwarg = null; |
| 1644 | const defaults = []; |
| 1645 | let is_slash = false; |
| 1646 | let is_vararg = false; // '*' |
| 1647 | let is_kwarg = false; // '**' |
| 1648 | const read = (required) => { |
| 1649 | const name = this._parseName(required); |
| 1650 | if (name) { |
| 1651 | const annotation = terminal !== ':' && this._tokenizer.accept(':') ? this._parseType() : null; |
| 1652 | return new ast.arg(name.id, annotation, null); |
| 1653 | } |
| 1654 | return null; |
| 1655 | }; |
| 1656 | while (!this._tokenizer.accept(terminal)) { |
| 1657 | this._tokenizer.accept('\n'); |
| 1658 | if (this._tokenizer.accept('/')) { |
| 1659 | if (is_slash || is_vararg || is_kwarg) { |
| 1660 | throw new python.Error(`Invalid '/' in arguments ${this._location()}`); |
| 1661 | } |
| 1662 | is_slash = true; |
| 1663 | } else if (this._tokenizer.accept('*')) { |
| 1664 | if (is_vararg) { |
| 1665 | throw new python.Error(`Multiple '*' arguments ${this._location()}`); |
| 1666 | } |
| 1667 | is_vararg = true; |
| 1668 | const arg = read(false); |
| 1669 | vararg = arg ? arg : vararg; |
| 1670 | } else if (this._tokenizer.accept('**')) { |
| 1671 | if (is_kwarg) { |
| 1672 | throw new python.Error(`Multiple '**' arguments ${this._location()}`); |
| 1673 | } |
| 1674 | is_kwarg = true; |
| 1675 | kwarg = read(true); |
| 1676 | } else { |
| 1677 | const arg = read(false); |
| 1678 | if (!arg) { |
| 1679 | this._tokenizer.expect(terminal); |
| 1680 | break; |
| 1681 | } |
| 1682 | const default_value = this._tokenizer.accept('=') ? this._parseExpression() : null; |
| 1683 | if (!is_vararg && !is_kwarg) { |
| 1684 | if (is_slash) { |
| 1685 | args.push(arg); |
| 1686 | } else { |
| 1687 | posonlyargs.push(arg); |
| 1688 | } |
| 1689 | if (default_value !== null) { |
| 1690 | defaults.push(default_value); |
| 1691 | } |
| 1692 | } else if (is_vararg && !is_kwarg) { |
| 1693 | kwonlyargs.push(arg); |
| 1694 | kw_defaults.push(default_value); |