summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2023-10-05 20:14:43 +0200
committerChristian Brabandt <cb@256bit.org>2023-10-05 20:16:06 +0200
commitb5a0719cb7abf51b0540df527cb9738a3ccf0d37 (patch)
tree5fa50a382935836aaede388f18fa751231d67d8d
parentb6d01f131c6ad44451b63ff437fa04169173f1c5 (diff)
patch 9.0.1986: Vim9: accepting type-annotationsv9.0.1986
Problem: Vim9: accepting type-annotations Solution: Reject type annotations outside of declarations. closes: #13267 closes: #13283 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
-rw-r--r--src/eval.c8
-rw-r--r--src/evalvars.c1
-rw-r--r--src/testdir/test_vim9_assign.vim39
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h1
-rw-r--r--src/vim9compile.c5
6 files changed, 55 insertions, 1 deletions
diff --git a/src/eval.c b/src/eval.c
index 0a335df071..19ab01561d 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -1271,6 +1271,14 @@ get_lval(
semsg(_(e_using_type_not_in_script_context_str), p);
return NULL;
}
+ if (vim9script && (flags & GLV_NO_DECL) &&
+ !(flags & GLV_FOR_LOOP))
+ {
+ // Using a type and not in a "var" declaration.
+ semsg(_(e_trailing_characters_str), p);
+ return NULL;
+ }
+
// parse the type after the name
lp->ll_type = parse_type(&tp,
diff --git a/src/evalvars.c b/src/evalvars.c
index 14b7dc39a4..d7a1a96a54 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -1858,6 +1858,7 @@ ex_let_one(
char_u *p;
int lval_flags = (flags & (ASSIGN_NO_DECL | ASSIGN_DECL))
? GLV_NO_DECL : 0;
+ lval_flags |= (flags & ASSIGN_FOR_LOOP) ? GLV_FOR_LOOP : 0;
if (op != NULL && *op != '=')
lval_flags |= GLV_ASSIGN_WITH_OP;
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index ce728230b3..07afadb0c8 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -2822,6 +2822,45 @@ def Test_using_s_var_in_function()
v9.CheckScriptSuccess(lines)
enddef
+" Test for specifying a type in assignment
+def Test_type_specification_in_assignment()
+ # specify type for an existing script local variable without "var"
+ var lines =<< trim END
+ vim9script
+ var n: number = 10
+ n: number = 20
+ END
+ v9.CheckSourceFailure(lines, 'E488: Trailing characters: : number = 20', 3)
+
+ # specify type for a non-existing script local variable without "var"
+ lines =<< trim END
+ vim9script
+ MyVar: string = 'abc'
+ END
+ v9.CheckSourceFailure(lines, "E492: Not an editor command: MyVar: string = 'abc'", 2)
+
+ # specify type for an existing def local variable without "var"
+ lines =<< trim END
+ vim9script
+ def Foo()
+ var n: number = 10
+ n: number = 20
+ enddef
+ Foo()
+ END
+ v9.CheckSourceFailure(lines, 'E488: Trailing characters: : number = 20', 2)
+
+ # specify type for a non-existing def local variable without "var"
+ lines =<< trim END
+ vim9script
+ def Foo()
+ MyVar: string = 'abc'
+ enddef
+ Foo()
+ END
+ v9.CheckSourceFailure(lines, "E476: Invalid command: MyVar: string = 'abc'", 1)
+enddef
+
let g:someVar = 'X'
" Test for heredoc with Vim expressions.
diff --git a/src/version.c b/src/version.c
index eb517ec37e..c93b3e582d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1986,
+/**/
1985,
/**/
1984,
diff --git a/src/vim.h b/src/vim.h
index 0a0b2f862a..2bafda4249 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -2776,6 +2776,7 @@ typedef int (*opt_expand_cb_T)(optexpand_T *args, int *numMatches, char_u ***mat
#define GLV_COMPILING TFN_COMPILING // variable may be defined later
#define GLV_ASSIGN_WITH_OP TFN_ASSIGN_WITH_OP // assignment with operator
#define GLV_PREFER_FUNC 0x10000 // prefer function above variable
+#define GLV_FOR_LOOP 0x20000 // assigning to a loop variable
#define DO_NOT_FREE_CNT 99999 // refcount for dict or list that should not
// be freed.
diff --git a/src/vim9compile.c b/src/vim9compile.c
index abe1e2fb50..136bea49d3 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -1737,11 +1737,14 @@ compile_lhs(
if (is_decl)
{
// if we come here with what looks like an assignment like
- // .= but which has been reject by assignment_len() from
+ // .= but which has been rejected by assignment_len() from
// may_compile_assignment give a better error message
char_u *p = skipwhite(lhs->lhs_end);
if (p[0] == '.' && p[1] == '=')
emsg(_(e_dot_equal_not_supported_with_script_version_two));
+ else if (p[0] == ':')
+ // type specified in a non-var assignment
+ semsg(_(e_trailing_characters_str), p);
else
semsg(_(e_variable_already_declared_str), lhs->lhs_name);
return FAIL;