diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-01-04 14:09:43 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-01-04 14:09:43 +0100 |
commit | cef1270dec61efb3544f26ceea0f6a4f57e0198a (patch) | |
tree | 23644f11905d6e4ce7af73e3c80d52bdd0ee399b | |
parent | 0ea04408653be843e37d03ce574f5d2eae682339 (diff) | |
download | vim-git-cef1270dec61efb3544f26ceea0f6a4f57e0198a.tar.gz |
patch 8.2.2298: Vim9: comment right after "(" of function not recognizedv8.2.2298
Problem: Vim9: comment right after "(" of function not recognized.
Solution: Do not skip over white space before calling get_function_args().
(closes #7613)
-rw-r--r-- | src/proto/userfunc.pro | 1 | ||||
-rw-r--r-- | src/testdir/test_vim9_func.vim | 36 | ||||
-rw-r--r-- | src/userfunc.c | 24 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 54 insertions, 9 deletions
diff --git a/src/proto/userfunc.pro b/src/proto/userfunc.pro index da4a880dc..f3bd2ae73 100644 --- a/src/proto/userfunc.pro +++ b/src/proto/userfunc.pro @@ -1,7 +1,6 @@ /* userfunc.c */ void func_init(void); hashtab_T *func_tbl_get(void); -int get_function_args(char_u **argp, char_u endchar, garray_T *newargs, garray_T *argtypes, int types_optional, int *varargs, garray_T *default_args, int skip, exarg_T *eap, char_u **line_to_free); char_u *get_lambda_name(void); char_u *register_cfunc(cfunc_T cb, cfunc_free_T cb_free, void *state); int get_lambda_tv(char_u **arg, typval_T *rettv, int types_optional, evalarg_T *evalarg); diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 251790bc5..e1d485341 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -241,6 +241,42 @@ def Test_call_default_args() delfunc g:Func enddef +def FuncWithComment( # comment + a: number, #comment + b: bool, # comment + c: string) #comment + assert_equal(4, a) + assert_equal(true, b) + assert_equal('yes', c) +enddef + +def Test_func_with_comments() + FuncWithComment(4, true, 'yes') + + var lines =<< trim END + def Func(# comment + arg: string) + enddef + END + CheckScriptFailure(lines, 'E125:', 1) + + lines =<< trim END + def Func( + arg: string# comment + ) + enddef + END + CheckScriptFailure(lines, 'E475:', 2) + + lines =<< trim END + def Func( + arg: string + )# comment + enddef + END + CheckScriptFailure(lines, 'E488:', 3) +enddef + def Test_nested_function() def Nested(arg: string): string return 'nested ' .. arg diff --git a/src/userfunc.c b/src/userfunc.c index ed7d1d605..38930a216 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -154,9 +154,10 @@ one_function_arg( /* * Get function arguments. + * "argp" should point to just after the "(", possibly to white space. * "argp" is advanced just after "endchar". */ - int + static int get_function_args( char_u **argp, char_u endchar, @@ -170,12 +171,12 @@ get_function_args( char_u **line_to_free) { int mustend = FALSE; - char_u *arg = *argp; - char_u *p = arg; + char_u *arg; + char_u *p; int c; int any_default = FALSE; char_u *expr; - char_u *whitep = arg; + char_u *whitep = *argp; if (newargs != NULL) ga_init2(newargs, (int)sizeof(char_u *), 3); @@ -190,6 +191,8 @@ get_function_args( /* * Isolate the arguments: "arg1, arg2, ...)" */ + arg = skipwhite(*argp); + p = arg; while (*p != endchar) { while (eap != NULL && eap->getline != NULL @@ -548,7 +551,7 @@ get_lambda_tv( // First, check if this is really a lambda expression. "->" or "=>" must // be found after the arguments. - s = skipwhite(*arg + 1); + s = *arg + 1; ret = get_function_args(&s, equal_arrow ? ')' : '-', NULL, types_optional ? &argtypes : NULL, types_optional, NULL, NULL, TRUE, NULL, NULL); @@ -564,7 +567,7 @@ get_lambda_tv( pnewargs = &newargs; else pnewargs = NULL; - *arg = skipwhite(*arg + 1); + *arg += 1; ret = get_function_args(arg, equal_arrow ? ')' : '-', pnewargs, types_optional ? &argtypes : NULL, types_optional, &varargs, NULL, FALSE, NULL, NULL); @@ -2964,6 +2967,7 @@ define_function(exarg_T *eap, char_u *name_arg) int is_global = FALSE; char_u *p; char_u *arg; + char_u *whitep; char_u *line_arg = NULL; garray_T newargs; garray_T argtypes; @@ -3159,7 +3163,6 @@ define_function(exarg_T *eap, char_u *name_arg) if (vim_strchr(p, '(') != NULL) p = vim_strchr(p, '('); } - p = skipwhite(p + 1); // In Vim9 script only global functions can be redefined. if (vim9script && eap->forceit && !is_global) @@ -3199,11 +3202,13 @@ define_function(exarg_T *eap, char_u *name_arg) // This may get more lines and make the pointers into the first line // invalid. + ++p; if (get_function_args(&p, ')', &newargs, eap->cmdidx == CMD_def ? &argtypes : NULL, FALSE, &varargs, &default_args, eap->skip, eap, &line_to_free) == FAIL) goto errret_2; + whitep = p; if (eap->cmdidx == CMD_def) { @@ -3215,6 +3220,7 @@ define_function(exarg_T *eap, char_u *name_arg) if (p > ret_type) { ret_type = vim_strnsave(ret_type, p - ret_type); + whitep = p; p = skipwhite(p); } else @@ -3229,6 +3235,7 @@ define_function(exarg_T *eap, char_u *name_arg) // find extra arguments "range", "dict", "abort" and "closure" for (;;) { + whitep = p; p = skipwhite(p); if (STRNCMP(p, "range", 5) == 0) { @@ -3267,7 +3274,8 @@ define_function(exarg_T *eap, char_u *name_arg) else if (*p != NUL && !(*p == '"' && (!vim9script || eap->cmdidx == CMD_function) && eap->cmdidx != CMD_def) - && !(*p == '#' && (vim9script || eap->cmdidx == CMD_def)) + && !(VIM_ISWHITE(*whitep) && *p == '#' + && (vim9script || eap->cmdidx == CMD_def)) && !eap->skip && !did_emsg) semsg(_(e_trailing_arg), p); diff --git a/src/version.c b/src/version.c index f17373567..a90576092 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2298, +/**/ 2297, /**/ 2296, |