# HG changeset patch # User Bram Moolenaar # Date 1671039903 -3600 # Node ID 5804270d6e9b2aec1f065a68da0a9155e1d059ea # Parent 548b0a3e0c9721d19ac6c9ac9b2823abbc255eb4 patch 9.0.1058: string value of class and object do not have information Commit: https://github.com/vim/vim/commit/91c9d6d772aaea9d8a8be6c6de0e9defe649f322 Author: Bram Moolenaar Date: Wed Dec 14 17:30:37 2022 +0000 patch 9.0.1058: string value of class and object do not have information Problem: String value of class and object do not have useful information. Solution: Add the class name and for the object the member values. diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -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: diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim --- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1058, +/**/ 1057, /**/ 1056,