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/vim9compile.c b/src/vim9compile.c
index d6ea322..c74bb6e 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -6250,6 +6250,37 @@
}
/*
+ * 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 @@
// 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 @@
{
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