To: vim_dev@googlegroups.com Subject: Patch 8.2.0570 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0570 Problem: Vim9: no error when omitting type from argument. Solution: Enforce specifying argument types. Files: src/userfunc.c, src/ex_eval.c, src/testdir/test_vim9_script.vim, src/testdir/test_vim9_func.vim, src/testdir/test_vim9_expr.vim src/testdir/test_vim9_disassemble.vim *** ../vim-8.2.0569/src/userfunc.c 2020-04-13 14:41:31.667954106 +0200 --- src/userfunc.c 2020-04-13 16:49:24.738322434 +0200 *************** *** 64,77 **** } /* ! * Get one function argument and an optional type: "arg: type". * Return a pointer to after the type. * When something is wrong return "arg". */ static char_u * one_function_arg(char_u *arg, garray_T *newargs, garray_T *argtypes, int skip) { ! char_u *p = arg; while (ASCII_ISALNUM(*p) || *p == '_') ++p; --- 64,79 ---- } /* ! * Get one function argument. ! * If "argtypes" is not NULL also get the type: "arg: type". * Return a pointer to after the type. * When something is wrong return "arg". */ static char_u * one_function_arg(char_u *arg, garray_T *newargs, garray_T *argtypes, int skip) { ! char_u *p = arg; ! char_u *arg_copy = NULL; while (ASCII_ISALNUM(*p) || *p == '_') ++p; *************** *** 87,93 **** return arg; if (newargs != NULL) { - char_u *arg_copy; int c; int i; --- 89,94 ---- *************** *** 119,132 **** { char_u *type = NULL; if (*p == ':') { type = skipwhite(p + 1); p = skip_type(type); type = vim_strnsave(type, p - type); } ! else if (*skipwhite(p) == ':') ! emsg(_("E1059: No white space allowed before :")); ((char_u **)argtypes->ga_data)[argtypes->ga_len++] = type; } --- 120,143 ---- { char_u *type = NULL; + if (VIM_ISWHITE(*p) && *skipwhite(p) == ':') + { + semsg(_("E1059: No white space allowed before colon: %s"), + arg_copy == NULL ? arg : arg_copy); + p = skipwhite(p); + } if (*p == ':') { type = skipwhite(p + 1); p = skip_type(type); type = vim_strnsave(type, p - type); } ! else if (*skipwhite(p) != '=') ! { ! semsg(_("E1077: Missing argument type for %s"), ! arg_copy == NULL ? arg : arg_copy); ! return arg; ! } ((char_u **)argtypes->ga_data)[argtypes->ga_len++] = type; } *** ../vim-8.2.0569/src/ex_eval.c 2020-04-02 21:13:21.392362410 +0200 --- src/ex_eval.c 2020-04-13 16:53:25.545786441 +0200 *************** *** 2273,2281 **** * ":endfunction" when not after a ":function" */ void ! ex_endfunction(exarg_T *eap UNUSED) { ! emsg(_("E193: :endfunction not inside a function")); } /* --- 2273,2284 ---- * ":endfunction" when not after a ":function" */ void ! ex_endfunction(exarg_T *eap) { ! if (eap->cmdidx == CMD_enddef) ! emsg(_("E193: :enddef not inside a function")); ! else ! emsg(_("E193: :endfunction not inside a function")); } /* *** ../vim-8.2.0569/src/testdir/test_vim9_script.vim 2020-04-13 14:41:31.671954102 +0200 --- src/testdir/test_vim9_script.vim 2020-04-13 16:55:54.097456309 +0200 *************** *** 917,923 **** CheckDefFailure(['for # in range(5)'], 'E690:') CheckDefFailure(['for i In range(5)'], 'E690:') CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') ! CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:') CheckDefFailure(['for i in "text"'], 'E1024:') CheckDefFailure(['for i in xxx'], 'E1001:') CheckDefFailure(['endfor'], 'E588:') --- 917,923 ---- CheckDefFailure(['for # in range(5)'], 'E690:') CheckDefFailure(['for i In range(5)'], 'E690:') CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') ! CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:') CheckDefFailure(['for i in "text"'], 'E1024:') CheckDefFailure(['for i in xxx'], 'E1001:') CheckDefFailure(['endfor'], 'E588:') *** ../vim-8.2.0569/src/testdir/test_vim9_func.vim 2020-04-13 14:41:31.671954102 +0200 --- src/testdir/test_vim9_func.vim 2020-04-13 16:55:04.205567128 +0200 *************** *** 250,255 **** --- 250,256 ---- def Test_arg_type_wrong() CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing ') CheckScriptFailure(['def Func4(...)', 'echo "a"', 'enddef'], 'E1055: Missing name after ...') + CheckScriptFailure(['def Func5(items)', 'echo "a"'], 'E1077:') enddef def Test_vim9script_call() *** ../vim-8.2.0569/src/testdir/test_vim9_expr.vim 2020-04-12 20:55:16.998819659 +0200 --- src/testdir/test_vim9_expr.vim 2020-04-13 16:50:02.206239331 +0200 *************** *** 859,869 **** assert_equal(88, --nr) enddef ! def Echo(arg): string return arg enddef ! def s:EchoArg(arg): string return arg enddef --- 859,869 ---- assert_equal(88, --nr) enddef ! def Echo(arg: any): string return arg enddef ! def s:EchoArg(arg: any): string return arg enddef *************** *** 991,996 **** --- 991,997 ---- assert_equal(123, d.key) enddef + func Test_expr7_trailing_fails() call CheckDefFailureList(['let l = [2]', 'l->{l -> add(l, 8)}'], 'E107') call CheckDefFailureList(['let l = [2]', 'l->{l -> add(l, 8)} ()'], 'E274') *** ../vim-8.2.0569/src/testdir/test_vim9_disassemble.vim 2020-04-12 22:53:50.767656185 +0200 --- src/testdir/test_vim9_disassemble.vim 2020-04-13 16:36:03.452065125 +0200 *************** *** 160,166 **** res) enddef ! def FuncWithArg(arg) echo arg enddef --- 160,166 ---- res) enddef ! def FuncWithArg(arg: any) echo arg enddef *************** *** 432,438 **** instr) enddef ! def AndOr(arg): string if arg == 1 && arg != 2 || arg == 4 return 'yes' endif --- 432,438 ---- instr) enddef ! def AndOr(arg: any): string if arg == 1 && arg != 2 || arg == 4 return 'yes' endif *** ../vim-8.2.0569/src/version.c 2020-04-13 15:06:49.917355649 +0200 --- src/version.c 2020-04-13 16:22:59.373677291 +0200 *************** *** 740,741 **** --- 740,743 ---- { /* Add new patch number below this line */ + /**/ + 570, /**/ -- "I've been teaching myself to play the piano for about 5 years and now write most of my songs on it, mainly because I can never find any paper." Jeff Lynne, ELO's greatest hits /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///