]> granicus.if.org Git - vim/commitdiff
patch 8.2.0348: Vim9: not all code tested v8.2.0348
authorBram Moolenaar <Bram@vim.org>
Mon, 2 Mar 2020 21:53:32 +0000 (22:53 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 2 Mar 2020 21:53:32 +0000 (22:53 +0100)
Problem:    Vim9: not all code tested.
Solution:   Add a few more tests. fix using "b:" in literal dictionary.

src/proto/vim9compile.pro
src/testdir/test_vim9_expr.vim
src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c

index 73cf13f49c9d5d632db397b6cdffe745d77a6464..61a628149ff498fd92d657aff21289155b770330 100644 (file)
@@ -5,7 +5,6 @@ char *vartype_name(vartype_T type);
 char *type_name(type_T *type, char **tofree);
 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_end(char_u *arg);
 char_u *to_name_const_end(char_u *arg);
 int assignment_len(char_u *p, int *heredoc);
 void compile_def_function(ufunc_T *ufunc, int set_return_type);
index 1ec3c6f1b028482a6fbbcc2f7403fe1d0d125974..d67c2d565c035a12d1c2be3462af02b0ec17167c 100644 (file)
@@ -37,9 +37,9 @@ def Test_expr1()
     assert_equal('one', 0.1 ? 'one' : 'two')
   endif
   assert_equal('one', 'x' ? 'one' : 'two')
-"  assert_equal('one', 0z1234 ? 'one' : 'two')
+  assert_equal('one', 0z1234 ? 'one' : 'two')
   assert_equal('one', [0] ? 'one' : 'two')
-"  assert_equal('one', #{x: 0} ? 'one' : 'two')
+  assert_equal('one', #{x: 0} ? 'one' : 'two')
   let var = 1
   assert_equal('one', var ? 'one' : 'two')
 
@@ -49,9 +49,9 @@ def Test_expr1()
     assert_equal('two', 0.0 ? 'one' : 'two')
   endif
   assert_equal('two', '' ? 'one' : 'two')
-"  assert_equal('one', 0z ? 'one' : 'two')
+  assert_equal('two', 0z ? 'one' : 'two')
   assert_equal('two', [] ? 'one' : 'two')
-"  assert_equal('two', {} ? 'one' : 'two')
+  assert_equal('two', {} ? 'one' : 'two')
   var = 0
   assert_equal('two', var ? 'one' : 'two')
 enddef
@@ -447,6 +447,11 @@ func Test_expr4_fails()
   call CheckDefFailure("let x = [13] <= [88]", 'Cannot compare list with list')
   call CheckDefFailure("let x = [13] =~ [88]", 'Cannot compare list with list')
   call CheckDefFailure("let x = [13] !~ [88]", 'Cannot compare list with list')
+
+  call CheckDefFailureMult(['let j: job', 'let chan: channel', 'let r = j == chan'], 'Cannot compare job with channel')
+  call CheckDefFailureMult(['let j: job', 'let x: list<any>', 'let r = j == x'], 'Cannot compare job with list')
+  call CheckDefFailureMult(['let j: job', 'let x: func', 'let r = j == x'], 'Cannot compare job with func')
+  call CheckDefFailureMult(['let j: job', 'let x: partial', 'let r = j == x'], 'Cannot compare job with partial')
 endfunc
 
 " test addition, subtraction, concatenation
index d5e42e8dc5b0ade31b2822924210e925c559d8a7..a8950f07295b00efdd35cdada058314fc9b823a0 100644 (file)
@@ -68,6 +68,8 @@ def Test_assignment()
 
   " type becomes list<any>
   let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
+  " type becomes dict<any>
+  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
 
   g:newvar = 'new'
   assert_equal('new', g:newvar)
@@ -373,6 +375,7 @@ def Test_vim9script()
     g:imported_name = exp_name
     exp_name ..= ' Doe'
     g:imported_name_appended = exp_name
+    g:imported_later = exported
   END
 
   writefile(import_script_lines, 'Ximport.vim')
@@ -384,6 +387,7 @@ def Test_vim9script()
   assert_equal('bob', g:localname)
   assert_equal(9876, g:imported)
   assert_equal(9879, g:imported_added)
+  assert_equal(9879, g:imported_later)
   assert_equal('Exported', g:imported_func)
   assert_equal('John', g:imported_name)
   assert_equal('John Doe', g:imported_name_appended)
@@ -393,10 +397,30 @@ def Test_vim9script()
   unlet g:localname
   unlet g:imported
   unlet g:imported_added
+  unlet g:imported_later
   unlet g:imported_func
   unlet g:imported_name g:imported_name_appended
   delete('Ximport.vim')
 
+  let import_in_def_lines =<< trim END
+    vim9script
+    def ImportInDef()
+      import exported from './Xexport.vim'
+      g:imported = exported
+      exported += 7
+      g:imported_added = exported
+    enddef
+    ImportInDef()
+  END
+  writefile(import_in_def_lines, 'Ximport2.vim')
+  source Ximport2.vim
+  " TODO: this should be 9879
+  assert_equal(9876, g:imported)
+  assert_equal(9883, g:imported_added)
+  unlet g:imported
+  unlet g:imported_added
+  delete('Ximport2.vim')
+
   let import_star_as_lines =<< trim END
     vim9script
     import * as Export from './Xexport.vim'
@@ -407,7 +431,7 @@ def Test_vim9script()
   END
   writefile(import_star_as_lines, 'Ximport.vim')
   source Ximport.vim
-  assert_equal(9876, g:imported)
+  assert_equal(9883, g:imported)
 
   let import_star_lines =<< trim END
     vim9script
index 78d7926a0ce1b398bc3cafce684df9bc50206a8c..d595d173e77d6c34bffba06e82e84422c1c4d101 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    348,
 /**/
     347,
 /**/
index 5d8dc90025ee07ea55e1735cf1dd71cd2347c06c..1f61566ab1b7200c0a2d70fe700f0d0ce8b16ec4 100644 (file)
@@ -507,7 +507,7 @@ generate_COMPARE(cctx_T *cctx, exptype_T exptype, int ic)
                    && (type1 == VAR_BLOB || type2 == VAR_BLOB
                        || type1 == VAR_LIST || type2 == VAR_LIST))))
     {
-       semsg(_("E1037: Cannot compare %s with %s"),
+       semsg(_("E1072: Cannot compare %s with %s"),
                vartype_name(type1), vartype_name(type2));
        return FAIL;
     }
@@ -1494,8 +1494,8 @@ vartype_name(vartype_T type)
 {
     switch (type)
     {
+       case VAR_UNKNOWN: break;
        case VAR_VOID: return "void";
-       case VAR_UNKNOWN: return "any";
        case VAR_SPECIAL: return "special";
        case VAR_BOOL: return "bool";
        case VAR_NUMBER: return "number";
@@ -1509,7 +1509,7 @@ vartype_name(vartype_T type)
        case VAR_FUNC: return "func";
        case VAR_PARTIAL: return "partial";
     }
-    return "???";
+    return "any";
 }
 
 /*
@@ -1907,11 +1907,12 @@ theend:
 /*
  * Find the end of a variable or function name.  Unlike find_name_end() this
  * does not recognize magic braces.
+ * When "namespace" is TRUE recognize "b:", "s:", etc.
  * Return a pointer to just after the name.  Equal to "arg" if there is no
  * valid name.
  */
-    char_u *
-to_name_end(char_u *arg)
+    static char_u *
+to_name_end(char_u *arg, int namespace)
 {
     char_u     *p;
 
@@ -1923,6 +1924,7 @@ to_name_end(char_u *arg)
        // Include a namespace such as "s:var" and "v:var".  But "n:" is not
        // and can be used in slice "[n:]".
        if (*p == ':' && (p != arg + 1
+                            || !namespace
                             || vim_strchr(VIM9_NAMESPACE_CHAR, *arg) == NULL))
            break;
     return p;
@@ -1934,7 +1936,7 @@ to_name_end(char_u *arg)
     char_u *
 to_name_const_end(char_u *arg)
 {
-    char_u     *p = to_name_end(arg);
+    char_u     *p = to_name_end(arg, TRUE);
     typval_T   rettv;
 
     if (p == arg && *arg == '[')
@@ -2145,7 +2147,7 @@ compile_dict(char_u **arg, cctx_T *cctx, int literal)
 
        if (literal)
        {
-           char_u *p = to_name_end(*arg);
+           char_u *p = to_name_end(*arg, !literal);
 
            if (p == *arg)
            {
@@ -2766,7 +2768,7 @@ compile_expr7(char_u **arg, cctx_T *cctx)
        }
 
        // "name" or "name()"
-       p = to_name_end(*arg);
+       p = to_name_end(*arg, TRUE);
        if (*p == '(')
            r = compile_call(arg, p - *arg, cctx, 0);
        else
@@ -4980,7 +4982,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type)
            // val".
            p = (*ea.cmd == '&' || *ea.cmd == '$' || *ea.cmd == '@')
                                                         ? ea.cmd + 1 : ea.cmd;
-           p = to_name_end(p);
+           p = to_name_end(p, TRUE);
            if ((p > ea.cmd && *p != NUL) || *p == '(')
            {
                int oplen;
@@ -4992,7 +4994,9 @@ compile_def_function(ufunc_T *ufunc, int set_return_type)
                    // Recognize an assignment if we recognize the variable
                    // name:
                    // "g:var = expr"
-                   // "var = expr"  where "var" is a local var name.
+                   // "local = expr"  where "local" is a local var.
+                   // "script = expr"  where "script" is a script-local var.
+                   // "import = expr"  where "import" is an imported var
                    // "&opt = expr"
                    // "$ENV = expr"
                    // "@r = expr"