summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-02-23 22:12:02 +0000
committerBram Moolenaar <Bram@vim.org>2022-02-23 22:12:02 +0000
commitdea5ab0fc5bb51105078d5349f987496b1aa8d6f (patch)
tree9effcbd78f12bdfe98b081b3507dd08c5843ec9a
parentfa02616718103be3f9e13e26d57905d4eddf836d (diff)
downloadvim-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.h3
-rw-r--r--src/testdir/test_vim9_func.vim57
-rw-r--r--src/userfunc.c17
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c6
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;
}