Skip to content

Commit

Permalink
patch 8.2.4460: Vim9: wrong error for defining dict function
Browse files Browse the repository at this point in the history
Problem:    Vim9: wrong error for defining dict function.
Solution:   Explicitly check for trying to define a dict function.
            (closes 9827)
  • Loading branch information
brammool committed Feb 23, 2022
1 parent fa02616 commit dea5ab0
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 5 deletions.
3 changes: 2 additions & 1 deletion src/errors.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
57 changes: 57 additions & 0 deletions src/testdir/test_vim9_func.vim
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
17 changes: 14 additions & 3 deletions src/userfunc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -754,6 +754,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
4460,
/**/
4459,
/**/
Expand Down
6 changes: 5 additions & 1 deletion src/vim9compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit dea5ab0

Please sign in to comment.