mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 8.2.4666: Vim9: assignment not recognized in skipped block
Problem: Vim9: assignment not recognized in skipped block. Solution: When skipping assume identifier exists. (closes #10059)
This commit is contained in:
@@ -18,9 +18,9 @@ void fill_exarg_from_cctx(exarg_T *eap, cctx_T *cctx);
|
|||||||
int func_needs_compiling(ufunc_T *ufunc, compiletype_T compile_type);
|
int func_needs_compiling(ufunc_T *ufunc, compiletype_T compile_type);
|
||||||
int assignment_len(char_u *p, int *heredoc);
|
int assignment_len(char_u *p, int *heredoc);
|
||||||
void vim9_declare_error(char_u *name);
|
void vim9_declare_error(char_u *name);
|
||||||
int get_var_dest(char_u *name, assign_dest_T *dest, int cmdidx, int *option_scope, int *vimvaridx, type_T **type, cctx_T *cctx);
|
int get_var_dest(char_u *name, assign_dest_T *dest, cmdidx_T cmdidx, int *option_scope, int *vimvaridx, type_T **type, cctx_T *cctx);
|
||||||
int compile_lhs(char_u *var_start, lhs_T *lhs, int cmdidx, int heredoc, int oplen, cctx_T *cctx);
|
int compile_lhs(char_u *var_start, lhs_T *lhs, cmdidx_T cmdidx, int heredoc, int has_cmd, int oplen, cctx_T *cctx);
|
||||||
int compile_assign_lhs(char_u *var_start, lhs_T *lhs, int cmdidx, int is_decl, int heredoc, int oplen, cctx_T *cctx);
|
int compile_assign_lhs(char_u *var_start, lhs_T *lhs, cmdidx_T cmdidx, int is_decl, int heredoc, int has_cmd, int oplen, cctx_T *cctx);
|
||||||
int compile_load_lhs_with_index(lhs_T *lhs, char_u *var_start, cctx_T *cctx);
|
int compile_load_lhs_with_index(lhs_T *lhs, char_u *var_start, cctx_T *cctx);
|
||||||
int compile_assign_unlet(char_u *var_start, lhs_T *lhs, int is_assign, type_T *rhs_type, cctx_T *cctx);
|
int compile_assign_unlet(char_u *var_start, lhs_T *lhs, int is_assign, type_T *rhs_type, cctx_T *cctx);
|
||||||
compiletype_T get_compile_type(ufunc_T *ufunc);
|
compiletype_T get_compile_type(ufunc_T *ufunc);
|
||||||
|
@@ -1363,7 +1363,12 @@ def Test_command_not_recognized()
|
|||||||
var lines =<< trim END
|
var lines =<< trim END
|
||||||
d.key = 'asdf'
|
d.key = 'asdf'
|
||||||
END
|
END
|
||||||
v9.CheckDefFailure(lines, 'E1146:', 1)
|
v9.CheckDefFailure(lines, 'E1089: Unknown variable: d', 1)
|
||||||
|
|
||||||
|
lines =<< trim END
|
||||||
|
d['key'] = 'asdf'
|
||||||
|
END
|
||||||
|
v9.CheckDefFailure(lines, 'E1089: Unknown variable: d', 1)
|
||||||
|
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
if 0
|
if 0
|
||||||
@@ -1371,11 +1376,6 @@ def Test_command_not_recognized()
|
|||||||
endif
|
endif
|
||||||
END
|
END
|
||||||
v9.CheckDefSuccess(lines)
|
v9.CheckDefSuccess(lines)
|
||||||
|
|
||||||
lines =<< trim END
|
|
||||||
d['key'] = 'asdf'
|
|
||||||
END
|
|
||||||
v9.CheckDefFailure(lines, 'E1146:', 1)
|
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
def Test_magic_not_used()
|
def Test_magic_not_used()
|
||||||
|
@@ -2003,6 +2003,19 @@ def Test_for_skipped_block()
|
|||||||
assert_equal([3, 4], result)
|
assert_equal([3, 4], result)
|
||||||
enddef
|
enddef
|
||||||
DefFalse()
|
DefFalse()
|
||||||
|
|
||||||
|
def BuildDiagrams()
|
||||||
|
var diagrams: list<any>
|
||||||
|
if false
|
||||||
|
var max = 0
|
||||||
|
for v in diagrams
|
||||||
|
var l = 3
|
||||||
|
if max < l | max = l | endif
|
||||||
|
v->add(l)
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
enddef
|
||||||
|
BuildDiagrams()
|
||||||
END
|
END
|
||||||
v9.CheckDefAndScriptSuccess(lines)
|
v9.CheckDefAndScriptSuccess(lines)
|
||||||
enddef
|
enddef
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
4666,
|
||||||
/**/
|
/**/
|
||||||
4665,
|
4665,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -139,7 +139,7 @@ compile_unlet(
|
|||||||
//
|
//
|
||||||
// Figure out the LHS type and other properties.
|
// Figure out the LHS type and other properties.
|
||||||
//
|
//
|
||||||
ret = compile_lhs(p, &lhs, CMD_unlet, FALSE, 0, cctx);
|
ret = compile_lhs(p, &lhs, CMD_unlet, FALSE, FALSE, 0, cctx);
|
||||||
|
|
||||||
// Use the info in "lhs" to unlet the item at the index in the
|
// Use the info in "lhs" to unlet the item at the index in the
|
||||||
// list or dict.
|
// list or dict.
|
||||||
@@ -2160,7 +2160,7 @@ compile_redir(char_u *line, exarg_T *eap, cctx_T *cctx)
|
|||||||
arg = skipwhite(arg);
|
arg = skipwhite(arg);
|
||||||
|
|
||||||
if (compile_assign_lhs(arg, lhs, CMD_redir,
|
if (compile_assign_lhs(arg, lhs, CMD_redir,
|
||||||
FALSE, FALSE, 1, cctx) == FAIL)
|
FALSE, FALSE, FALSE, 1, cctx) == FAIL)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (need_type(&t_string, lhs->lhs_member_type,
|
if (need_type(&t_string, lhs->lhs_member_type,
|
||||||
-1, 0, cctx, FALSE, FALSE) == FAIL)
|
-1, 0, cctx, FALSE, FALSE) == FAIL)
|
||||||
|
@@ -279,7 +279,8 @@ variable_exists(char_u *name, size_t len, cctx_T *cctx)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Return TRUE if "name" is a local variable, argument, script variable,
|
* Return TRUE if "name" is a local variable, argument, script variable,
|
||||||
* imported or function.
|
* imported or function. Or commands are being skipped, a declaration may have
|
||||||
|
* been skipped then.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
item_exists(char_u *name, size_t len, int cmd UNUSED, cctx_T *cctx)
|
item_exists(char_u *name, size_t len, int cmd UNUSED, cctx_T *cctx)
|
||||||
@@ -1109,7 +1110,7 @@ vim9_declare_error(char_u *name)
|
|||||||
get_var_dest(
|
get_var_dest(
|
||||||
char_u *name,
|
char_u *name,
|
||||||
assign_dest_T *dest,
|
assign_dest_T *dest,
|
||||||
int cmdidx,
|
cmdidx_T cmdidx,
|
||||||
int *option_scope,
|
int *option_scope,
|
||||||
int *vimvaridx,
|
int *vimvaridx,
|
||||||
type_T **type,
|
type_T **type,
|
||||||
@@ -1225,7 +1226,7 @@ get_var_dest(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
is_decl_command(int cmdidx)
|
is_decl_command(cmdidx_T cmdidx)
|
||||||
{
|
{
|
||||||
return cmdidx == CMD_let || cmdidx == CMD_var
|
return cmdidx == CMD_let || cmdidx == CMD_var
|
||||||
|| cmdidx == CMD_final || cmdidx == CMD_const;
|
|| cmdidx == CMD_final || cmdidx == CMD_const;
|
||||||
@@ -1240,8 +1241,9 @@ is_decl_command(int cmdidx)
|
|||||||
compile_lhs(
|
compile_lhs(
|
||||||
char_u *var_start,
|
char_u *var_start,
|
||||||
lhs_T *lhs,
|
lhs_T *lhs,
|
||||||
int cmdidx,
|
cmdidx_T cmdidx,
|
||||||
int heredoc,
|
int heredoc,
|
||||||
|
int has_cmd, // "var" before "var_start"
|
||||||
int oplen,
|
int oplen,
|
||||||
cctx_T *cctx)
|
cctx_T *cctx)
|
||||||
{
|
{
|
||||||
@@ -1493,7 +1495,8 @@ compile_lhs(
|
|||||||
semsg(_(e_cannot_use_operator_on_new_variable), lhs->lhs_name);
|
semsg(_(e_cannot_use_operator_on_new_variable), lhs->lhs_name);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
if (!is_decl)
|
if (!is_decl || (lhs->lhs_has_index && !has_cmd
|
||||||
|
&& cctx->ctx_skip != SKIP_YES))
|
||||||
{
|
{
|
||||||
semsg(_(e_unknown_variable_str), lhs->lhs_name);
|
semsg(_(e_unknown_variable_str), lhs->lhs_name);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@@ -1520,9 +1523,12 @@ compile_lhs(
|
|||||||
char_u *p;
|
char_u *p;
|
||||||
|
|
||||||
// Something follows after the variable: "var[idx]" or "var.key".
|
// Something follows after the variable: "var[idx]" or "var.key".
|
||||||
if (is_decl)
|
if (is_decl && cctx->ctx_skip != SKIP_YES)
|
||||||
{
|
{
|
||||||
|
if (has_cmd)
|
||||||
emsg(_(e_cannot_use_index_when_declaring_variable));
|
emsg(_(e_cannot_use_index_when_declaring_variable));
|
||||||
|
else
|
||||||
|
semsg(_(e_unknown_variable_str), lhs->lhs_name);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1564,13 +1570,15 @@ compile_lhs(
|
|||||||
compile_assign_lhs(
|
compile_assign_lhs(
|
||||||
char_u *var_start,
|
char_u *var_start,
|
||||||
lhs_T *lhs,
|
lhs_T *lhs,
|
||||||
int cmdidx,
|
cmdidx_T cmdidx,
|
||||||
int is_decl,
|
int is_decl,
|
||||||
int heredoc,
|
int heredoc,
|
||||||
|
int has_cmd, // "var" before "var_start"
|
||||||
int oplen,
|
int oplen,
|
||||||
cctx_T *cctx)
|
cctx_T *cctx)
|
||||||
{
|
{
|
||||||
if (compile_lhs(var_start, lhs, cmdidx, heredoc, oplen, cctx) == FAIL)
|
if (compile_lhs(var_start, lhs, cmdidx, heredoc, has_cmd, oplen, cctx)
|
||||||
|
== FAIL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
if (!lhs->lhs_has_index && lhs->lhs_lvar == &lhs->lhs_arg_lvar)
|
if (!lhs->lhs_has_index && lhs->lhs_lvar == &lhs->lhs_arg_lvar)
|
||||||
@@ -2049,7 +2057,8 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
|
|||||||
* Figure out the LHS type and other properties.
|
* Figure out the LHS type and other properties.
|
||||||
*/
|
*/
|
||||||
if (compile_assign_lhs(var_start, &lhs, cmdidx,
|
if (compile_assign_lhs(var_start, &lhs, cmdidx,
|
||||||
is_decl, heredoc, oplen, cctx) == FAIL)
|
is_decl, heredoc, var_start > eap->cmd,
|
||||||
|
oplen, cctx) == FAIL)
|
||||||
goto theend;
|
goto theend;
|
||||||
if (heredoc)
|
if (heredoc)
|
||||||
{
|
{
|
||||||
@@ -2769,6 +2778,7 @@ compile_def_function(
|
|||||||
CLEAR_FIELD(ea);
|
CLEAR_FIELD(ea);
|
||||||
ea.cmdlinep = &line;
|
ea.cmdlinep = &line;
|
||||||
ea.cmd = skipwhite(line);
|
ea.cmd = skipwhite(line);
|
||||||
|
ea.skip = cctx.ctx_skip == SKIP_YES;
|
||||||
|
|
||||||
if (*ea.cmd == '#')
|
if (*ea.cmd == '#')
|
||||||
{
|
{
|
||||||
@@ -2957,15 +2967,17 @@ compile_def_function(
|
|||||||
|
|
||||||
if (p == ea.cmd && ea.cmdidx != CMD_SIZE)
|
if (p == ea.cmd && ea.cmdidx != CMD_SIZE)
|
||||||
{
|
{
|
||||||
if (cctx.ctx_skip == SKIP_YES && ea.cmdidx != CMD_eval)
|
// "eval" is used for "val->func()" and "var" for "var = val", then
|
||||||
|
// "p" is equal to "ea.cmd" for a valid command.
|
||||||
|
if (ea.cmdidx == CMD_eval || ea.cmdidx == CMD_var)
|
||||||
|
;
|
||||||
|
else if (cctx.ctx_skip == SKIP_YES)
|
||||||
{
|
{
|
||||||
line += STRLEN(line);
|
line += STRLEN(line);
|
||||||
goto nextline;
|
goto nextline;
|
||||||
}
|
}
|
||||||
else if (ea.cmdidx != CMD_eval)
|
else
|
||||||
{
|
{
|
||||||
// CMD_var cannot happen, compile_assignment() above would be
|
|
||||||
// used. Most likely an assignment to a non-existing variable.
|
|
||||||
semsg(_(e_command_not_recognized_str), ea.cmd);
|
semsg(_(e_command_not_recognized_str), ea.cmd);
|
||||||
goto erret;
|
goto erret;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user