patch 8.2.4416: Vim9: using a script-local function requires using "s:"
Problem: Vim9: using a script-local function requires using "s:" when
setting 'completefunc'.
Solution: Do not require "s:" in Vim9 script. (closes #9796)
diff --git a/src/userfunc.c b/src/userfunc.c
index 10a529e..696320c 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -4024,16 +4024,29 @@
get_scriptlocal_funcname(char_u *funcname)
{
char sid_buf[25];
- int off;
+ int off = *funcname == 's' ? 2 : 5;
char_u *newname;
+ char_u *p = funcname;
if (funcname == NULL)
return NULL;
if (STRNCMP(funcname, "s:", 2) != 0
&& STRNCMP(funcname, "<SID>", 5) != 0)
- // The function name is not a script-local function name
- return NULL;
+ {
+ ufunc_T *ufunc;
+
+ // The function name does not have a script-local prefix. Try finding
+ // it when in a Vim9 script and there is no "g:" prefix.
+ if (!in_vim9script() || STRNCMP(funcname, "g:", 2) == 0)
+ return NULL;
+ ufunc = find_func(funcname, FALSE);
+ if (ufunc == NULL || func_is_global(ufunc)
+ || (p = vim_strchr(ufunc->uf_name, '_')) == NULL)
+ return NULL;
+ ++p;
+ off = 0;
+ }
if (!SCRIPT_ID_VALID(current_sctx.sc_sid))
{
@@ -4043,12 +4056,11 @@
// Expand s: prefix into <SNR>nr_<name>
vim_snprintf(sid_buf, sizeof(sid_buf), "<SNR>%ld_",
(long)current_sctx.sc_sid);
- off = *funcname == 's' ? 2 : 5;
- newname = alloc(STRLEN(sid_buf) + STRLEN(funcname + off) + 1);
+ newname = alloc(STRLEN(sid_buf) + STRLEN(p + off) + 1);
if (newname == NULL)
return NULL;
STRCPY(newname, sid_buf);
- STRCAT(newname, funcname + off);
+ STRCAT(newname, p + off);
return newname;
}