code: func (p *parser) parseArguments(elementKind string) (*token, *ast.Arguments, bool, error) {
  	args := &ast.Arguments{}
  	gotComma := false
  	namedArgumentAdded := false
  	first := true
  	for {
  		next := p.peek()
  
  		if next.kind == tokenParenR {
  			// gotComma can be true or false here.
  			return p.pop(), args, gotComma, nil
  		}
  
  		if !first && !gotComma {
  			return nil, nil, false, MakeStaticError(fmt.Sprintf("Expected a comma before next %s, got %s.", elementKind, next), next.loc)
  		}
  
  		id, expr, err := p.parseArgument()
  		if err != nil {
  			return nil, nil, false, err
  		}
  		if id == nil {
  			if namedArgumentAdded {
  				return nil, nil, false, MakeStaticError("Positional argument after a named argument is not allowed", next.loc)
  			}
  			args.Positional = append(args.Positional, expr)
  		} else {
  			namedArgumentAdded = true
  			args.Named = append(args.Named, ast.NamedArgument{Name: *id, Arg: expr})
  		}
  
  		if p.peek().kind == tokenComma {
  			p.pop()
  			gotComma = true
  		} else {
  			gotComma = false
  		}
  
  		first = false
  	}
  }
docs: // TODO(sbarzowski) - this returned bool is weird
  // TODO(sbarzowski) - name - it's also used for parameters