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())
|
assert_equal(123, Funcref())
|
||||||
END
|
END
|
||||||
CheckScriptSuccess(lines)
|
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
|
enddef
|
||||||
|
|
||||||
let SomeFunc = function('len')
|
let SomeFunc = function('len')
|
||||||
|
@ -754,6 +754,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1271,
|
||||||
/**/
|
/**/
|
||||||
1270,
|
1270,
|
||||||
/**/
|
/**/
|
||||||
|
@ -599,6 +599,28 @@ check_argtype(type_T *expected, typval_T *actual_tv)
|
|||||||
member.tt_member = &t_any;
|
member.tt_member = &t_any;
|
||||||
actual.tt_member = &member;
|
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
|
else
|
||||||
actual.tt_member = &t_any;
|
actual.tt_member = &t_any;
|
||||||
return check_type(expected, &actual, TRUE);
|
return check_type(expected, &actual, TRUE);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user