summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-06-21 15:52:59 +0200
committerBram Moolenaar <Bram@vim.org>2020-06-21 15:52:59 +0200
commite55b1c098d9dc04c960e6575bb554b5130af8989 (patch)
tree5c2825d93f3b76f1ba87603b062585c72df02131
parent820ffa567c5a4bc0d3517c79c91d63d8062c358e (diff)
patch 8.2.1028: Vim9: no error for declaring buffer, window, etc. variablev8.2.1028
Problem: Vim9: no error for declaring buffer, window, etc. variable. Solution: Give an error. Unify the error messages.
-rw-r--r--src/evalvars.c18
-rw-r--r--src/globals.h2
-rw-r--r--src/proto/vim9compile.pro1
-rw-r--r--src/testdir/test_vim9_expr.vim2
-rw-r--r--src/testdir/test_vim9_script.vim41
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c32
7 files changed, 75 insertions, 23 deletions
diff --git a/src/evalvars.c b/src/evalvars.c
index 91883ddc40..b3e89150ad 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -1204,6 +1204,13 @@ ex_let_one(
emsg(_("E996: Cannot lock an environment variable"));
return NULL;
}
+ if (current_sctx.sc_version == SCRIPT_VERSION_VIM9
+ && (flags & LET_NO_COMMAND) == 0)
+ {
+ vim9_declare_error(arg);
+ return NULL;
+ }
+
// Find the end of the name.
++arg;
name = arg;
@@ -2864,16 +2871,17 @@ set_var_const(
semsg(_(e_illvar), name);
return;
}
+ is_script_local = ht == get_script_local_ht();
+
if (current_sctx.sc_version == SCRIPT_VERSION_VIM9
- && ht == &globvarht
- && (flags & LET_NO_COMMAND) == 0)
+ && !is_script_local
+ && (flags & LET_NO_COMMAND) == 0
+ && name[1] == ':')
{
- semsg(_(e_declare_global), name);
+ vim9_declare_error(name);
return;
}
- is_script_local = ht == get_script_local_ht();
-
di = find_var_in_ht(ht, 0, varname, TRUE);
// Search in parent scope which is possible to reference from lambda
diff --git a/src/globals.h b/src/globals.h
index b6356a3600..5dc139eebb 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -1788,7 +1788,7 @@ EXTERN char e_no_white_before[] INIT(= N_("E1068: No white space allowed before
EXTERN char e_lock_unlock[] INIT(= N_("E940: Cannot lock or unlock variable %s"));
EXTERN char e_const_req_value[] INIT(= N_("E1021: const requires a value"));
EXTERN char e_type_req[] INIT(= N_("E1022: type or initialization required"));
-EXTERN char e_declare_global[] INIT(= N_("E1016: Cannot declare a global variable: %s"));
+EXTERN char e_declare_var[] INIT(= N_("E1016: Cannot declare a%s variable: %s"));
#endif
#if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
EXTERN char e_alloc_color[] INIT(= N_("E254: Cannot allocate color %s"));
diff --git a/src/proto/vim9compile.pro b/src/proto/vim9compile.pro
index 0db5fc7fc3..040e4d7eb7 100644
--- a/src/proto/vim9compile.pro
+++ b/src/proto/vim9compile.pro
@@ -10,6 +10,7 @@ int get_script_item_idx(int sid, char_u *name, int check_writable);
imported_T *find_imported(char_u *name, size_t len, cctx_T *cctx);
char_u *to_name_const_end(char_u *arg);
int assignment_len(char_u *p, int *heredoc);
+void vim9_declare_error(char_u *name);
int check_vim9_unlet(char_u *name);
int compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx);
void set_function_type(ufunc_T *ufunc);
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index 05a3cd6d3d..f87e920b23 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -1059,7 +1059,7 @@ func Test_expr_fails()
call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:')
call CheckDefFailure(["v:nosuch += 3"], 'E1001:')
- call CheckDefFailure(["let v:statusmsg = ''"], 'E1064:')
+ call CheckDefFailure(["let v:statusmsg = ''"], 'E1016: Cannot declare a v: variable:')
call CheckDefFailure(["let asdf = v:nosuch"], 'E1001:')
call CheckDefFailure(["echo len('asdf'"], 'E110:')
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index ec1fc87310..a733bf168b 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -322,15 +322,15 @@ def Test_assignment_failure()
call CheckDefFailure(['let &option'], 'E1052:')
call CheckDefFailure(['&g:option = 5'], 'E113:')
- call CheckDefFailure(['let $VAR = 5'], 'E1065:')
+ call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
call CheckDefFailure(['let @~ = 5'], 'E354:')
call CheckDefFailure(['let @a = 5'], 'E1066:')
- call CheckDefFailure(['let g:var = 5'], 'E1016:')
- call CheckDefFailure(['let w:var = 5'], 'E1079:')
- call CheckDefFailure(['let b:var = 5'], 'E1078:')
- call CheckDefFailure(['let t:var = 5'], 'E1080:')
+ call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
+ call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
+ call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
+ call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
call CheckDefFailure(['let xnr += 4'], 'E1020:')
@@ -1812,14 +1812,41 @@ def Test_vim9_comment_not_compiled()
CheckScriptSuccess([
'vim9script',
'g:var = 123',
- 'let w:var = 777',
+ 'b:var = 456',
+ 'w:var = 777',
+ 't:var = 888',
'unlet g:var w:var # something',
])
CheckScriptFailure([
'vim9script',
'let g:var = 123',
- ], 'E1016:')
+ ], 'E1016: Cannot declare a global variable:')
+
+ CheckScriptFailure([
+ 'vim9script',
+ 'let b:var = 123',
+ ], 'E1016: Cannot declare a buffer variable:')
+
+ CheckScriptFailure([
+ 'vim9script',
+ 'let w:var = 123',
+ ], 'E1016: Cannot declare a window variable:')
+
+ CheckScriptFailure([
+ 'vim9script',
+ 'let t:var = 123',
+ ], 'E1016: Cannot declare a tab variable:')
+
+ CheckScriptFailure([
+ 'vim9script',
+ 'let v:version = 123',
+ ], 'E1016: Cannot declare a v: variable:')
+
+ CheckScriptFailure([
+ 'vim9script',
+ 'let $VARIABLE = "text"',
+ ], 'E1016: Cannot declare an environment variable:')
CheckScriptFailure([
'vim9script',
diff --git a/src/version.c b/src/version.c
index b78659134a..77fdac1399 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1028,
+/**/
1027,
/**/
1026,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 5b440940ee..3b021afdcb 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -4659,6 +4659,23 @@ generate_loadvar(
}
}
+ void
+vim9_declare_error(char_u *name)
+{
+ char *scope = "";
+
+ switch (*name)
+ {
+ case 'g': scope = " global"; break;
+ case 'b': scope = " buffer"; break;
+ case 'w': scope = " window"; break;
+ case 't': scope = " tab"; break;
+ case 'v': scope = " v:"; break;
+ case '$': scope = "n environment"; break;
+ }
+ semsg(_(e_declare_var), scope, name);
+}
+
/*
* Compile declaration and assignment:
* "let var", "let var = expr", "const var = expr" and "var = expr"
@@ -4855,8 +4872,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
type = &t_string;
if (is_decl)
{
- semsg(_("E1065: Cannot declare an environment variable: %s"),
- name);
+ vim9_declare_error(name);
goto theend;
}
}
@@ -4880,7 +4896,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
dest = dest_global;
if (is_decl)
{
- semsg(_(e_declare_global), name);
+ vim9_declare_error(name);
goto theend;
}
}
@@ -4889,8 +4905,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
dest = dest_buffer;
if (is_decl)
{
- semsg(_("E1078: Cannot declare a buffer variable: %s"),
- name);
+ vim9_declare_error(name);
goto theend;
}
}
@@ -4899,8 +4914,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
dest = dest_window;
if (is_decl)
{
- semsg(_("E1079: Cannot declare a window variable: %s"),
- name);
+ vim9_declare_error(name);
goto theend;
}
}
@@ -4909,7 +4923,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
dest = dest_tab;
if (is_decl)
{
- semsg(_("E1080: Cannot declare a tab variable: %s"), name);
+ vim9_declare_error(name);
goto theend;
}
}
@@ -4932,7 +4946,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
type = typval2type(vtv);
if (is_decl)
{
- semsg(_("E1064: Cannot declare a v: variable: %s"), name);
+ vim9_declare_error(name);
goto theend;
}
}