]> granicus.if.org Git - vim/commitdiff
patch 9.0.1058: string value of class and object do not have information v9.0.1058
authorBram Moolenaar <Bram@vim.org>
Wed, 14 Dec 2022 17:30:37 +0000 (17:30 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 14 Dec 2022 17:30:37 +0000 (17:30 +0000)
Problem:    String value of class and object do not have useful information.
Solution:   Add the class name and for the object the member values.

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

index b19cd9483560a315d03d7baa8fc287a6425f8a27..c0e9f76ade22c6605ce19f635ca13a97da97c682 100644 (file)
@@ -5604,7 +5604,8 @@ set_ref_in_item(
        }
 
        case VAR_CLASS:
-           // TODO: mark methods in class_obj_methods ?
+           // TODO: Mark methods in class_obj_methods ?
+           // Mark initializer expressions?
            break;
 
        case VAR_OBJECT:
@@ -5863,13 +5864,42 @@ echo_string_core(
            break;
 
        case VAR_CLASS:
-           *tofree = NULL;
-           r = (char_u *)"class";
+           {
+               class_T *cl = tv->vval.v_class;
+               size_t len = 6 + (cl == NULL ? 9 : STRLEN(cl->class_name)) + 1;
+               r = *tofree = alloc(len);
+               vim_snprintf((char *)r, len, "class %s",
+                           cl == NULL ? "[unknown]" : (char *)cl->class_name);
+           }
            break;
 
        case VAR_OBJECT:
-           *tofree = NULL;
-           r = (char_u *)"object";
+           garray_T ga;
+           ga_init2(&ga, 1, 50);
+           ga_concat(&ga, (char_u *)"object of ");
+           object_T *obj = tv->vval.v_object;
+           class_T *cl = obj == NULL ? NULL : obj->obj_class;
+           ga_concat(&ga, cl == NULL ? (char_u *)"[unknown]" : cl->class_name);
+           if (cl != NULL)
+           {
+               ga_concat(&ga, (char_u *)" {");
+               for (int i = 0; i < cl->class_obj_member_count; ++i)
+               {
+                   if (i > 0)
+                       ga_concat(&ga, (char_u *)", ");
+                   objmember_T *m = &cl->class_obj_members[i];
+                   ga_concat(&ga, m->om_name);
+                   ga_concat(&ga, (char_u *)": ");
+                   char_u *tf = NULL;
+                   ga_concat(&ga, echo_string_core((typval_T *)(obj + 1) + i,
+                                              &tf, numbuf, copyID, echo_style,
+                                              restore_copyID, composite_val));
+                   vim_free(tf);
+               }
+               ga_concat(&ga, (char_u *)"}");
+           }
+
+           *tofree = r = ga.ga_data;
            break;
 
        case VAR_FLOAT:
index 7eecddaad22acedcb305e31d2f522a2b748c7b80..79459d1570cd1a5b1f41f7ac7c2fe74f00c37489 100644 (file)
@@ -283,6 +283,21 @@ def Test_class_object_member_inits()
   v9.CheckScriptFailure(lines, 'E1330:')
 enddef
 
+def Test_class_object_to_string()
+  var lines =<< trim END
+      vim9script
+      class TextPosition
+        this.lnum = 1
+        this.col = 22
+      endclass
+
+      assert_equal("class TextPosition", string(TextPosition))
+
+      var pos = TextPosition.new()
+      assert_equal("object of TextPosition {lnum: 1, col: 22}", string(pos))
+  END
+  v9.CheckScriptSuccess(lines)
+enddef
 
 
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
index 4f92cc6dcff65b9308431bf520a6239dcc41e253..4e15b9d8e83e00f38b6608596f379bf14d21c0c9 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1058,
 /**/
     1057,
 /**/