1
0
forked from aniani/vim

patch 8.2.4657: errors for functions are sometimes hard to read

Problem:    Errors for functions are sometimes hard to read.
Solution:   Use printable_func_name() in more places.
This commit is contained in:
Bram Moolenaar
2022-03-31 20:02:56 +01:00
parent ccbfd4883f
commit a6c18d38ca
9 changed files with 68 additions and 36 deletions

View File

@@ -5296,15 +5296,29 @@ echo_string_core(
break;
case VAR_FUNC:
if (echo_style)
{
*tofree = NULL;
r = tv->vval.v_string;
}
else
{
*tofree = string_quote(tv->vval.v_string, TRUE);
r = *tofree;
char_u buf[MAX_FUNC_NAME_LEN];
if (echo_style)
{
r = make_ufunc_name_readable(tv->vval.v_string,
buf, MAX_FUNC_NAME_LEN);
if (r == buf)
{
r = vim_strsave(buf);
*tofree = r;
}
else
*tofree = NULL;
}
else
{
*tofree = string_quote(tv->vval.v_string == NULL ? NULL
: make_ufunc_name_readable(
tv->vval.v_string, buf, MAX_FUNC_NAME_LEN),
TRUE);
r = *tofree;
}
}
break;

View File

@@ -1,6 +1,7 @@
/* userfunc.c */
void func_init(void);
hashtab_T *func_tbl_get(void);
char_u *make_ufunc_name_readable(char_u *name, char_u *buf, size_t bufsize);
char_u *get_lambda_name(void);
char_u *register_cfunc(cfunc_T cb, cfunc_free_T cb_free, void *state);
int get_lambda_tv(char_u **arg, typval_T *rettv, int types_optional, evalarg_T *evalarg);

View File

@@ -4010,7 +4010,7 @@ func Test_expr_fails()
call v9.CheckDefFailure(["echo len('asdf'"], 'E110:', 2)
call v9.CheckScriptFailure(['vim9script', "echo len('asdf'"], 'E116:', 2)
call v9.CheckDefAndScriptFailure(["echo Func0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], ['E1011:', 'E117:'], 1)
call v9.CheckDefAndScriptFailure(["echo Func01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], ['E1011:', 'E117:'], 1)
call v9.CheckDefAndScriptFailure(["echo doesnotexist()"], 'E117:', 1)
endfunc

View File

@@ -526,6 +526,28 @@ set_ufunc_name(ufunc_T *fp, char_u *name)
}
}
/*
* If "name" starts with K_SPECIAL and "buf[bufsize]" is big enough
* return "buf" filled with a readable function name.
* Otherwise just return "name", thus the return value can always be used.
* "name" and "buf" may be equal.
*/
char_u *
make_ufunc_name_readable(char_u *name, char_u *buf, size_t bufsize)
{
size_t len;
if (name[0] != K_SPECIAL)
return name;
len = STRLEN(name);
if (len + 3 > bufsize)
return name;
mch_memmove(buf + 5, name + 3, len + 1);
mch_memmove(buf, "<SNR>", 5);
return buf;
}
/*
* Get a name for a lambda. Returned in static memory.
*/
@@ -3354,13 +3376,12 @@ user_func_error(int error, char_u *name, funcexe_T *funcexe)
{
case FCERR_UNKNOWN:
if (funcexe->fe_found_var)
semsg(_(e_not_callable_type_str), name);
emsg_funcname(e_not_callable_type_str, name);
else
emsg_funcname(e_unknown_function_str, name);
break;
case FCERR_NOTMETHOD:
emsg_funcname(
N_(e_cannot_use_function_as_method_str), name);
emsg_funcname(e_cannot_use_function_as_method_str, name);
break;
case FCERR_DELETED:
emsg_funcname(e_function_was_deleted_str, name);
@@ -3372,8 +3393,7 @@ user_func_error(int error, char_u *name, funcexe_T *funcexe)
emsg_funcname(e_not_enough_arguments_for_function_str, name);
break;
case FCERR_SCRIPT:
emsg_funcname(
e_using_sid_not_in_script_context_str, name);
emsg_funcname(e_using_sid_not_in_script_context_str, name);
break;
case FCERR_DICT:
emsg_funcname(e_calling_dict_function_without_dictionary_str,
@@ -3613,9 +3633,7 @@ theend:
* cancelled due to an aborting error, an interrupt, or an exception.
*/
if (!aborting())
{
user_func_error(error, (name != NULL) ? name : funcname, funcexe);
}
// clear the copies made from the partial
while (argv_clear > 0)

View File

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

View File

@@ -1012,10 +1012,11 @@ call_ufunc(
if (error != FCERR_UNKNOWN)
{
if (error == FCERR_TOOMANY)
semsg(_(e_too_many_arguments_for_function_str), ufunc->uf_name);
semsg(_(e_too_many_arguments_for_function_str),
printable_func_name(ufunc));
else
semsg(_(e_not_enough_arguments_for_function_str),
ufunc->uf_name);
printable_func_name(ufunc));
return FAIL;
}
@@ -1047,7 +1048,7 @@ call_ufunc(
if (error != FCERR_NONE)
{
user_func_error(error, ufunc->uf_name, &funcexe);
user_func_error(error, printable_func_name(ufunc), &funcexe);
return FAIL;
}
if (did_emsg > did_emsg_before)
@@ -1211,7 +1212,7 @@ call_partial(
if (res == FAIL)
{
if (called_emsg == called_emsg_before)
semsg(_(e_unknown_function_str),
emsg_funcname(e_unknown_function_str,
name == NULL ? (char_u *)"[unknown]" : name);
return FAIL;
}
@@ -1570,14 +1571,10 @@ call_eval_func(
dictitem_T *v;
v = find_var(name, NULL, FALSE);
if (v == NULL)
if (v == NULL || (v->di_tv.v_type != VAR_PARTIAL
&& v->di_tv.v_type != VAR_FUNC))
{
semsg(_(e_unknown_function_str), name);
return FAIL;
}
if (v->di_tv.v_type != VAR_PARTIAL && v->di_tv.v_type != VAR_FUNC)
{
semsg(_(e_unknown_function_str), name);
emsg_funcname(e_unknown_function_str, name);
return FAIL;
}
return call_partial(&v->di_tv, argcount, ectx);

View File

@@ -698,7 +698,7 @@ compile_call(
char_u *name = *arg;
char_u *p;
int argcount = argcount_init;
char_u namebuf[100];
char_u namebuf[MAX_FUNC_NAME_LEN];
char_u fname_buf[FLEN_FIXED + 1];
char_u *tofree = NULL;
int error = FCERR_NONE;
@@ -818,7 +818,7 @@ compile_call(
res = generate_BCALL(cctx, idx, argcount, argcount_init == 1);
}
else
semsg(_(e_unknown_function_str), namebuf);
emsg_funcname(e_unknown_function_str, namebuf);
goto theend;
}
@@ -843,7 +843,7 @@ compile_call(
&& vim_strchr(ufunc->uf_name, AUTOLOAD_CHAR) == NULL)
{
// A function name without g: prefix must be found locally.
semsg(_(e_unknown_function_str), namebuf);
emsg_funcname(e_unknown_function_str, namebuf);
goto theend;
}
}
@@ -874,7 +874,7 @@ compile_call(
if (has_g_namespace || is_autoload)
res = generate_UCALL(cctx, name, argcount);
else
semsg(_(e_unknown_function_str), namebuf);
emsg_funcname(e_unknown_function_str, namebuf);
theend:
vim_free(tofree);

View File

@@ -1517,7 +1517,7 @@ generate_CALL(cctx_T *cctx, ufunc_T *ufunc, int pushed_argcount)
}
if (ufunc->uf_def_status == UF_COMPILE_ERROR)
{
emsg_funcname(_(e_call_to_function_that_failed_to_compile_str),
emsg_funcname(e_call_to_function_that_failed_to_compile_str,
ufunc->uf_name);
return FAIL;
}
@@ -1594,12 +1594,12 @@ generate_PCALL(
if (argcount < type->tt_min_argcount - varargs)
{
semsg(_(e_not_enough_arguments_for_function_str), name);
emsg_funcname(e_not_enough_arguments_for_function_str, name);
return FAIL;
}
if (!varargs && argcount > type->tt_argcount)
{
semsg(_(e_too_many_arguments_for_function_str), name);
emsg_funcname(e_too_many_arguments_for_function_str, name);
return FAIL;
}
if (type->tt_args != NULL)

View File

@@ -780,12 +780,12 @@ check_argument_types(
return OK; // just in case
if (totcount < type->tt_min_argcount - varargs)
{
semsg(_(e_not_enough_arguments_for_function_str), name);
emsg_funcname(e_not_enough_arguments_for_function_str, name);
return FAIL;
}
if (!varargs && type->tt_argcount >= 0 && totcount > type->tt_argcount)
{
semsg(_(e_too_many_arguments_for_function_str), name);
emsg_funcname(e_too_many_arguments_for_function_str, name);
return FAIL;
}
if (type->tt_args == NULL)