0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.2.2209: Vim9: return type of => lambda not parsed

Problem:    Vim9: return type of => lambda not parsed.
Solution:   Parse and use the return type.
This commit is contained in:
Bram Moolenaar
2020-12-25 12:38:04 +01:00
parent 4aab88d919
commit 9e68c32563
8 changed files with 125 additions and 69 deletions

View File

@@ -596,28 +596,38 @@ skip_type(char_u *start, int optional)
* Returns NULL in case of failure.
*/
static type_T *
parse_type_member(char_u **arg, type_T *type, garray_T *type_gap)
parse_type_member(
char_u **arg,
type_T *type,
garray_T *type_gap,
int give_error)
{
type_T *member_type;
int prev_called_emsg = called_emsg;
if (**arg != '<')
{
if (*skipwhite(*arg) == '<')
semsg(_(e_no_white_space_allowed_before_str), "<");
else
emsg(_(e_missing_type));
return type;
if (give_error)
{
if (*skipwhite(*arg) == '<')
semsg(_(e_no_white_space_allowed_before_str), "<");
else
emsg(_(e_missing_type));
}
return NULL;
}
*arg = skipwhite(*arg + 1);
member_type = parse_type(arg, type_gap);
member_type = parse_type(arg, type_gap, give_error);
if (member_type == NULL)
return NULL;
*arg = skipwhite(*arg);
if (**arg != '>' && called_emsg == prev_called_emsg)
{
emsg(_(e_missing_gt_after_type));
return type;
if (give_error)
emsg(_(e_missing_gt_after_type));
return NULL;
}
++*arg;
@@ -628,10 +638,11 @@ parse_type_member(char_u **arg, type_T *type, garray_T *type_gap)
/*
* Parse a type at "arg" and advance over it.
* Return &t_any for failure.
* When "give_error" is TRUE give error messages, otherwise be quiet.
* Return NULL for failure.
*/
type_T *
parse_type(char_u **arg, garray_T *type_gap)
parse_type(char_u **arg, garray_T *type_gap, int give_error)
{
char_u *p = *arg;
size_t len;
@@ -673,7 +684,8 @@ parse_type(char_u **arg, garray_T *type_gap)
if (len == 4 && STRNCMP(*arg, "dict", len) == 0)
{
*arg += len;
return parse_type_member(arg, &t_dict_any, type_gap);
return parse_type_member(arg, &t_dict_any,
type_gap, give_error);
}
break;
case 'f':
@@ -683,8 +695,9 @@ parse_type(char_u **arg, garray_T *type_gap)
*arg += len;
return &t_float;
#else
emsg(_(e_this_vim_is_not_compiled_with_float_support));
return &t_any;
if (give_error)
emsg(_(e_this_vim_is_not_compiled_with_float_support));
return NULL;
#endif
}
if (len == 4 && STRNCMP(*arg, "func", len) == 0)
@@ -721,11 +734,15 @@ parse_type(char_u **arg, garray_T *type_gap)
}
else if (first_optional != -1)
{
emsg(_(e_mandatory_argument_after_optional_argument));
return &t_any;
if (give_error)
emsg(_(e_mandatory_argument_after_optional_argument));
return NULL;
}
arg_type[argcount++] = parse_type(&p, type_gap);
type = parse_type(&p, type_gap, give_error);
if (type == NULL)
return NULL;
arg_type[argcount++] = type;
// Nothing comes after "...{type}".
if (flags & TTFLAG_VARARGS)
@@ -733,31 +750,35 @@ parse_type(char_u **arg, garray_T *type_gap)
if (*p != ',' && *skipwhite(p) == ',')
{
semsg(_(e_no_white_space_allowed_before_str), ",");
return &t_any;
if (give_error)
semsg(_(e_no_white_space_allowed_before_str), ",");
return NULL;
}
if (*p == ',')
{
++p;
if (!VIM_ISWHITE(*p))
{
semsg(_(e_white_space_required_after_str), ",");
return &t_any;
if (give_error)
semsg(_(e_white_space_required_after_str), ",");
return NULL;
}
}
p = skipwhite(p);
if (argcount == MAX_FUNC_ARGS)
{
emsg(_(e_too_many_argument_types));
return &t_any;
if (give_error)
emsg(_(e_too_many_argument_types));
return NULL;
}
}
p = skipwhite(p);
if (*p != ')')
{
emsg(_(e_missing_close));
return &t_any;
if (give_error)
emsg(_(e_missing_close));
return NULL;
}
*arg = p + 1;
}
@@ -765,10 +786,12 @@ parse_type(char_u **arg, garray_T *type_gap)
{
// parse return type
++*arg;
if (!VIM_ISWHITE(**arg))
if (!VIM_ISWHITE(**arg) && give_error)
semsg(_(e_white_space_required_after_str), ":");
*arg = skipwhite(*arg);
ret_type = parse_type(arg, type_gap);
ret_type = parse_type(arg, type_gap, give_error);
if (ret_type == NULL)
return NULL;
}
if (flags == 0 && first_optional == -1 && argcount <= 0)
type = get_func_type(ret_type, argcount, type_gap);
@@ -783,7 +806,7 @@ parse_type(char_u **arg, garray_T *type_gap)
? argcount : first_optional;
if (func_type_add_arg_types(type, argcount,
type_gap) == FAIL)
return &t_any;
return NULL;
mch_memmove(type->tt_args, arg_type,
sizeof(type_T *) * argcount);
}
@@ -802,7 +825,8 @@ parse_type(char_u **arg, garray_T *type_gap)
if (len == 4 && STRNCMP(*arg, "list", len) == 0)
{
*arg += len;
return parse_type_member(arg, &t_list_any, type_gap);
return parse_type_member(arg, &t_list_any,
type_gap, give_error);
}
break;
case 'n':
@@ -828,8 +852,9 @@ parse_type(char_u **arg, garray_T *type_gap)
break;
}
semsg(_(e_type_not_recognized_str), *arg);
return &t_any;
if (give_error)
semsg(_(e_type_not_recognized_str), *arg);
return NULL;
}
/*
@@ -1016,9 +1041,12 @@ vartype_name(vartype_T type)
char *
type_name(type_T *type, char **tofree)
{
char *name = vartype_name(type->tt_type);
char *name;
*tofree = NULL;
if (type == NULL)
return "[unknown]";
name = vartype_name(type->tt_type);
if (type->tt_type == VAR_LIST || type->tt_type == VAR_DICT)
{
char *member_free;