diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-08-01 18:53:07 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-08-01 18:53:07 +0200 |
commit | 333894b195479c9304a19f4e6ec1a9c09ecf07e4 (patch) | |
tree | f3d51abe5fcb010185d6b471f1100df09745f0a3 | |
parent | f5a48010ef9e47319185f1aaac1bc6d45cd4d47a (diff) | |
download | vim-git-333894b195479c9304a19f4e6ec1a9c09ecf07e4.tar.gz |
patch 8.2.1343: Vim9: cannot find global function when using g:v8.2.1343
Problem: Vim9: cannot find global function when using g: when local
function with the same name exists.
Solution: Find global function when using g:.
-rw-r--r-- | src/testdir/test_vim9_func.vim | 15 | ||||
-rw-r--r-- | src/userfunc.c | 24 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 32 insertions, 9 deletions
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 7298d9a73..3acae98ea 100644 --- 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 diff --git a/src/userfunc.c b/src/userfunc.c index 4c1e26195..520c114ef 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -789,9 +789,10 @@ find_func_even_dead(char_u *name, int is_global, cctx_T *cctx) if (!is_global) { - char_u *after_script = NULL; + int vim9script = in_vim9script(); + char_u *after_script = NULL; - if (in_vim9script()) + 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_global, cctx_T *cctx) 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_global, cctx_T *cctx) 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; + int is_global = FALSE; - // Ignore "g:" before a function name. + // 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 diff --git a/src/version.c b/src/version.c index 021487db2..33274ac62 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 */ /**/ + 1343, +/**/ 1342, /**/ 1341, |