Mercurial > vim
changeset 21586:5470c36ed7e6 v8.2.1343
patch 8.2.1343: Vim9: cannot find global function when using g:
Commit: https://github.com/vim/vim/commit/333894b195479c9304a19f4e6ec1a9c09ecf07e4
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Aug 1 18:53:07 2020 +0200
patch 8.2.1343: Vim9: cannot find global function when using g:
Problem: Vim9: cannot find global function when using g: when local
function with the same name exists.
Solution: Find global function when using g:.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 01 Aug 2020 19:00:03 +0200 |
parents | 31cfab8f9ced |
children | 5a1fbb77df55 |
files | src/testdir/test_vim9_func.vim src/userfunc.c src/version.c |
diffstat | 3 files changed, 34 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -161,6 +161,21 @@ def Test_nested_global_function() CheckScriptSuccess(lines) enddef +def Test_global_local_function() + let lines =<< trim END + vim9script + def g:Func(): string + return 'global' + enddef + def Func(): string + return 'local' + enddef + assert_equal('global', g:Func()) + assert_equal('local', Func()) + END + CheckScriptSuccess(lines) +enddef + func TakesOneArg(arg) echo a:arg endfunc
--- a/src/userfunc.c +++ b/src/userfunc.c @@ -789,9 +789,10 @@ find_func_even_dead(char_u *name, int is if (!is_global) { - char_u *after_script = NULL; - - if (in_vim9script()) + int vim9script = in_vim9script(); + char_u *after_script = NULL; + + if (vim9script) { // Find script-local function before global one. func = find_func_with_sid(name, current_sctx.sc_sid); @@ -799,7 +800,7 @@ find_func_even_dead(char_u *name, int is return func; } - if (!in_vim9script() + if (!vim9script && name[0] == K_SPECIAL && name[1] == KS_EXTRA && name[2] == KE_SNR) @@ -815,7 +816,7 @@ find_func_even_dead(char_u *name, int is else after_script = NULL; } - if (in_vim9script() || after_script != NULL) + if (vim9script || after_script != NULL) { // Find imported function before global one. imported = find_imported( @@ -2086,10 +2087,14 @@ call_func( if (error == FCERR_NONE && funcexe->evaluate) { char_u *rfname = fname; - - // Ignore "g:" before a function name. + int is_global = FALSE; + + // Skip "g:" before a function name. if (fp == NULL && fname[0] == 'g' && fname[1] == ':') + { + is_global = TRUE; rfname = fname + 2; + } rettv->v_type = VAR_NUMBER; // default rettv is number zero rettv->vval.v_number = 0; @@ -2101,7 +2106,7 @@ call_func( * User defined function. */ if (fp == NULL) - fp = find_func(rfname, FALSE, NULL); + fp = find_func(rfname, is_global, NULL); // Trigger FuncUndefined event, may load the function. if (fp == NULL @@ -2110,13 +2115,13 @@ call_func( && !aborting()) { // executed an autocommand, search for the function again - fp = find_func(rfname, FALSE, NULL); + fp = find_func(rfname, is_global, NULL); } // Try loading a package. if (fp == NULL && script_autoload(rfname, TRUE) && !aborting()) { // loaded a package, search for the function again - fp = find_func(rfname, FALSE, NULL); + fp = find_func(rfname, is_global, NULL); } if (fp == NULL) { @@ -2125,7 +2130,7 @@ call_func( // If using Vim9 script try not local to the script. // TODO: should not do this if the name started with "s:". if (p != NULL) - fp = find_func(p, FALSE, NULL); + fp = find_func(p, is_global, NULL); } if (fp != NULL && (fp->uf_flags & FC_DELETED)) @@ -2175,6 +2180,7 @@ call_func( */ error = call_internal_func(fname, argcount, argvars, rettv); } + /* * The function call (or "FuncUndefined" autocommand sequence) might * have been aborted by an error, an interrupt, or an explicitly thrown