diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-02-23 22:12:02 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-02-23 22:12:02 +0000 |
commit | dea5ab0fc5bb51105078d5349f987496b1aa8d6f (patch) | |
tree | 9effcbd78f12bdfe98b081b3507dd08c5843ec9a | |
parent | fa02616718103be3f9e13e26d57905d4eddf836d (diff) | |
download | vim-git-dea5ab0fc5bb51105078d5349f987496b1aa8d6f.tar.gz |
patch 8.2.4460: Vim9: wrong error for defining dict functionv8.2.4460
Problem: Vim9: wrong error for defining dict function.
Solution: Explicitly check for trying to define a dict function.
(closes 9827)
-rw-r--r-- | src/errors.h | 3 | ||||
-rw-r--r-- | src/testdir/test_vim9_func.vim | 57 | ||||
-rw-r--r-- | src/userfunc.c | 17 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 6 |
5 files changed, 80 insertions, 5 deletions
diff --git a/src/errors.h b/src/errors.h index 5f2685ab3..72c0d1284 100644 --- a/src/errors.h +++ b/src/errors.h @@ -3010,7 +3010,8 @@ EXTERN char e_variable_arguments_type_must_be_list_str[] 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 index 81a67d97f..74883975b 100644 --- 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 index 3a66d2732..ed2fb8668 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -4268,10 +4268,21 @@ define_function(exarg_T *eap, char_u *name_arg, garray_T *lines_to_free) } 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 index f8fb3139c..a34bad1e7 100644 --- 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 index 6eb6e160e..898712396 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -831,7 +831,11 @@ compile_nested_function(exarg_T *eap, cctx_T *cctx, garray_T *lines_to_free) { 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; } |