summaryrefslogtreecommitdiffstats
path: root/src/evalvars.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-06-14 23:05:10 +0200
committerBram Moolenaar <Bram@vim.org>2020-06-14 23:05:10 +0200
commit47a519a933e8bcaf703a5feaac5c01491a658ee3 (patch)
treee684ae57e04c729278f3248e9131768d8a957060 /src/evalvars.c
parenta65d8b5bb9e9267c6e4500c67d26c839a64f30eb (diff)
patch 8.2.0981: Vim9: cannot compile "[var, var] = list"v8.2.0981
Problem: Vim9: cannot compile "[var, var] = list". Solution: Implement list assignment.
Diffstat (limited to 'src/evalvars.c')
-rw-r--r--src/evalvars.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/src/evalvars.c b/src/evalvars.c
index 31cd01d25b..d2c71d290b 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -164,7 +164,6 @@ static dict_T vimvardict; // Dictionary with v: variables
// for VIM_VERSION_ defines
#include "version.h"
-static char_u *skip_var_one(char_u *arg, int include_type);
static void list_glob_vars(int *first);
static void list_buf_vars(int *first);
static void list_win_vars(int *first);
@@ -709,7 +708,7 @@ ex_let(exarg_T *eap)
if (eap->arg == eap->cmd)
flags |= LET_NO_COMMAND;
- argend = skip_var_list(arg, TRUE, &var_count, &semicolon);
+ argend = skip_var_list(arg, TRUE, &var_count, &semicolon, FALSE);
if (argend == NULL)
return;
if (argend > arg && argend[-1] == '.') // for var.='str'
@@ -916,7 +915,8 @@ ex_let_vars(
* Skip over assignable variable "var" or list of variables "[var, var]".
* Used for ":let varvar = expr" and ":for varvar in expr".
* For "[var, var]" increment "*var_count" for each variable.
- * for "[var, var; var]" set "semicolon".
+ * for "[var, var; var]" set "semicolon" to 1.
+ * If "silent" is TRUE do not give an "invalid argument" error message.
* Return NULL for an error.
*/
char_u *
@@ -924,7 +924,8 @@ skip_var_list(
char_u *arg,
int include_type,
int *var_count,
- int *semicolon)
+ int *semicolon,
+ int silent)
{
char_u *p, *s;
@@ -935,10 +936,11 @@ skip_var_list(
for (;;)
{
p = skipwhite(p + 1); // skip whites after '[', ';' or ','
- s = skip_var_one(p, TRUE);
+ s = skip_var_one(p, FALSE);
if (s == p)
{
- semsg(_(e_invarg2), p);
+ if (!silent)
+ semsg(_(e_invarg2), p);
return NULL;
}
++*var_count;
@@ -957,7 +959,8 @@ skip_var_list(
}
else if (*p != ',')
{
- semsg(_(e_invarg2), p);
+ if (!silent)
+ semsg(_(e_invarg2), p);
return NULL;
}
}
@@ -972,7 +975,7 @@ skip_var_list(
* l[idx].
* In Vim9 script also skip over ": type" if "include_type" is TRUE.
*/
- static char_u *
+ char_u *
skip_var_one(char_u *arg, int include_type)
{
char_u *end;
@@ -981,10 +984,13 @@ skip_var_one(char_u *arg, int include_type)
return arg + 2;
end = find_name_end(*arg == '$' || *arg == '&' ? arg + 1 : arg,
NULL, NULL, FNE_INCL_BR | FNE_CHECK_START);
- if (include_type && current_sctx.sc_version == SCRIPT_VERSION_VIM9
- && *end == ':')
+ if (include_type && current_sctx.sc_version == SCRIPT_VERSION_VIM9)
{
- end = skip_type(skipwhite(end + 1));
+ // "a: type" is declaring variable "a" with a type, not "a:".
+ if (end == arg + 2 && end[-1] == ':')
+ --end;
+ if (*end == ':')
+ end = skip_type(skipwhite(end + 1));
}
return end;
}