patch 9.1.1298: define_function() is too long

Problem:  define_function() is too long
Solution: refactor and split up into smaller functions
          (Yegappan Lakshmanan)

closes: #17105

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Yegappan Lakshmanan
2025-04-13 17:49:50 +02:00
committed by Christian Brabandt
parent c98250377d
commit 3956c5b53c
2 changed files with 116 additions and 83 deletions

View File

@ -4838,6 +4838,117 @@ list_functions(regmatch_T *regmatch)
}
}
/*
* ":function /pat": list functions matching pattern.
*/
static char_u *
list_functions_matching_pat(exarg_T *eap)
{
char_u *p;
char_u c;
p = skip_regexp(eap->arg + 1, '/', TRUE);
if (!eap->skip)
{
regmatch_T regmatch;
c = *p;
*p = NUL;
regmatch.regprog = vim_regcomp(eap->arg + 1, RE_MAGIC);
*p = c;
if (regmatch.regprog != NULL)
{
regmatch.rm_ic = p_ic;
list_functions(&regmatch);
vim_regfree(regmatch.regprog);
}
}
if (*p == '/')
++p;
return p;
}
/*
* List function "name".
* Returns the function pointer or NULL on failure.
*/
static ufunc_T *
list_one_function(exarg_T *eap, char_u *name, char_u *p, int is_global)
{
ufunc_T *fp = NULL;
int j;
if (!ends_excmd(*skipwhite(p)))
{
semsg(_(e_trailing_characters_str), p);
return NULL;
}
set_nextcmd(eap, p);
if (eap->nextcmd != NULL)
*p = NUL;
if (eap->skip || got_int)
return NULL;
fp = find_func(name, is_global);
if (fp == NULL && ASCII_ISUPPER(*eap->arg))
{
char_u *up = untrans_function_name(name);
// With Vim9 script the name was made script-local, if not
// found try again with the original name.
if (up != NULL)
fp = find_func(up, FALSE);
}
if (fp == NULL)
{
emsg_funcname(e_undefined_function_str, eap->arg);
return NULL;
}
// Check no function was added or removed from a timer, e.g. at
// the more prompt. "fp" may then be invalid.
int prev_ht_changed = func_hashtab.ht_changed;
if (list_func_head(fp, TRUE) != OK)
return fp;
for (j = 0; j < fp->uf_lines.ga_len && !got_int; ++j)
{
if (FUNCLINE(fp, j) == NULL)
continue;
msg_putchar('\n');
msg_outnum((long)(j + 1));
if (j < 9)
msg_putchar(' ');
if (j < 99)
msg_putchar(' ');
if (function_list_modified(prev_ht_changed))
break;
msg_prt_line(FUNCLINE(fp, j), FALSE);
out_flush(); // show a line at a time
ui_breakcheck();
}
if (!got_int)
{
msg_putchar('\n');
if (!function_list_modified(prev_ht_changed))
{
if (fp->uf_def_status != UF_NOT_COMPILED)
msg_puts(" enddef");
else
msg_puts(" endfunction");
}
}
return fp;
}
/*
* ":function" also supporting nested ":def".
* When "name_arg" is not NULL this is a nested function, using "name_arg" for
@ -4858,7 +4969,6 @@ define_function(
int obj_member_count)
{
int j;
int c;
int saved_did_emsg = FALSE;
char_u *name = name_arg;
size_t namelen = 0;
@ -4888,9 +4998,7 @@ define_function(
int vim9script = in_vim9script();
imported_T *import = NULL;
/*
* ":function" without argument: list functions.
*/
// ":function" without argument: list functions.
if (ends_excmd2(eap->cmd, eap->arg))
{
if (!eap->skip)
@ -4904,24 +5012,7 @@ define_function(
*/
if (*eap->arg == '/')
{
p = skip_regexp(eap->arg + 1, '/', TRUE);
if (!eap->skip)
{
regmatch_T regmatch;
c = *p;
*p = NUL;
regmatch.regprog = vim_regcomp(eap->arg + 1, RE_MAGIC);
*p = c;
if (regmatch.regprog != NULL)
{
regmatch.rm_ic = p_ic;
list_functions(&regmatch);
vim_regfree(regmatch.regprog);
}
}
if (*p == '/')
++p;
p = list_functions_matching_pat(eap);
set_nextcmd(eap, p);
return NULL;
}
@ -5027,67 +5118,7 @@ define_function(
*/
if (!paren)
{
if (!ends_excmd(*skipwhite(p)))
{
semsg(_(e_trailing_characters_str), p);
goto ret_free;
}
set_nextcmd(eap, p);
if (eap->nextcmd != NULL)
*p = NUL;
if (!eap->skip && !got_int)
{
fp = find_func(name, is_global);
if (fp == NULL && ASCII_ISUPPER(*eap->arg))
{
char_u *up = untrans_function_name(name);
// With Vim9 script the name was made script-local, if not
// found try again with the original name.
if (up != NULL)
fp = find_func(up, FALSE);
}
if (fp != NULL)
{
// Check no function was added or removed from a timer, e.g. at
// the more prompt. "fp" may then be invalid.
int prev_ht_changed = func_hashtab.ht_changed;
if (list_func_head(fp, TRUE) == OK)
{
for (j = 0; j < fp->uf_lines.ga_len && !got_int; ++j)
{
if (FUNCLINE(fp, j) == NULL)
continue;
msg_putchar('\n');
msg_outnum((long)(j + 1));
if (j < 9)
msg_putchar(' ');
if (j < 99)
msg_putchar(' ');
if (function_list_modified(prev_ht_changed))
break;
msg_prt_line(FUNCLINE(fp, j), FALSE);
out_flush(); // show a line at a time
ui_breakcheck();
}
if (!got_int)
{
msg_putchar('\n');
if (!function_list_modified(prev_ht_changed))
{
if (fp->uf_def_status != UF_NOT_COMPILED)
msg_puts(" enddef");
else
msg_puts(" endfunction");
}
}
}
}
else
emsg_funcname(e_undefined_function_str, eap->arg);
}
fp = list_one_function(eap, name, p, is_global);
goto ret_free;
}

View File

@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1298,
/**/
1297,
/**/