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 -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20230115155214.BA6831C0916%40moolenaar.net.

Raspunde prin e-mail lui