(self, node)
| 751 | return nodes.Slice(lineno=lineno, *args) |
| 752 | |
| 753 | def parse_call(self, node): |
| 754 | token = self.stream.expect('lparen') |
| 755 | args = [] |
| 756 | kwargs = [] |
| 757 | dyn_args = dyn_kwargs = None |
| 758 | require_comma = False |
| 759 | |
| 760 | def ensure(expr): |
| 761 | if not expr: |
| 762 | self.fail('invalid syntax for function call expression', |
| 763 | token.lineno) |
| 764 | |
| 765 | while self.stream.current.type != 'rparen': |
| 766 | if require_comma: |
| 767 | self.stream.expect('comma') |
| 768 | # support for trailing comma |
| 769 | if self.stream.current.type == 'rparen': |
| 770 | break |
| 771 | if self.stream.current.type == 'mul': |
| 772 | ensure(dyn_args is None and dyn_kwargs is None) |
| 773 | next(self.stream) |
| 774 | dyn_args = self.parse_expression() |
| 775 | elif self.stream.current.type == 'pow': |
| 776 | ensure(dyn_kwargs is None) |
| 777 | next(self.stream) |
| 778 | dyn_kwargs = self.parse_expression() |
| 779 | else: |
| 780 | ensure(dyn_args is None and dyn_kwargs is None) |
| 781 | if self.stream.current.type == 'name' and \ |
| 782 | self.stream.look().type == 'assign': |
| 783 | key = self.stream.current.value |
| 784 | self.stream.skip(2) |
| 785 | value = self.parse_expression() |
| 786 | kwargs.append(nodes.Keyword(key, value, |
| 787 | lineno=value.lineno)) |
| 788 | else: |
| 789 | ensure(not kwargs) |
| 790 | args.append(self.parse_expression()) |
| 791 | |
| 792 | require_comma = True |
| 793 | self.stream.expect('rparen') |
| 794 | |
| 795 | if node is None: |
| 796 | return args, kwargs, dyn_args, dyn_kwargs |
| 797 | return nodes.Call(node, args, kwargs, dyn_args, dyn_kwargs, |
| 798 | lineno=token.lineno) |
| 799 | |
| 800 | def parse_filter(self, node, start_inline=False): |
| 801 | while self.stream.current.type == 'pipe' or start_inline: |
no test coverage detected