]> granicus.if.org Git - vim/commitdiff
patch 7.4.1608 v7.4.1608
authorBram Moolenaar <Bram@vim.org>
Sat, 19 Mar 2016 19:05:45 +0000 (20:05 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 19 Mar 2016 19:05:45 +0000 (20:05 +0100)
Problem:    string() doesn't handle a partial.
Solution:   Make a string from a partial.

src/eval.c
src/testdir/test_partial.vim
src/version.c

index 5f20c238fea6f4ca7bbc0d3b4c8d32c7345b7b0c..a5c015d6a9dd76789f3505f6dd8f34b5dae41c92 100644 (file)
@@ -7897,9 +7897,49 @@ tv2string(
            *tofree = string_quote(tv->vval.v_string, TRUE);
            return *tofree;
        case VAR_PARTIAL:
-           *tofree = string_quote(tv->vval.v_partial == NULL ? NULL
-                                        : tv->vval.v_partial->pt_name, TRUE);
-           return *tofree;
+           {
+               partial_T   *pt = tv->vval.v_partial;
+               char_u      *fname = string_quote(pt == NULL ? NULL
+                                                       : pt->pt_name, FALSE);
+               garray_T    ga;
+               int         i;
+               char_u      *tf;
+
+               ga_init2(&ga, 1, 100);
+               ga_concat(&ga, (char_u *)"function(");
+               if (fname != NULL)
+               {
+                   ga_concat(&ga, fname);
+                   vim_free(fname);
+               }
+               if (pt != NULL && pt->pt_argc > 0)
+               {
+                   ga_concat(&ga, (char_u *)", [");
+                   for (i = 0; i < pt->pt_argc; ++i)
+                   {
+                       if (i > 0)
+                           ga_concat(&ga, (char_u *)", ");
+                       ga_concat(&ga,
+                            tv2string(&pt->pt_argv[i], &tf, numbuf, copyID));
+                       vim_free(tf);
+                   }
+                   ga_concat(&ga, (char_u *)"]");
+               }
+               if (pt != NULL && pt->pt_dict != NULL)
+               {
+                   typval_T dtv;
+
+                   ga_concat(&ga, (char_u *)", ");
+                   dtv.v_type = VAR_DICT;
+                   dtv.vval.v_dict = pt->pt_dict;
+                   ga_concat(&ga, tv2string(&dtv, &tf, numbuf, copyID));
+                   vim_free(tf);
+               }
+               ga_concat(&ga, (char_u *)")");
+
+               *tofree = ga.ga_data;
+               return *tofree;
+           }
        case VAR_STRING:
            *tofree = string_quote(tv->vval.v_string, FALSE);
            return *tofree;
index fa07866a17c709aefc3467fa5133227b81376a05..3764f221fcd9b50283929307832531422bd30fbd 100644 (file)
@@ -156,3 +156,17 @@ func Test_partial_exists()
   let lF = [F]
   call assert_true(exists('*lF[0]'))
 endfunc
+
+func Test_partial_string()
+  let F = function('MyFunc')
+  call assert_equal("function('MyFunc')", string(F))
+  let F = function('MyFunc', ['foo'])
+  call assert_equal("function('MyFunc', ['foo'])", string(F))
+  let F = function('MyFunc', ['foo', 'bar'])
+  call assert_equal("function('MyFunc', ['foo', 'bar'])", string(F))
+  let d = {'one': 1}
+  let F = function('MyFunc', d)
+  call assert_equal("function('MyFunc', {'one': 1})", string(F))
+  let F = function('MyFunc', ['foo'], d)
+  call assert_equal("function('MyFunc', ['foo'], {'one': 1})", string(F))
+endfunc
index 16bb976cff0cfcf78cbb4ef2493c4a67445ca7f9..965af65dad9f73741d3017f35d4d521642471ef5 100644 (file)
@@ -748,6 +748,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1608,
 /**/
     1607,
 /**/