To: vim_dev@googlegroups.com Subject: Patch 9.0.1201 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.1201 Problem: Assignment with operator doesn't work in object method. Solution: Handle loading the object member. (closes #11820) Add a few more tests. Files: src/vim9compile.c, src/testdir/test_vim9_class.vim *** ../vim-9.0.1200/src/vim9compile.c 2023-01-11 17:59:35.110319184 +0000 --- src/vim9compile.c 2023-01-15 15:45:00.790700175 +0000 *************** *** 2044,2049 **** --- 2044,2064 ---- int compile_load_lhs_with_index(lhs_T *lhs, char_u *var_start, cctx_T *cctx) { + if (lhs->lhs_type->tt_type == VAR_OBJECT) + { + // "this.value": load "this" object and get the value at index + // for an object or class member get the type of the member + class_T *cl = (class_T *)lhs->lhs_type->tt_member; + type_T *type = class_member_type(cl, var_start + 5, + lhs->lhs_end, &lhs->lhs_member_idx); + if (lhs->lhs_member_idx < 0) + return FAIL; + + if (generate_LOAD(cctx, ISN_LOAD, 0, NULL, lhs->lhs_type) == FAIL) + return FAIL; + return generate_GET_OBJ_MEMBER(cctx, lhs->lhs_member_idx, type); + } + compile_load_lhs(lhs, var_start, NULL, cctx); if (lhs->lhs_has_index) *** ../vim-9.0.1200/src/testdir/test_vim9_class.vim 2023-01-14 13:12:01.858485739 +0000 --- src/testdir/test_vim9_class.vim 2023-01-15 15:49:13.694733711 +0000 *************** *** 200,205 **** --- 200,224 ---- v9.CheckScriptSuccess(lines) enddef + def Test_assignment_with_operator() + var lines =<< trim END + vim9script + + class Foo + this.x: number + + def Add(n: number) + this.x += n + enddef + endclass + + var f = Foo.new(3) + f.Add(17) + assert_equal(20, f.x) + END + v9.CheckScriptSuccess(lines) + enddef + def Test_class_default_new() var lines =<< trim END vim9script *************** *** 521,526 **** --- 540,564 ---- END v9.CheckScriptSuccess(lines) + # example in the help + lines =<< trim END + vim9script + class OtherThing + this.size: number + static totalSize: number + + def new(this.size) + totalSize += this.size + enddef + endclass + assert_equal(0, OtherThing.totalSize) + var to3 = OtherThing.new(3) + assert_equal(3, OtherThing.totalSize) + var to7 = OtherThing.new(7) + assert_equal(10, OtherThing.totalSize) + END + v9.CheckScriptSuccess(lines) + # check shadowing lines =<< trim END vim9script *************** *** 986,991 **** --- 1024,1046 ---- assert_equal('Base class: 42', o.ToString()) END v9.CheckScriptSuccess(lines) + + lines =<< trim END + vim9script + class Base + this.value = 1 + def new(init: number) + this.value = number + 1 + enddef + endclass + class Child extends Base + def new() + this.new(3) + enddef + endclass + var c = Child.new() + END + v9.CheckScriptFailure(lines, 'E1325: Method not found on class "Child": new(') enddef def Test_class_import() *** ../vim-9.0.1200/src/version.c 2023-01-15 13:23:16.422166107 +0000 --- src/version.c 2023-01-15 15:44:50.814698686 +0000 *************** *** 697,698 **** --- 697,700 ---- { /* Add new patch number below this line */ + /**/ + 1201, /**/ -- hundred-and-one symptoms of being an internet addict: 15. Your heart races faster and beats irregularly each time you see a new WWW site address in print or on TV, even though you've never had heart problems before. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///