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
--- 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,