# HG changeset patch # User Bram Moolenaar # Date 1609766104 -3600 # Node ID 7e8703464f01177c5ed63cf5688a7fa48f9534f0 # Parent ecdd0d05edd8f285e9775cf9931d1dd52d7e80e0 patch 8.2.2298: Vim9: comment right after "(" of function not recognized Commit: https://github.com/vim/vim/commit/cef1270dec61efb3544f26ceea0f6a4f57e0198a Author: Bram Moolenaar Date: Mon Jan 4 14:09:43 2021 +0100 patch 8.2.2298: Vim9: comment right after "(" of function not recognized Problem: Vim9: comment right after "(" of function not recognized. Solution: Do not skip over white space before calling get_function_args(). (closes #7613) diff --git a/src/proto/userfunc.pro b/src/proto/userfunc.pro --- 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 --- 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 --- 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 *na 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 *na 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 *na // 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 *na 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 *na // 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 *na 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 --- 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,