forked from aniani/vim
patch 8.2.1271: Vim9: Error for Funcref function argument type
Problem: Vim9: Error for Funcref function argument type. Solution: Find the actual function type if possible. (issue #6507)
This commit is contained in:
parent
2f1980f7b7
commit
0f60e80f9b
@ -270,6 +270,19 @@ def Test_call_funcref()
|
||||
assert_equal(123, Funcref())
|
||||
END
|
||||
CheckScriptSuccess(lines)
|
||||
|
||||
lines =<< trim END
|
||||
vim9script
|
||||
def RetNumber(): number
|
||||
return 123
|
||||
enddef
|
||||
def Bar(F: func: number): number
|
||||
return F()
|
||||
enddef
|
||||
let Funcref = function('RetNumber')
|
||||
assert_equal(123, Bar(Funcref))
|
||||
END
|
||||
CheckScriptSuccess(lines)
|
||||
enddef
|
||||
|
||||
let SomeFunc = function('len')
|
||||
|
@ -754,6 +754,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1271,
|
||||
/**/
|
||||
1270,
|
||||
/**/
|
||||
|
@ -599,6 +599,28 @@ check_argtype(type_T *expected, typval_T *actual_tv)
|
||||
member.tt_member = &t_any;
|
||||
actual.tt_member = &member;
|
||||
}
|
||||
else if (actual_tv->v_type == VAR_FUNC || actual_tv->v_type == VAR_PARTIAL)
|
||||
{
|
||||
char_u *name = NULL;
|
||||
ufunc_T *ufunc = NULL;
|
||||
|
||||
if (actual_tv->v_type == VAR_PARTIAL)
|
||||
{
|
||||
if (actual_tv->vval.v_partial->pt_func != NULL)
|
||||
ufunc = actual_tv->vval.v_partial->pt_func;
|
||||
else
|
||||
name = actual_tv->vval.v_partial->pt_name;
|
||||
}
|
||||
else
|
||||
name = actual_tv->vval.v_string;
|
||||
if (name != NULL)
|
||||
// TODO: how about a builtin function?
|
||||
ufunc = find_func(name, FALSE, NULL);
|
||||
if (ufunc != NULL && ufunc->uf_func_type != NULL)
|
||||
actual = *ufunc->uf_func_type;
|
||||
else
|
||||
actual.tt_member = &t_any;
|
||||
}
|
||||
else
|
||||
actual.tt_member = &t_any;
|
||||
return check_type(expected, &actual, TRUE);
|
||||
|
Loading…
x
Reference in New Issue
Block a user