To: vim_dev@googlegroups.com Subject: Patch 8.2.2565 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.2565 Problem: Vim9: "..=" not always recognized. Solution: Do not consider "..=" to be string concatenation. (closes #7905) Files: src/eval.c, src/testdir/test_vim9_assign.vim *** ../vim-8.2.2564/src/eval.c 2021-02-20 17:03:57.980112625 +0100 --- src/eval.c 2021-03-03 17:50:08.158951017 +0100 *************** *** 2849,2859 **** int vim9script = in_vim9script(); // "." is only string concatenation when scriptversion is 1 ! // "+=" and "-=" are assignment p = eval_next_non_blank(*arg, evalarg, &getnext); op = *p; concat = op == '.' && (*(p + 1) == '.' || current_sctx.sc_version < 2); ! if ((op != '+' && op != '-' && !concat) || p[1] == '=') break; evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); --- 2849,2860 ---- int vim9script = in_vim9script(); // "." is only string concatenation when scriptversion is 1 ! // "+=", "-=" and "..=" are assignments p = eval_next_non_blank(*arg, evalarg, &getnext); op = *p; concat = op == '.' && (*(p + 1) == '.' || current_sctx.sc_version < 2); ! if ((op != '+' && op != '-' && !concat) || p[1] == '=' ! || (p[1] == '.' && p[2] == '=')) break; evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); *************** *** 3080,3088 **** #endif int error; p = eval_next_non_blank(*arg, evalarg, &getnext); op = *p; ! if (op != '*' && op != '/' && op != '%') break; evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); --- 3081,3090 ---- #endif int error; + // "*=", "/=" and "%=" are assignments p = eval_next_non_blank(*arg, evalarg, &getnext); op = *p; ! if ((op != '*' && op != '/' && op != '%') || p[1] == '=') break; evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); *** ../vim-8.2.2564/src/testdir/test_vim9_assign.vim 2021-02-20 17:03:57.984112613 +0100 --- src/testdir/test_vim9_assign.vim 2021-03-03 17:51:20.338784966 +0100 *************** *** 1099,1104 **** --- 1099,1142 ---- CheckScriptSuccess(lines) enddef + def Test_assign_dict_with_op() + var lines =<< trim END + vim9script + var ds: dict = {a: 'x'} + ds['a'] ..= 'y' + ds.a ..= 'z' + assert_equal('xyz', ds.a) + + var dn: dict = {a: 9} + dn['a'] += 2 + assert_equal(11, dn.a) + dn.a += 2 + assert_equal(13, dn.a) + + dn['a'] -= 3 + assert_equal(10, dn.a) + dn.a -= 2 + assert_equal(8, dn.a) + + dn['a'] *= 2 + assert_equal(16, dn.a) + dn.a *= 2 + assert_equal(32, dn.a) + + dn['a'] /= 3 + assert_equal(10, dn.a) + dn.a /= 2 + assert_equal(5, dn.a) + + dn['a'] %= 3 + assert_equal(2, dn.a) + dn.a %= 6 + assert_equal(2, dn.a) + END + # TODO: this should also work with a :def function + CheckScriptSuccess(lines) + enddef + def Test_assign_lambda() # check if assign a lambda to a variable which type is func or any. var lines =<< trim END *** ../vim-8.2.2564/src/version.c 2021-03-03 15:24:18.942864634 +0100 --- src/version.c 2021-03-03 17:56:32.262068931 +0100 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 2565, /**/ -- "I love deadlines. I especially like the whooshing sound they make as they go flying by." -- Douglas Adams /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///