1
0
forked from aniani/vim

patch 8.2.4324: Vim9: script-local function name can start with "_"

Problem:    Vim9: script-local function name can start with "_".
Solution:   Check for leading capital after "s:".  Correct error message.
This commit is contained in:
Bram Moolenaar
2022-02-07 21:54:01 +00:00
parent f681cfb90b
commit 3787f26c2e
5 changed files with 44 additions and 18 deletions

View File

@@ -3228,3 +3228,7 @@ EXTERN char e_cannot_use_partial_here[]
EXTERN char e_critical_error_in_python3_initialization_check_your_installation[] EXTERN char e_critical_error_in_python3_initialization_check_your_installation[]
INIT(= N_("E1266: Critical error in python3 initialization, check your python3 installation")); INIT(= N_("E1266: Critical error in python3 initialization, check your python3 installation"));
#endif #endif
#ifdef FEAT_EVAL
EXTERN char e_function_name_must_start_with_capital_str[]
INIT(= N_("E1267: Function name must start with a capital: %s"));
#endif

View File

@@ -97,7 +97,7 @@ def Test_wrong_function_name()
echo 'foo' echo 'foo'
endfunc endfunc
END END
v9.CheckScriptFailure(lines, 'E128:') v9.CheckScriptFailure(lines, 'E1267:')
lines =<< trim END lines =<< trim END
vim9script vim9script
@@ -105,7 +105,7 @@ def Test_wrong_function_name()
echo 'foo' echo 'foo'
enddef enddef
END END
v9.CheckScriptFailure(lines, 'E128:') v9.CheckScriptFailure(lines, 'E1267:')
enddef enddef
def Test_autoload_name_mismatch() def Test_autoload_name_mismatch()
@@ -685,11 +685,11 @@ def Test_nested_function()
def _Inner() def _Inner()
echo 'bad' echo 'bad'
enddef enddef
Inner() _Inner()
enddef enddef
defcompile defcompile
END END
v9.CheckScriptFailure(lines, 'E128:') v9.CheckScriptFailure(lines, 'E1267:')
lines =<< trim END lines =<< trim END
vim9script vim9script
@@ -697,11 +697,27 @@ def Test_nested_function()
def g:inner() def g:inner()
echo 'bad' echo 'bad'
enddef enddef
Inner() g:inner()
enddef enddef
defcompile defcompile
END END
v9.CheckScriptFailure(lines, 'E128:') v9.CheckScriptFailure(lines, 'E1267:')
lines =<< trim END
vim9script
def g:_Func()
echo 'bad'
enddef
END
v9.CheckScriptFailure(lines, 'E1267:')
lines =<< trim END
vim9script
def s:_Func()
echo 'bad'
enddef
END
v9.CheckScriptFailure(lines, 'E1267:')
# nested function inside conditional # nested function inside conditional
lines =<< trim END lines =<< trim END
@@ -2772,7 +2788,7 @@ def Test_nested_inline_lambda()
lines =<< trim END lines =<< trim END
vim9script vim9script
def s:func() def s:Func()
range(10) range(10)
->mapnew((_, _) => ({ ->mapnew((_, _) => ({
key: range(10)->mapnew((_, _) => { key: range(10)->mapnew((_, _) => {

View File

@@ -3884,15 +3884,6 @@ trans_function_name(
// In Vim9 script a user function is script-local by default, unless it // In Vim9 script a user function is script-local by default, unless it
// starts with a lower case character: dict.func(). // starts with a lower case character: dict.func().
vim9script = ASCII_ISUPPER(*start) && in_vim9script(); vim9script = ASCII_ISUPPER(*start) && in_vim9script();
if (vim9script)
{
char_u *p;
// SomeScript#func() is a global function.
for (p = start; *p != NUL && *p != '('; ++p)
if (*p == AUTOLOAD_CHAR)
vim9script = FALSE;
}
/* /*
* Copy the function name to allocated memory. * Copy the function name to allocated memory.
@@ -3904,7 +3895,17 @@ trans_function_name(
else if (lead > 0 || vim9script) else if (lead > 0 || vim9script)
{ {
if (!vim9script) if (!vim9script)
{
if (in_vim9script() && lead == 2 && !ASCII_ISUPPER(*lv.ll_name))
{
semsg(_(in_vim9script()
? e_function_name_must_start_with_capital_str
: e_function_name_must_start_with_capital_or_s_str),
start);
goto theend;
}
lead = 3; lead = 3;
}
if (vim9script || (lv.ll_exp_name != NULL if (vim9script || (lv.ll_exp_name != NULL
&& eval_fname_sid(lv.ll_exp_name)) && eval_fname_sid(lv.ll_exp_name))
|| eval_fname_sid(*pp)) || eval_fname_sid(*pp))
@@ -3925,7 +3926,10 @@ trans_function_name(
else if (!(flags & TFN_INT) && (builtin_function(lv.ll_name, len) else if (!(flags & TFN_INT) && (builtin_function(lv.ll_name, len)
|| (in_vim9script() && *lv.ll_name == '_'))) || (in_vim9script() && *lv.ll_name == '_')))
{ {
semsg(_(e_function_name_must_start_with_capital_or_s_str), start); semsg(_(in_vim9script()
? e_function_name_must_start_with_capital_str
: e_function_name_must_start_with_capital_or_s_str),
start);
goto theend; goto theend;
} }
if (!skip && !(flags & TFN_QUIET) && !(flags & TFN_NO_DEREF)) if (!skip && !(flags & TFN_QUIET) && !(flags & TFN_NO_DEREF))

View File

@@ -746,6 +746,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
4324,
/**/ /**/
4323, 4323,
/**/ /**/

View File

@@ -888,7 +888,7 @@ compile_nested_function(exarg_T *eap, cctx_T *cctx, garray_T *lines_to_free)
return NULL; return NULL;
if (!ASCII_ISUPPER(is_global ? name_start[2] : name_start[0])) if (!ASCII_ISUPPER(is_global ? name_start[2] : name_start[0]))
{ {
semsg(_(e_function_name_must_start_with_capital_or_s_str), name_start); semsg(_(e_function_name_must_start_with_capital_str), name_start);
return NULL; return NULL;
} }