changeset 23594:d3e064f54890 v8.2.2339

patch 8.2.2339: cannot get the type of a value as a string Commit: https://github.com/vim/vim/commit/a47e05f04a5a5c0369c949157c24d09cbe64ad6a Author: Bram Moolenaar <Bram@vim.org> Date: Tue Jan 12 21:49:00 2021 +0100 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().
author Bram Moolenaar <Bram@vim.org>
date Tue, 12 Jan 2021 22:00:06 +0100
parents 934ad0b3ba7b
children d9942c46a490
files runtime/doc/eval.txt runtime/doc/usr_41.txt src/evalfunc.c src/proto/vim9type.pro src/testdir/test_vim9_builtin.vim src/testdir/test_vimscript.vim src/version.c src/vim9type.c
diffstat 8 files changed, 52 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -3016,7 +3016,8 @@ tr({src}, {fromstr}, {tostr})	String	tra
 trim({text} [, {mask} [, {dir}]])
 				String	trim characters in {mask} from {text}
 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}
 undotree()			List	undo file tree
 uniq({list} [, {func} [, {dict}]])
@@ -11129,6 +11130,14 @@ type({expr})	The result is a Number repr
 <		Can also be used as a |method|: >
 			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()*
 		Return the name of the undo file that would be used for a file
 		with name {name} when writing.  This uses the 'undodir'
--- a/runtime/doc/usr_41.txt
+++ b/runtime/doc/usr_41.txt
@@ -720,7 +720,8 @@ Other computation:					*bitwise-function
 	srand()			initialize seed used by rand()
 
 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
 	funcref()		get a Funcref for a function reference
 	function()		get a Funcref for a function name
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -1742,6 +1742,8 @@ static funcentry_T global_functions[] =
 			ret_float,	    FLOAT_FUNC(f_trunc)},
     {"type",		1, 1, FEARG_1,	    NULL,
 			ret_number,	    f_type},
+    {"typename",	1, 1, FEARG_1,	    NULL,
+			ret_string,	    f_typename},
     {"undofile",	1, 1, FEARG_1,	    NULL,
 			ret_string,	    f_undofile},
     {"undotree",	0, 0, 0,	    NULL,
--- a/src/proto/vim9type.pro
+++ b/src/proto/vim9type.pro
@@ -24,4 +24,5 @@ void common_type(type_T *type1, type_T *
 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 *type_name(type_T *type, char **tofree);
+void f_typename(typval_T *argvars, typval_T *rettv);
 /* vim: set ft=c : */
--- a/src/testdir/test_vim9_builtin.vim
+++ b/src/testdir/test_vim9_builtin.vim
@@ -318,8 +318,8 @@ def Test_job_info_return_type()
   if has('job')
     job_start(&shell)
     var jobs = job_info()
-    assert_equal(v:t_list, type(jobs))
-    assert_equal(v:t_dict, type(job_info(jobs[0])))
+    assert_equal('list<job>', typename(jobs))
+    assert_equal('dict<any>', typename(job_info(jobs[0])))
     job_stop(jobs[0])
   endif
 enddef
--- a/src/testdir/test_vimscript.vim
+++ b/src/testdir/test_vimscript.vim
@@ -6600,6 +6600,14 @@ func Test_type()
     call ChangeYourMind()
 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
 "-------------------------------------------------------------------------------
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2339,
+/**/
     2338,
 /**/
     2337,
--- a/src/vim9type.c
+++ b/src/vim9type.c
@@ -1170,4 +1170,29 @@ type_name(type_T *type, char **tofree)
     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