class_docstr: This is the central parsing class Jinja uses.  It's passed to
  extensions and can be used to parse expressions or statements.
class_docstr_tok: ["This","is","the","central","parsing","class","Jinja","uses",".","It","'s","passed","to","extensions","and","can","be","used","to","parse","expressions","or","statements","."]
code: def parse_signature(self, node: _MacroCall) -> None:
      args = node.args = []
      defaults = node.defaults = []
      self.stream.expect("lparen")
      while self.stream.current.type != "rparen":
          if args:
              self.stream.expect("comma")
          arg = self.parse_assign_target(name_only=True)
          arg.set_ctx("param")
          if self.stream.skip_if("assign"):
              defaults.append(self.parse_expression())
          elif defaults:
              self.fail("non-default argument follows default argument")
          args.append(arg)
      self.stream.expect("rparen")
  
imports: import typing
  import typing
  from .None import nodes
  from .exceptions import TemplateAssertionError
  from .exceptions import TemplateSyntaxError
  from .lexer import describe_token
  from .lexer import describe_token_expr
label_desc: Use image node_id 21 for calling the Parser obj's underlying member method code with example usage: obj.parse_signature(node) without return types