summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-03-28 14:53:20 +0100
committerBram Moolenaar <Bram@vim.org>2020-03-28 14:53:20 +0100
commit599c89c82fe3c85378e8077b4e589f0ee4218da2 (patch)
tree71ef083a2121973b5ee4afa19ef67228e006c979 /src
parent495282b6e7e418d072a8ab53c9056b269dc308b7 (diff)
patch 8.2.0465: Vim9: dead code and wrong return typev8.2.0465
Problem: Vim9: dead code and wrong return type. Solution: Remove dead code. Fix return type. Add more tests.
Diffstat (limited to 'src')
-rw-r--r--src/testdir/test_vim9_script.vim41
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c17
3 files changed, 54 insertions, 6 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 6efb146a9d..15b26403b7 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -112,6 +112,16 @@ func Test_assignment_failure()
call CheckDefFailure(['let var: dict <number>'], 'E1007:')
call CheckDefFailure(['let var: dict<number'], 'E1009:')
+endfunc
+
+func Test_wrong_type()
+ call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
+ call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
+ call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
+ call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
+
+ call CheckDefFailure(['let var: dict<number'], 'E1009:')
+ call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
call CheckDefFailure(['let var: ally'], 'E1010:')
call CheckDefFailure(['let var: bram'], 'E1010:')
@@ -436,6 +446,37 @@ def Test_vim9_import_export()
source Ximport.vim
assert_equal(9883, g:imported)
+ let import_star_as_lines_no_dot =<< trim END
+ vim9script
+ import * as Export from './Xexport.vim'
+ def Func()
+ let dummy = 1
+ let imported = Export + dummy
+ enddef
+ END
+ writefile(import_star_as_lines_no_dot, 'Ximport.vim')
+ assert_fails('source Ximport.vim', 'E1060:')
+
+ let import_star_as_lines_dot_space =<< trim END
+ vim9script
+ import * as Export from './Xexport.vim'
+ def Func()
+ let imported = Export . exported
+ enddef
+ END
+ writefile(import_star_as_lines_dot_space, 'Ximport.vim')
+ assert_fails('source Ximport.vim', 'E1074:')
+
+ let import_star_as_lines_missing_name =<< trim END
+ vim9script
+ import * as Export from './Xexport.vim'
+ def Func()
+ let imported = Export.
+ enddef
+ END
+ writefile(import_star_as_lines_missing_name, 'Ximport.vim')
+ assert_fails('source Ximport.vim', 'E1048:')
+
let import_star_lines =<< trim END
vim9script
import * from './Xexport.vim'
diff --git a/src/version.c b/src/version.c
index fdac01b205..c33bf2c567 100644
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 465,
+/**/
464,
/**/
463,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index dd31092624..66eda7c916 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -242,7 +242,7 @@ get_list_type(type_T *member_type, garray_T *type_list)
// Not a common type, create a new entry.
if (ga_grow(type_list, 1) == FAIL)
- return FAIL;
+ return &t_any;
type = ((type_T *)type_list->ga_data) + type_list->ga_len;
++type_list->ga_len;
type->tt_type = VAR_LIST;
@@ -269,7 +269,7 @@ get_dict_type(type_T *member_type, garray_T *type_list)
// Not a common type, create a new entry.
if (ga_grow(type_list, 1) == FAIL)
- return FAIL;
+ return &t_any;
type = ((type_T *)type_list->ga_data) + type_list->ga_len;
++type_list->ga_len;
type->tt_type = VAR_DICT;
@@ -1368,6 +1368,7 @@ skip_type(char_u *start)
parse_type_member(char_u **arg, type_T *type, garray_T *type_list)
{
type_T *member_type;
+ int prev_called_emsg = called_emsg;
if (**arg != '<')
{
@@ -1380,11 +1381,9 @@ parse_type_member(char_u **arg, type_T *type, garray_T *type_list)
*arg = skipwhite(*arg + 1);
member_type = parse_type(arg, type_list);
- if (member_type == NULL)
- return type;
*arg = skipwhite(*arg);
- if (**arg != '>')
+ if (**arg != '>' && called_emsg == prev_called_emsg)
{
emsg(_("E1009: Missing > after type"));
return type;
@@ -1766,6 +1765,11 @@ compile_load_scriptvar(
return FAIL;
}
++p;
+ if (VIM_ISWHITE(*p))
+ {
+ emsg(_("E1074: no white space allowed after dot"));
+ return FAIL;
+ }
idx = find_exported(import->imp_sid, &p, &name_len, &ufunc, &type);
// TODO: what if it is a function?
@@ -1806,6 +1810,7 @@ compile_load(char_u **arg, char_u *end_arg, cctx_T *cctx, int error)
char_u *name;
char_u *end = end_arg;
int res = FAIL;
+ int prev_called_emsg = called_emsg;
if (*(*arg + 1) == ':')
{
@@ -1892,7 +1897,7 @@ compile_load(char_u **arg, char_u *end_arg, cctx_T *cctx, int error)
*arg = end;
theend:
- if (res == FAIL && error)
+ if (res == FAIL && error && called_emsg == prev_called_emsg)
semsg(_(e_var_notfound), name);
vim_free(name);
return res;