patch 9.1.0831: 'findexpr' can't be used as lambad or Funcref
Problem: 'findexpr' can't be used for lambads
(Justin Keyes)
Solution: Replace the findexpr option with the findfunc option
(Yegappan Lakshmanan)
related: #15905
closes: #15976
Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/option.c b/src/option.c
index f408fb9..dcb5752 100644
--- a/src/option.c
+++ b/src/option.c
@@ -1014,6 +1014,9 @@
}
free_operatorfunc_option();
free_tagfunc_option();
+# if defined(FEAT_EVAL)
+ free_findfunc_option();
+# endif
}
#endif
@@ -6372,8 +6375,8 @@
clear_string_option(&buf->b_p_fp);
break;
# ifdef FEAT_EVAL
- case PV_FEXPR:
- clear_string_option(&buf->b_p_fexpr);
+ case PV_FFU:
+ clear_string_option(&buf->b_p_ffu);
break;
# endif
# ifdef FEAT_QUICKFIX
@@ -6455,7 +6458,7 @@
{
case PV_FP: return (char_u *)&(curbuf->b_p_fp);
#ifdef FEAT_EVAL
- case PV_FEXPR: return (char_u *)&(curbuf->b_p_fexpr);
+ case PV_FFU: return (char_u *)&(curbuf->b_p_ffu);
#endif
#ifdef FEAT_QUICKFIX
case PV_EFM: return (char_u *)&(curbuf->b_p_efm);
@@ -6568,8 +6571,8 @@
case PV_FP: return *curbuf->b_p_fp != NUL
? (char_u *)&(curbuf->b_p_fp) : p->var;
#ifdef FEAT_EVAL
- case PV_FEXPR: return *curbuf->b_p_fexpr != NUL
- ? (char_u *)&curbuf->b_p_fexpr : p->var;
+ case PV_FFU: return *curbuf->b_p_ffu != NUL
+ ? (char_u *)&(curbuf->b_p_ffu) : p->var;
#endif
#ifdef FEAT_QUICKFIX
case PV_EFM: return *curbuf->b_p_efm != NUL
@@ -6818,15 +6821,15 @@
}
/*
- * Get the value of 'findexpr', either the buffer-local one or the global one.
+ * Get the value of 'findfunc', either the buffer-local one or the global one.
*/
char_u *
-get_findexpr(void)
+get_findfunc(void)
{
#ifdef FEAT_EVAL
- if (*curbuf->b_p_fexpr == NUL)
- return p_fexpr;
- return curbuf->b_p_fexpr;
+ if (*curbuf->b_p_ffu == NUL)
+ return p_ffu;
+ return curbuf->b_p_ffu;
#else
return (char_u *)"";
#endif
@@ -7361,8 +7364,7 @@
#endif
buf->b_p_ep = empty_option;
#if defined(FEAT_EVAL)
- buf->b_p_fexpr = vim_strsave(p_fexpr);
- COPY_OPT_SCTX(buf, BV_FEXPR);
+ buf->b_p_ffu = empty_option;
#endif
buf->b_p_kp = empty_option;
buf->b_p_path = empty_option;
@@ -8749,6 +8751,7 @@
#ifdef FEAT_EVAL
typval_T *tv;
callback_T cb;
+ int funcname = FALSE;
if (optval == NULL || *optval == NUL)
{
@@ -8762,8 +8765,11 @@
// Lambda expression or a funcref
tv = eval_expr(optval, NULL);
else
+ {
// treat everything else as a function name string
tv = alloc_string_tv(vim_strsave(optval));
+ funcname = TRUE;
+ }
if (tv == NULL)
return FAIL;
@@ -8780,6 +8786,16 @@
vim_free(cb.cb_name);
free_tv(tv);
+ if (in_vim9script() && funcname && (vim_strchr(optval, '.') != NULL))
+ {
+ // When a Vim9 imported function name is used, it is expanded by the
+ // call to get_callback() above to <SNR>_funcname. Revert the name to
+ // back to "import.funcname".
+ if (optcb->cb_free_name)
+ vim_free(optcb->cb_name);
+ optcb->cb_name = vim_strsave(optval);
+ optcb->cb_free_name = TRUE;
+ }
// when using Vim9 style "import.funcname" it needs to be expanded to
// "import#funcname".
expand_autload_callback(optcb);