summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErnie Rael <errael@raelity.com>2024-07-07 20:41:44 +0200
committerChristian Brabandt <cb@256bit.org>2024-07-07 20:41:44 +0200
commit9d779c514f821f550a356dc804819ed81aaf8490 (patch)
treee46166e8c922192899a1c3fc893a657d3df0ee41
parent52123879c0c64c64ca6071192a9f8eacd822efd1 (diff)
patch 9.1.0542: Vim9: confusing string() output for object functionsv9.1.0542
Problem: Vim9: confusing string() output for object functions Solution: improve the output for object functions (Ernie Rael) fixes: #15129 closes: #15143 Signed-off-by: Ernie Rael <errael@raelity.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r--src/eval.c37
-rw-r--r--src/testdir/test_vim9_class.vim14
-rw-r--r--src/version.c2
3 files changed, 52 insertions, 1 deletions
diff --git a/src/eval.c b/src/eval.c
index 66c9562953..049834650f 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -5923,6 +5923,37 @@ func_tv2string(typval_T *tv, char_u **tofree, int echo_style)
}
/*
+ * Return a textual representation of the object method in "tv", a VAR_PARTIAL.
+ * If the memory is allocated "tofree" is set to it, otherwise NULL.
+ * When "echo_style" is FALSE, put quotes around the function name as
+ * "function()", otherwise does not put quotes around function name.
+ * May return NULL.
+ */
+ static char_u *
+method_tv2string(typval_T *tv, char_u **tofree, int echo_style)
+{
+ char_u buf[MAX_FUNC_NAME_LEN];
+ partial_T *pt = tv->vval.v_partial;
+
+ size_t len = vim_snprintf((char *)buf, sizeof(buf), "<SNR>%d_%s.%s",
+ pt->pt_func->uf_script_ctx.sc_sid,
+ pt->pt_func->uf_class->class_name,
+ pt->pt_func->uf_name);
+ if (len >= sizeof(buf))
+ {
+ if (echo_style)
+ {
+ *tofree = NULL;
+ return (char_u *)"function()";
+ }
+ else
+ return *tofree = string_quote((char_u*)"", TRUE);
+ }
+
+ return *tofree = echo_style ? vim_strsave(buf) : string_quote(buf, TRUE);
+}
+
+/*
* Return a textual representation of a partial in "tv".
* If the memory is allocated "tofree" is set to it, otherwise NULL.
* "numbuf" is used for a number. May return NULL.
@@ -6241,7 +6272,11 @@ echo_string_core(
break;
case VAR_PARTIAL:
- r = partial_tv2string(tv, tofree, numbuf, copyID);
+ if (tv->vval.v_partial == NULL
+ || tv->vval.v_partial->pt_obj == NULL)
+ r = partial_tv2string(tv, tofree, numbuf, copyID);
+ else
+ r = method_tv2string(tv, tofree, echo_style);
break;
case VAR_BLOB:
diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim
index 4f75a945ad..4654598465 100644
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -10466,6 +10466,20 @@ func Test_object_string()
call v9.CheckSourceSuccess(lines)
endfunc
+" Test for using the string() builtin method with an object's method
+def Test_method_string()
+ var lines =<< trim END
+ vim9script
+ class A
+ def F()
+ enddef
+ endclass
+ assert_match('function(''<SNR>\d\+_A\.F'')', string(A.new().F))
+ END
+ v9.CheckScriptSuccess(lines)
+enddef
+
+
" Test for using a class in the class definition
def Test_Ref_Class_Within_Same_Class()
var lines =<< trim END
diff --git a/src/version.c b/src/version.c
index f9efacf3c4..dffc63c1f4 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 542,
+/**/
541,
/**/
540,