mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.2339: cannot get the type of a value as a string
Problem: Cannot get the type of a value as a string. Solution: Add typename().
This commit is contained in:
@@ -3016,7 +3016,8 @@ tr({src}, {fromstr}, {tostr}) String translate chars of {src} in {fromstr}
|
|||||||
trim({text} [, {mask} [, {dir}]])
|
trim({text} [, {mask} [, {dir}]])
|
||||||
String trim characters in {mask} from {text}
|
String trim characters in {mask} from {text}
|
||||||
trunc({expr}) Float truncate Float {expr}
|
trunc({expr}) Float truncate Float {expr}
|
||||||
type({name}) Number type of variable {name}
|
type({expr}) Number type of value {expr}
|
||||||
|
typename({expr}) String representation of the type of {expr}
|
||||||
undofile({name}) String undo file name for {name}
|
undofile({name}) String undo file name for {name}
|
||||||
undotree() List undo file tree
|
undotree() List undo file tree
|
||||||
uniq({list} [, {func} [, {dict}]])
|
uniq({list} [, {func} [, {dict}]])
|
||||||
@@ -11129,6 +11130,14 @@ type({expr}) The result is a Number representing the type of {expr}.
|
|||||||
< Can also be used as a |method|: >
|
< Can also be used as a |method|: >
|
||||||
mylist->type()
|
mylist->type()
|
||||||
|
|
||||||
|
|
||||||
|
typename({expr}) *typename()*
|
||||||
|
Return a string representation of the type of {expr}.
|
||||||
|
Example: >
|
||||||
|
echo typename([1, 2, 3])
|
||||||
|
list<number>
|
||||||
|
|
||||||
|
|
||||||
undofile({name}) *undofile()*
|
undofile({name}) *undofile()*
|
||||||
Return the name of the undo file that would be used for a file
|
Return the name of the undo file that would be used for a file
|
||||||
with name {name} when writing. This uses the 'undodir'
|
with name {name} when writing. This uses the 'undodir'
|
||||||
|
@@ -720,7 +720,8 @@ Other computation: *bitwise-function*
|
|||||||
srand() initialize seed used by rand()
|
srand() initialize seed used by rand()
|
||||||
|
|
||||||
Variables: *var-functions*
|
Variables: *var-functions*
|
||||||
type() type of a variable
|
type() type of a variable as a number
|
||||||
|
typename() type of a variable as text
|
||||||
islocked() check if a variable is locked
|
islocked() check if a variable is locked
|
||||||
funcref() get a Funcref for a function reference
|
funcref() get a Funcref for a function reference
|
||||||
function() get a Funcref for a function name
|
function() get a Funcref for a function name
|
||||||
|
@@ -1742,6 +1742,8 @@ static funcentry_T global_functions[] =
|
|||||||
ret_float, FLOAT_FUNC(f_trunc)},
|
ret_float, FLOAT_FUNC(f_trunc)},
|
||||||
{"type", 1, 1, FEARG_1, NULL,
|
{"type", 1, 1, FEARG_1, NULL,
|
||||||
ret_number, f_type},
|
ret_number, f_type},
|
||||||
|
{"typename", 1, 1, FEARG_1, NULL,
|
||||||
|
ret_string, f_typename},
|
||||||
{"undofile", 1, 1, FEARG_1, NULL,
|
{"undofile", 1, 1, FEARG_1, NULL,
|
||||||
ret_string, f_undofile},
|
ret_string, f_undofile},
|
||||||
{"undotree", 0, 0, 0, NULL,
|
{"undotree", 0, 0, 0, NULL,
|
||||||
|
@@ -24,4 +24,5 @@ void common_type(type_T *type1, type_T *type2, type_T **dest, garray_T *type_gap
|
|||||||
type_T *get_member_type_from_stack(type_T **stack_top, int count, int skip, garray_T *type_gap);
|
type_T *get_member_type_from_stack(type_T **stack_top, int count, int skip, garray_T *type_gap);
|
||||||
char *vartype_name(vartype_T type);
|
char *vartype_name(vartype_T type);
|
||||||
char *type_name(type_T *type, char **tofree);
|
char *type_name(type_T *type, char **tofree);
|
||||||
|
void f_typename(typval_T *argvars, typval_T *rettv);
|
||||||
/* vim: set ft=c : */
|
/* vim: set ft=c : */
|
||||||
|
@@ -318,8 +318,8 @@ def Test_job_info_return_type()
|
|||||||
if has('job')
|
if has('job')
|
||||||
job_start(&shell)
|
job_start(&shell)
|
||||||
var jobs = job_info()
|
var jobs = job_info()
|
||||||
assert_equal(v:t_list, type(jobs))
|
assert_equal('list<job>', typename(jobs))
|
||||||
assert_equal(v:t_dict, type(job_info(jobs[0])))
|
assert_equal('dict<any>', typename(job_info(jobs[0])))
|
||||||
job_stop(jobs[0])
|
job_stop(jobs[0])
|
||||||
endif
|
endif
|
||||||
enddef
|
enddef
|
||||||
|
@@ -6600,6 +6600,14 @@ func Test_type()
|
|||||||
call ChangeYourMind()
|
call ChangeYourMind()
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_typename()
|
||||||
|
call assert_equal('number', typename(123))
|
||||||
|
call assert_equal('string', typename('x'))
|
||||||
|
call assert_equal('list<number>', typename([123]))
|
||||||
|
call assert_equal('dict<number>', typename(#{key: 123}))
|
||||||
|
call assert_equal('list<dict<number>>', typename([#{key: 123}]))
|
||||||
|
endfunc
|
||||||
|
|
||||||
"-------------------------------------------------------------------------------
|
"-------------------------------------------------------------------------------
|
||||||
" Test 92: skipping code {{{1
|
" Test 92: skipping code {{{1
|
||||||
"-------------------------------------------------------------------------------
|
"-------------------------------------------------------------------------------
|
||||||
|
@@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
2339,
|
||||||
/**/
|
/**/
|
||||||
2338,
|
2338,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -1170,4 +1170,29 @@ type_name(type_T *type, char **tofree)
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "typename(expr)" function
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
f_typename(typval_T *argvars, typval_T *rettv)
|
||||||
|
{
|
||||||
|
garray_T type_list;
|
||||||
|
type_T *type;
|
||||||
|
char *tofree;
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
rettv->v_type = VAR_STRING;
|
||||||
|
ga_init2(&type_list, sizeof(type_T *), 10);
|
||||||
|
type = typval2type(argvars, &type_list);
|
||||||
|
name = type_name(type, &tofree);
|
||||||
|
if (tofree != NULL)
|
||||||
|
rettv->vval.v_string = (char_u *)tofree;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rettv->vval.v_string = vim_strsave((char_u *)name);
|
||||||
|
vim_free(tofree);
|
||||||
|
}
|
||||||
|
clear_type_list(&type_list);
|
||||||
|
}
|
||||||
|
|
||||||
#endif // FEAT_EVAL
|
#endif // FEAT_EVAL
|
||||||
|
Reference in New Issue
Block a user