mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.1373: Vim9: no error for assigning to non-existing script var
Problem: Vim9: no error for assigning to non-existing script var. Solution: Check that in Vim9 script the variable was defined. (closes #6630)
This commit is contained in:
@@ -1594,7 +1594,9 @@ typedef struct
|
|||||||
int uf_tml_execed; // line being timed was executed
|
int uf_tml_execed; // line being timed was executed
|
||||||
# endif
|
# endif
|
||||||
sctx_T uf_script_ctx; // SCTX where function was defined,
|
sctx_T uf_script_ctx; // SCTX where function was defined,
|
||||||
// used for s: variables
|
// used for s: variables; sc_version changed
|
||||||
|
// for :function
|
||||||
|
int uf_script_ctx_version; // original sc_version of SCTX
|
||||||
int uf_refcount; // reference count, see func_name_refcount()
|
int uf_refcount; // reference count, see func_name_refcount()
|
||||||
|
|
||||||
funccall_T *uf_scoped; // l: local variables for closure
|
funccall_T *uf_scoped; // l: local variables for closure
|
||||||
|
@@ -112,6 +112,15 @@ def Test_assignment()
|
|||||||
call CheckDefFailure(['let s:var = 123'], 'E1101:')
|
call CheckDefFailure(['let s:var = 123'], 'E1101:')
|
||||||
call CheckDefFailure(['let s:var: number'], 'E1101:')
|
call CheckDefFailure(['let s:var: number'], 'E1101:')
|
||||||
|
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
def SomeFunc()
|
||||||
|
s:var = 123
|
||||||
|
enddef
|
||||||
|
defcompile
|
||||||
|
END
|
||||||
|
call CheckScriptFailure(lines, 'E1089:')
|
||||||
|
|
||||||
g:inc_counter += 1
|
g:inc_counter += 1
|
||||||
assert_equal(2, g:inc_counter)
|
assert_equal(2, g:inc_counter)
|
||||||
|
|
||||||
|
@@ -3508,6 +3508,7 @@ def_function(exarg_T *eap, char_u *name_arg)
|
|||||||
fp->uf_calls = 0;
|
fp->uf_calls = 0;
|
||||||
fp->uf_cleared = FALSE;
|
fp->uf_cleared = FALSE;
|
||||||
fp->uf_script_ctx = current_sctx;
|
fp->uf_script_ctx = current_sctx;
|
||||||
|
fp->uf_script_ctx_version = current_sctx.sc_version;
|
||||||
fp->uf_script_ctx.sc_lnum += sourcing_lnum_top;
|
fp->uf_script_ctx.sc_lnum += sourcing_lnum_top;
|
||||||
if (is_export)
|
if (is_export)
|
||||||
{
|
{
|
||||||
|
@@ -754,6 +754,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 */
|
||||||
|
/**/
|
||||||
|
1373,
|
||||||
/**/
|
/**/
|
||||||
1372,
|
1372,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -148,6 +148,7 @@ static char e_syntax_at[] = N_("E1002: Syntax error at %s");
|
|||||||
static char e_used_as_arg[] = N_("E1006: %s is used as an argument");
|
static char e_used_as_arg[] = N_("E1006: %s is used as an argument");
|
||||||
static char e_cannot_use_void[] = N_("E1031: Cannot use void value");
|
static char e_cannot_use_void[] = N_("E1031: Cannot use void value");
|
||||||
static char e_namespace[] = N_("E1075: Namespace not supported: %s");
|
static char e_namespace[] = N_("E1075: Namespace not supported: %s");
|
||||||
|
static char e_unknown_var[] = N_("E1089: unknown variable: %s");
|
||||||
|
|
||||||
static void delete_def_function_contents(dfunc_T *dfunc);
|
static void delete_def_function_contents(dfunc_T *dfunc);
|
||||||
static void arg_type_mismatch(type_T *expected, type_T *actual, int argidx);
|
static void arg_type_mismatch(type_T *expected, type_T *actual, int argidx);
|
||||||
@@ -5335,7 +5336,6 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
int idx;
|
int idx;
|
||||||
imported_T *import = NULL;
|
|
||||||
|
|
||||||
for (idx = 0; reserved[idx] != NULL; ++idx)
|
for (idx = 0; reserved[idx] != NULL; ++idx)
|
||||||
if (STRCMP(reserved[idx], name) == 0)
|
if (STRCMP(reserved[idx], name) == 0)
|
||||||
@@ -5374,16 +5374,23 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
|
|||||||
goto theend;
|
goto theend;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((varlen > 1 && STRNCMP(var_start, "s:", 2) == 0)
|
else
|
||||||
|| lookup_script(var_start, varlen) == OK
|
{
|
||||||
|| (import = find_imported(var_start, varlen, cctx))
|
int script_namespace = varlen > 1
|
||||||
!= NULL)
|
&& STRNCMP(var_start, "s:", 2) == 0;
|
||||||
|
int script_var = (script_namespace
|
||||||
|
? lookup_script(var_start + 2, varlen - 2)
|
||||||
|
: lookup_script(var_start, varlen)) == OK;
|
||||||
|
imported_T *import =
|
||||||
|
find_imported(var_start, varlen, cctx);
|
||||||
|
|
||||||
|
if (script_namespace || script_var || import != NULL)
|
||||||
{
|
{
|
||||||
char_u *rawname = name + (name[1] == ':' ? 2 : 0);
|
char_u *rawname = name + (name[1] == ':' ? 2 : 0);
|
||||||
|
|
||||||
if (is_decl)
|
if (is_decl)
|
||||||
{
|
{
|
||||||
if ((varlen > 1 && STRNCMP(var_start, "s:", 2) == 0))
|
if (script_namespace)
|
||||||
semsg(_("E1101: Cannot declare a script variable in a function: %s"),
|
semsg(_("E1101: Cannot declare a script variable in a function: %s"),
|
||||||
name);
|
name);
|
||||||
else
|
else
|
||||||
@@ -5391,6 +5398,15 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
|
|||||||
name);
|
name);
|
||||||
goto theend;
|
goto theend;
|
||||||
}
|
}
|
||||||
|
else if (cctx->ctx_ufunc->uf_script_ctx_version
|
||||||
|
== SCRIPT_VERSION_VIM9
|
||||||
|
&& script_namespace
|
||||||
|
&& !script_var && import == NULL)
|
||||||
|
{
|
||||||
|
semsg(_(e_unknown_var), name);
|
||||||
|
goto theend;
|
||||||
|
}
|
||||||
|
|
||||||
dest = dest_script;
|
dest = dest_script;
|
||||||
|
|
||||||
// existing script-local variables should have a type
|
// existing script-local variables should have a type
|
||||||
@@ -5402,7 +5418,8 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
|
|||||||
if (scriptvar_idx >= 0)
|
if (scriptvar_idx >= 0)
|
||||||
{
|
{
|
||||||
scriptitem_T *si = SCRIPT_ITEM(scriptvar_sid);
|
scriptitem_T *si = SCRIPT_ITEM(scriptvar_sid);
|
||||||
svar_T *sv = ((svar_T *)si->sn_var_vals.ga_data)
|
svar_T *sv =
|
||||||
|
((svar_T *)si->sn_var_vals.ga_data)
|
||||||
+ scriptvar_idx;
|
+ scriptvar_idx;
|
||||||
type = sv->sv_type;
|
type = sv->sv_type;
|
||||||
}
|
}
|
||||||
@@ -5415,10 +5432,11 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
|
|||||||
}
|
}
|
||||||
else if (!is_decl)
|
else if (!is_decl)
|
||||||
{
|
{
|
||||||
semsg(_("E1089: unknown variable: %s"), name);
|
semsg(_(e_unknown_var), name);
|
||||||
goto theend;
|
goto theend;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (declare_error)
|
if (declare_error)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user