From: Bram Moolenaar Date: Mon, 7 Feb 2022 21:54:01 +0000 (+0000) Subject: patch 8.2.4324: Vim9: script-local function name can start with "_" X-Git-Tag: v8.2.4324 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3787f26c2ed33732a36f26ebe46faeebfe0151af;p=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. --- diff --git a/src/errors.h b/src/errors.h index 53bd0cd26..ecd4eb92d 100644 --- a/src/errors.h +++ b/src/errors.h @@ -3228,3 +3228,7 @@ EXTERN char e_cannot_use_partial_here[] EXTERN char e_critical_error_in_python3_initialization_check_your_installation[] INIT(= N_("E1266: Critical error in python3 initialization, check your python3 installation")); #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 diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 86b0763dc..ebcd0fbc8 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -97,7 +97,7 @@ def Test_wrong_function_name() echo 'foo' endfunc END - v9.CheckScriptFailure(lines, 'E128:') + v9.CheckScriptFailure(lines, 'E1267:') lines =<< trim END vim9script @@ -105,7 +105,7 @@ def Test_wrong_function_name() echo 'foo' enddef END - v9.CheckScriptFailure(lines, 'E128:') + v9.CheckScriptFailure(lines, 'E1267:') enddef def Test_autoload_name_mismatch() @@ -685,11 +685,11 @@ def Test_nested_function() def _Inner() echo 'bad' enddef - Inner() + _Inner() enddef defcompile END - v9.CheckScriptFailure(lines, 'E128:') + v9.CheckScriptFailure(lines, 'E1267:') lines =<< trim END vim9script @@ -697,11 +697,27 @@ def Test_nested_function() def g:inner() echo 'bad' enddef - Inner() + g:inner() enddef defcompile 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 lines =<< trim END @@ -2772,7 +2788,7 @@ def Test_nested_inline_lambda() lines =<< trim END vim9script - def s:func() + def s:Func() range(10) ->mapnew((_, _) => ({ key: range(10)->mapnew((_, _) => { diff --git a/src/userfunc.c b/src/userfunc.c index 23131b751..0c54e3574 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -3884,15 +3884,6 @@ trans_function_name( // In Vim9 script a user function is script-local by default, unless it // starts with a lower case character: dict.func(). 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. @@ -3904,7 +3895,17 @@ trans_function_name( else if (lead > 0 || 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; + } if (vim9script || (lv.ll_exp_name != NULL && eval_fname_sid(lv.ll_exp_name)) || eval_fname_sid(*pp)) @@ -3925,7 +3926,10 @@ trans_function_name( else if (!(flags & TFN_INT) && (builtin_function(lv.ll_name, len) || (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; } if (!skip && !(flags & TFN_QUIET) && !(flags & TFN_NO_DEREF)) diff --git a/src/version.c b/src/version.c index 2d0bb2d6c..cefbd4089 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4324, /**/ 4323, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 080a53c69..debead418 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -888,7 +888,7 @@ compile_nested_function(exarg_T *eap, cctx_T *cctx, garray_T *lines_to_free) return NULL; 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; }