diff options
Diffstat (limited to 'src/userfunc.c')
-rw-r--r-- | src/userfunc.c | 50 |
1 files changed, 42 insertions, 8 deletions
diff --git a/src/userfunc.c b/src/userfunc.c index 9ac1274a4..f3e475711 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -224,7 +224,6 @@ get_function_args( char_u *p; int c; int any_default = FALSE; - char_u *expr; char_u *whitep = *argp; if (newargs != NULL) @@ -302,6 +301,34 @@ get_function_args( arg = p; while (ASCII_ISALNUM(*p) || *p == '_') ++p; + char_u *argend = p; + + if (*skipwhite(p) == '=') + { + char_u *defval = skipwhite(skipwhite(p) + 1); + if (STRNCMP(defval, "v:none", 6) != 0) + { + semsg(_(e_constructor_default_value_must_be_vnone_str), p); + goto err_ret; + } + any_default = TRUE; + p = defval + 6; + + if (ga_grow(default_args, 1) == FAIL) + goto err_ret; + + char_u *expr = vim_strsave((char_u *)"v:none"); + if (expr == NULL) + goto err_ret; + ((char_u **)(default_args->ga_data)) + [default_args->ga_len] = expr; + default_args->ga_len++; + } + else if (any_default) + { + emsg(_(e_non_default_argument_follows_default_argument)); + goto err_ret; + } // TODO: check the argument is indeed a member if (newargs != NULL && ga_grow(newargs, 1) == FAIL) @@ -309,7 +336,7 @@ get_function_args( if (newargs != NULL) { ((char_u **)(newargs->ga_data))[newargs->ga_len] = - vim_strnsave(arg, p - arg); + vim_strnsave(arg, argend - arg); newargs->ga_len++; if (argtypes != NULL && ga_grow(argtypes, 1) == OK) @@ -322,15 +349,22 @@ get_function_args( if (ga_grow(newlines, 1) == OK) { // "this.name = name" - int len = 5 + (p - arg) + 3 + (p - arg) + 1; + int len = 5 + (argend - arg) + 3 + (argend - arg) + 1; + if (any_default) + len += 14 + 10; char_u *assignment = alloc(len); if (assignment != NULL) { - c = *p; - *p = NUL; - vim_snprintf((char *)assignment, len, + c = *argend; + *argend = NUL; + if (any_default) + vim_snprintf((char *)assignment, len, + "ifargisset %d this.%s = %s", + default_args->ga_len - 1, arg, arg); + else + vim_snprintf((char *)assignment, len, "this.%s = %s", arg, arg); - *p = c; + *argend = c; ((char_u **)(newlines->ga_data))[ newlines->ga_len++] = assignment; } @@ -361,7 +395,7 @@ get_function_args( // find the end of the expression (doesn't evaluate it) any_default = TRUE; p = skipwhite(np + 1); - expr = p; + char_u *expr = p; if (eval1(&p, &rettv, NULL) != FAIL) { if (!skip) |