/*
* Get one function argument.
- * If "argtypes" is not NULL also get the type: "arg: type".
+ * If "argtypes" is not NULL also get the type: "arg: type" (:def function).
* If "types_optional" is TRUE a missing type is OK, use "any".
* If "evalarg" is not NULL use it to check for an already declared name.
* Return a pointer to after the type.
{
char_u *p = arg;
char_u *arg_copy = NULL;
+ int is_underscore = FALSE;
while (ASCII_ISALNUM(*p) || *p == '_')
++p;
*p = c;
return arg;
}
-
- // Check for duplicate argument name.
- for (i = 0; i < newargs->ga_len; ++i)
- if (STRCMP(((char_u **)(newargs->ga_data))[i], arg_copy) == 0)
- {
- semsg(_("E853: Duplicate argument name: %s"), arg_copy);
- vim_free(arg_copy);
- return arg;
- }
+ is_underscore = arg_copy[0] == '_' && arg_copy[1] == NUL;
+ if (argtypes != NULL && !is_underscore)
+ // Check for duplicate argument name.
+ for (i = 0; i < newargs->ga_len; ++i)
+ if (STRCMP(((char_u **)(newargs->ga_data))[i], arg_copy) == 0)
+ {
+ semsg(_("E853: Duplicate argument name: %s"), arg_copy);
+ vim_free(arg_copy);
+ return arg;
+ }
((char_u **)(newargs->ga_data))[newargs->ga_len] = arg_copy;
newargs->ga_len++;
if (!skip)
type = vim_strnsave(type, p - type);
}
- else if (*skipwhite(p) != '=' && !types_optional)
+ else if (*skipwhite(p) != '=' && !types_optional && !is_underscore)
{
semsg(_(e_missing_argument_type_for_str),
arg_copy == NULL ? arg : arg_copy);