Mercurial > vim
diff src/eval.c @ 31455:5ef28f5ff357 v9.0.1060
patch 9.0.1060: private and public object members are not implemented yet
Commit: https://github.com/vim/vim/commit/3d473ee1a6aed7cb9eae458bbd8d42dffdc754f9
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Dec 14 20:59:32 2022 +0000
patch 9.0.1060: private and public object members are not implemented yet
problem: Private and public object members are not implemented yet.
Solution: Implement private and public object members.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 14 Dec 2022 22:00:04 +0100 |
parents | 06a1c71c58ad |
children | 1bebc2093e6b |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -1194,6 +1194,7 @@ get_lval( while (*p == '[' || (*p == '.' && p[1] != '=' && p[1] != '.')) { if (*p == '.' && lp->ll_tv->v_type != VAR_DICT + && lp->ll_tv->v_type != VAR_OBJECT && lp->ll_tv->v_type != VAR_CLASS) { if (!quiet) @@ -1203,6 +1204,7 @@ get_lval( if (lp->ll_tv->v_type != VAR_LIST && lp->ll_tv->v_type != VAR_DICT && lp->ll_tv->v_type != VAR_BLOB + && lp->ll_tv->v_type != VAR_OBJECT && lp->ll_tv->v_type != VAR_CLASS) { if (!quiet) @@ -1509,10 +1511,55 @@ get_lval( lp->ll_tv = &lp->ll_li->li_tv; } - else // v_type == VAR_CLASS - { - // TODO: check object members and methods if - // "key" points name start, "p" to the end + else // v_type == VAR_CLASS || v_type == VAR_OBJECT + { + class_T *cl = (lp->ll_tv->v_type == VAR_OBJECT + && lp->ll_tv->vval.v_object != NULL) + ? lp->ll_tv->vval.v_object->obj_class + : lp->ll_tv->vval.v_class; + // TODO: what if class is NULL? + if (cl != NULL) + { + lp->ll_valtype = NULL; + for (int i = 0; i < cl->class_obj_member_count; ++i) + { + objmember_T *om = cl->class_obj_members + i; + if (STRNCMP(om->om_name, key, p - key) == 0 + && om->om_name[p - key] == NUL) + { + switch (om->om_access) + { + case ACCESS_PRIVATE: + semsg(_(e_cannot_access_private_object_member_str), + om->om_name); + return NULL; + case ACCESS_READ: + if (!(flags & GLV_READ_ONLY)) + { + semsg(_(e_object_member_is_not_writable_str), + om->om_name); + return NULL; + } + break; + case ACCESS_ALL: + break; + } + + lp->ll_valtype = om->om_type; + + if (lp->ll_tv->v_type == VAR_OBJECT) + lp->ll_tv = ((typval_T *)( + lp->ll_tv->vval.v_object + 1)) + i; + // TODO: what about a class? + break; + } + } + if (lp->ll_valtype == NULL) + { + semsg(_(e_object_member_not_found_str), key); + return NULL; + } + } } } @@ -1640,7 +1687,7 @@ set_var_lval( else { /* - * Assign to a List or Dictionary item. + * Assign to a List, Dictionary or Object item. */ if ((flags & (ASSIGN_CONST | ASSIGN_FINAL)) && (flags & ASSIGN_FOR_LOOP) == 0)