From a369c3d9c1217cd932bc3d1751a8cff1f5aef1e4 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 21 Apr 2021 16:00:10 +0200 Subject: 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. --- src/testdir/test_vim9_cmd.vim | 5 ++++ src/version.c | 2 ++ src/vim9compile.c | 62 ++++++++++++++++++++++++++----------------- 3 files changed, 44 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim index ddf3df2a4d..ab2ad6788a 100644 --- 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 index 3547ef4379..1420e7bdae 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2798, /**/ 2797, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index d6ea322d3f..c74bb6e5cd 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -6249,6 +6249,37 @@ compile_load_lhs( return OK; } +/* + * 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". @@ -6535,28 +6566,9 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx) // 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, cctx_T *cctx) { 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 -- cgit v1.2.3