]> granicus.if.org Git - vim/commitdiff
patch 8.2.1343: Vim9: cannot find global function when using g: v8.2.1343
authorBram Moolenaar <Bram@vim.org>
Sat, 1 Aug 2020 16:53:07 +0000 (18:53 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 1 Aug 2020 16:53:07 +0000 (18:53 +0200)
Problem:    Vim9: cannot find global function when using g: when local
            function with the same name exists.
Solution:   Find global function when using g:.

src/testdir/test_vim9_func.vim
src/userfunc.c
src/version.c

index 7298d9a734916096edaab5de73c7e1e5bb9908e6..3acae98ea9ddb599fac9fcdaf8aa96cb95df07f2 100644 (file)
@@ -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
index 4c1e2619522d0bb4aab29e279336bd859bd4ebb4..520c114ef5df5b5d6731ebf96d60c4d3f0479bdf 100644 (file)
@@ -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
index 021487db2812a44aba8bb58b23e3d0058fe24b69..33274ac62fab5254f831a4ffd2750895ec1f1341 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1343,
 /**/
     1342,
 /**/