# HG changeset patch # User Bram Moolenaar # Date 1645654503 -3600 # Node ID 6a0ecde89d357bf58b12f67507e6fbfa0064fcf0 # Parent ba223992a3253f29eabcc90c7dc505f00c260e1b patch 8.2.4460: Vim9: wrong error for defining dict function Commit: https://github.com/vim/vim/commit/dea5ab0fc5bb51105078d5349f987496b1aa8d6f Author: Bram Moolenaar Date: Wed Feb 23 22:12:02 2022 +0000 patch 8.2.4460: Vim9: wrong error for defining dict function Problem: Vim9: wrong error for defining dict function. Solution: Explicitly check for trying to define a dict function. (closes 9827) diff --git a/src/errors.h b/src/errors.h --- a/src/errors.h +++ b/src/errors.h @@ -3010,7 +3010,8 @@ EXTERN char e_variable_arguments_type_mu INIT(= N_("E1180: Variable arguments type must be a list: %s")); EXTERN char e_cannot_use_underscore_here[] INIT(= N_("E1181: Cannot use an underscore here")); -// E1182 unused +EXTERN char e_cannot_define_dict_func_in_vim9_script_str[] + INIT(= N_("E1182: Cannot define a dict function in Vim9 script: %s")); EXTERN char e_cannot_use_range_with_assignment_operator_str[] INIT(= N_("E1183: Cannot use a range with an assignment operator: %s")); #endif 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 @@ -106,6 +106,63 @@ def Test_wrong_function_name() enddef END v9.CheckScriptFailure(lines, 'E1267:') + + lines =<< trim END + vim9script + var Object = {} + function Object.Method() + endfunction + END + v9.CheckScriptFailure(lines, 'E1182:') + + lines =<< trim END + vim9script + var Object = {} + def Object.Method() + enddef + END + v9.CheckScriptFailure(lines, 'E1182:') + + lines =<< trim END + vim9script + g:Object = {} + function g:Object.Method() + endfunction + END + v9.CheckScriptFailure(lines, 'E1182:') + + lines =<< trim END + let s:Object = {} + def Define() + function s:Object.Method() + endfunction + enddef + defcompile + END + v9.CheckScriptFailure(lines, 'E1182:') + delfunc g:Define + + lines =<< trim END + let s:Object = {} + def Define() + def Object.Method() + enddef + enddef + defcompile + END + v9.CheckScriptFailure(lines, 'E1182:') + delfunc g:Define + + lines =<< trim END + let g:Object = {} + def Define() + function g:Object.Method() + endfunction + enddef + defcompile + END + v9.CheckScriptFailure(lines, 'E1182:') + delfunc g:Define enddef def Test_autoload_name_mismatch() diff --git a/src/userfunc.c b/src/userfunc.c --- a/src/userfunc.c +++ b/src/userfunc.c @@ -4268,10 +4268,21 @@ define_function(exarg_T *eap, char_u *na } else { - if (vim9script && p[0] == 's' && p[1] == ':') + if (vim9script) { - semsg(_(e_cannot_use_s_colon_in_vim9_script_str), p); - return NULL; + if (p[0] == 's' && p[1] == ':') + { + semsg(_(e_cannot_use_s_colon_in_vim9_script_str), p); + return NULL; + } + p = to_name_end(p, TRUE); + if (*skipwhite(p) == '.' && vim_strchr(p, '(') != NULL) + { + semsg(_(e_cannot_define_dict_func_in_vim9_script_str), + eap->arg); + return NULL; + } + p = eap->arg; } name = save_function_name(&p, &is_global, eap->skip, diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4460, +/**/ 4459, /**/ 4458, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -831,7 +831,11 @@ compile_nested_function(exarg_T *eap, cc { if (!ends_excmd2(name_start, name_end)) { - semsg(_(e_invalid_command_str), eap->cmd); + if (*skipwhite(name_end) == '.') + semsg(_(e_cannot_define_dict_func_in_vim9_script_str), + eap->cmd); + else + semsg(_(e_invalid_command_str), eap->cmd); return NULL; }