# HG changeset patch # User Bram Moolenaar # Date 1619014504 -7200 # Node ID 056f954c6fd26f276acc5edc125af821b59d42de # Parent f34b18f235e680f88376110898948e6b0d7dad98 patch 8.2.2798: Vim9: redir to variable with append does not accept an index Commit: https://github.com/vim/vim/commit/a369c3d9c1217cd932bc3d1751a8cff1f5aef1e4 Author: Bram Moolenaar Date: Wed Apr 21 16:00:10 2021 +0200 patch 8.2.2798: Vim9: redir to variable with append does not accept an index Problem: Vim9: redir to variable with append does not accept an index. Solution: Make the appending work. diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -1230,6 +1230,11 @@ def Test_redir_to_var() redir END assert_equal({l: ["\ndict-list"]}, dl) + redir =>> d.redir + echo 'more' + redir END + assert_equal({redir: "\ndict\nmore"}, d) + var lines =<< trim END redir => notexist END diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2798, +/**/ 2797, /**/ 2796, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -6250,6 +6250,37 @@ compile_load_lhs( } /* + * Produce code for loading "lhs" and also take care of an index. + * Return OK/FAIL. + */ + static int +compile_load_lhs_with_index(lhs_T *lhs, char_u *var_start, cctx_T *cctx) +{ + compile_load_lhs(lhs, var_start, NULL, cctx); + + if (lhs->lhs_has_index) + { + int range = FALSE; + + // Get member from list or dict. First compile the + // index value. + if (compile_assign_index(var_start, lhs, &range, cctx) == FAIL) + return FAIL; + if (range) + { + semsg(_(e_cannot_use_range_with_assignment_operator_str), + var_start); + return FAIL; + } + + // Get the member. + if (compile_member(FALSE, cctx) == FAIL) + return FAIL; + } + return OK; +} + +/* * Assignment to a list or dict member, or ":unlet" for the item, using the * information in "lhs". * Returns OK or FAIL. @@ -6535,28 +6566,9 @@ compile_assignment(char_u *arg, exarg_T // for "+=", "*=", "..=" etc. first load the current value if (*op != '=') { - compile_load_lhs(&lhs, var_start, NULL, cctx); - - if (lhs.lhs_has_index) - { - int range = FALSE; - - // Get member from list or dict. First compile the - // index value. - if (compile_assign_index(var_start, &lhs, - &range, cctx) == FAIL) - goto theend; - if (range) - { - semsg(_(e_cannot_use_range_with_assignment_operator_str), - var_start); - goto theend; - } - - // Get the member. - if (compile_member(FALSE, cctx) == FAIL) - goto theend; - } + if (compile_load_lhs_with_index(&lhs, var_start, + cctx) == FAIL) + goto theend; } // Compile the expression. Temporarily hide the new local @@ -8608,10 +8620,10 @@ compile_redir(char_u *line, exarg_T *eap { if (lhs->lhs_append) { - if (compile_load_lhs(lhs, lhs->lhs_name, NULL, cctx) == FAIL) + // First load the current variable value. + if (compile_load_lhs_with_index(lhs, lhs->lhs_whole, + cctx) == FAIL) return NULL; - if (lhs->lhs_has_index) - emsg("redir with index not implemented yet"); } // Gets the redirected text and put it on the stack, then store it