diff src/vim9compile.c @ 24124:f4061617c438 v8.2.2603

patch 8.2.2603: Vim9: no effect if user command is also a function Commit: https://github.com/vim/vim/commit/77b10ffad4ebad15022614be4db2745f6a90f405 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Mar 14 13:21:35 2021 +0100 patch 8.2.2603: Vim9: no effect if user command is also a function Problem: Vim9: no effect if user command is also a function. Solution: Check for paren following. (closes https://github.com/vim/vim/issues/7960)
author Bram Moolenaar <Bram@vim.org>
date Sun, 14 Mar 2021 13:30:03 +0100
parents a028cb6898a2
children c308076e225e
line wrap: on
line diff
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -391,19 +391,29 @@ variable_exists(char_u *name, size_t len
  * imported or function.
  */
     static int
-item_exists(char_u *name, size_t len, cctx_T *cctx)
+item_exists(char_u *name, size_t len, int cmd UNUSED, cctx_T *cctx)
 {
     int	    is_global;
+    char_u  *p;
 
     if (variable_exists(name, len, cctx))
 	return TRUE;
 
-    // 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()".
-    is_global = (name[0] == 'g' && name[1] == ':');
-    return find_func(is_global ? name + 2 : name, is_global, cctx) != NULL;
+    // This is similar to what is in lookup_scriptitem():
+    // Find a function, so that a following "->" works.
+    // Require "(" or "->" to follow, "Cmd" is a user command while "Cmd()" is
+    // a function call.
+    p = skipwhite(name + len);
+
+    if (name[len] == '(' || (p[0] == '-' && p[1] == '>'))
+    {
+	// Do not check for an internal function, since it might also be a
+	// valid command, such as ":split" versuse "split()".
+	// Skip "g:" before a function name.
+	is_global = (name[0] == 'g' && name[1] == ':');
+	return find_func(is_global ? name + 2 : name, is_global, cctx) != NULL;
+    }
+    return FALSE;
 }
 
 /*
@@ -8429,8 +8439,8 @@ compile_def_function(
 		}
 	    }
 	}
-	p = find_ex_command(&ea, NULL, starts_with_colon ? NULL
-		    : (int (*)(char_u *, size_t, cctx_T *))item_exists, &cctx);
+	p = find_ex_command(&ea, NULL, starts_with_colon
+						  ? NULL : item_exists, &cctx);
 
 	if (p == NULL)
 	{