diff src/evalvars.c @ 24049:fc4c2beea99a v8.2.2566

patch 8.2.2566: Vim9: Function name is not recognized Commit: https://github.com/vim/vim/commit/2e2d758902dc08a0e383fe6b198e11dd14f1bdf8 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Mar 3 21:22:41 2021 +0100 patch 8.2.2566: Vim9: Function name is not recognized Problem: Vim9: Function name is not recognized. Solution: Change lookup_scriptvar() to also find function names. (closes #7770)
author Bram Moolenaar <Bram@vim.org>
date Wed, 03 Mar 2021 21:30:03 +0100
parents 9fcd71d0db89
children da8347e453b4
line wrap: on
line diff
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -2788,11 +2788,11 @@ get_script_local_ht(void)
 }
 
 /*
- * Look for "name[len]" in script-local variables.
+ * Look for "name[len]" in script-local variables and functions.
  * Return OK when found, FAIL when not found.
  */
     int
-lookup_scriptvar(
+lookup_scriptitem(
 	char_u	*name,
 	size_t	len,
 	cctx_T	*dummy UNUSED)
@@ -2802,6 +2802,8 @@ lookup_scriptvar(
     char_u	*p;
     int		res;
     hashitem_T	*hi;
+    int		is_global = FALSE;
+    char_u	*fname = name;
 
     if (ht == NULL)
 	return FAIL;
@@ -2824,9 +2826,24 @@ lookup_scriptvar(
     // if not script-local, then perhaps imported
     if (res == FAIL && find_imported(p, 0, NULL) != NULL)
 	res = OK;
-
     if (p != buffer)
 	vim_free(p);
+
+    if (res != OK)
+    {
+	// Find a function, so that a following "->" works.  Skip "g:" before a
+	// function name.
+	// Do not check for an internal function, since it might also be a
+	// valid command, such as ":split" versuse "split()".
+	if (name[0] == 'g' && name[1] == ':')
+	{
+	    is_global = TRUE;
+	    fname = name + 2;
+	}
+	if (find_func(fname, is_global, NULL) != NULL)
+	    res = OK;
+    }
+
     return res;
 }