]> granicus.if.org Git - vim/commitdiff
patch 8.2.0465: Vim9: dead code and wrong return type v8.2.0465
authorBram Moolenaar <Bram@vim.org>
Sat, 28 Mar 2020 13:53:20 +0000 (14:53 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 28 Mar 2020 13:53:20 +0000 (14:53 +0100)
Problem:    Vim9: dead code and wrong return type.
Solution:   Remove dead code.  Fix return type.  Add more tests.

src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c

index 6efb146a9d147ff4a712aabbb3c2efa3ccf83150..15b26403b7995dbc2ca4812930996759fa1457a6 100644 (file)
@@ -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'
index fdac01b20511dfb04f9925d69521aad4d90dc114..c33bf2c5674b3095cd70b69dd9d335f869570921 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    465,
 /**/
     464,
 /**/
index dd31092624317fe5ba7fadf67f854015dd5095aa..66eda7c916494d772b06e60cf502daf35689f702 100644 (file)
@@ -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;