Mercurial > vim
diff src/vim9compile.c @ 26346:8be6413a8e27 v8.2.3704
patch 8.2.3704: Vim9: cannot use a list declaration in a :def function
Commit: https://github.com/vim/vim/commit/ab36e6ae7b87b0295fb19270e4339a734875c6b1
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Nov 30 16:14:49 2021 +0000
patch 8.2.3704: Vim9: cannot use a list declaration in a :def function
Problem: Vim9: cannot use a list declaration in a :def function.
Solution: Make it work.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 30 Nov 2021 17:15:03 +0100 |
parents | 4044306e3836 |
children | f209f28ad898 |
line wrap: on
line diff
--- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -144,6 +144,7 @@ typedef struct { // any "[expr]" or ".name" char_u *lhs_dest_end; // end of the destination, including // "[expr]" or ".name". + char_u *lhs_end; // end including any type int lhs_has_index; // has "[expr]" or ".name" @@ -6299,6 +6300,7 @@ compile_lhs( --lhs->lhs_dest_end; if (is_decl && var_end == var_start + 2 && var_end[-1] == ':') --var_end; + lhs->lhs_end = lhs->lhs_dest_end; // compute the length of the destination without "[expr]" or ".name" lhs->lhs_varlen = var_end - var_start; @@ -6435,7 +6437,7 @@ compile_lhs( } } - // handle "a:name" as a name, not index "name" on "a" + // handle "a:name" as a name, not index "name" in "a" if (lhs->lhs_varlen > 1 || var_start[lhs->lhs_varlen] != ':') var_end = lhs->lhs_dest_end; @@ -6456,6 +6458,7 @@ compile_lhs( if (lhs->lhs_type == NULL) return FAIL; lhs->lhs_has_type = TRUE; + lhs->lhs_end = p; } else if (lhs->lhs_lvar != NULL) lhs->lhs_type = lhs->lhs_lvar->lv_type; @@ -6896,13 +6899,6 @@ compile_assignment(char_u *arg, exarg_T if (p == NULL) return *arg == '[' ? arg : NULL; - if (var_count > 0 && is_decl) - { - // TODO: should we allow this, and figure out type inference from list - // members? - emsg(_(e_cannot_use_list_for_declaration)); - return NULL; - } lhs.lhs_name = NULL; sp = p; @@ -7330,7 +7326,7 @@ compile_assignment(char_u *arg, exarg_T cctx->ctx_lnum = save_lnum; if (var_idx + 1 < var_count) - var_start = skipwhite(lhs.lhs_dest_end + 1); + var_start = skipwhite(lhs.lhs_end + 1); } // For "[var, var] = expr" drop the "expr" value.