]> granicus.if.org Git - vim/commitdiff
patch 8.2.0495: Vim9: some code not tested v8.2.0495
authorBram Moolenaar <Bram@vim.org>
Wed, 1 Apr 2020 21:05:18 +0000 (23:05 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 1 Apr 2020 21:05:18 +0000 (23:05 +0200)
Problem:    Vim9: some code not tested.
Solution:   Add more tests.  Support more const expressions.

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

index 1449017ca9fabcb3cb8115b566090470dccb8f25..c5405a2dc4c480d84d844edac74e94d01685cd7a 100644 (file)
@@ -100,9 +100,19 @@ def Test_assignment()
   set ts=7
   &ts += 1
   assert_equal(8, &ts)
+  &ts -= 3
+  assert_equal(5, &ts)
+  &ts *= 2
+  assert_equal(10, &ts)
+  &ts /= 3
+  assert_equal(3, &ts)
+  set ts=10
+  &ts %= 4
+  assert_equal(2, &ts)
   call CheckDefFailure(['&notex += 3'], 'E113:')
   call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
   call CheckDefFailure(['&path += 3'], 'E1013:')
+  &ts = 8
 
   g:inc_counter += 1
   assert_equal(2, g:inc_counter)
@@ -1013,7 +1023,11 @@ def Test_if_const_expr()
     res = true
   endif
   assert_equal(false, res)
+enddef
 
+def Test_if_const_expr_fails()
+  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
+  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
 enddef
 
 def Test_delfunc()
index de0565a80f6d2dee64e2d1bb9525b1bae0efd256..454dbd4661318918689ee5b9691a413f27fdcf0d 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    495,
 /**/
     494,
 /**/
index 92d13627974d7171ad0529a6813735d1f9daddb5..a4e9eab903a41bf7b3de779ba7a6f0ff528feffc 100644 (file)
@@ -4043,6 +4043,7 @@ evaluate_const_expr7(char_u **arg, cctx_T *cctx UNUSED, typval_T *tv)
 {
     typval_T   argvars[2];
     char_u     *start_leader, *end_leader;
+    int                has_call = FALSE;
 
     /*
      * Skip '!' characters.  They are handled later.
@@ -4070,9 +4071,11 @@ evaluate_const_expr7(char_u **arg, cctx_T *cctx UNUSED, typval_T *tv)
        return OK;
     }
 
-    if (STRNCMP("has(", *arg, 4) != 0)
-       return FAIL;
-    *arg = skipwhite(*arg + 4);
+    if (STRNCMP("has(", *arg, 4) == 0)
+    {
+       has_call = TRUE;
+       *arg = skipwhite(*arg + 4);
+    }
 
     if (**arg == '"')
     {
@@ -4087,23 +4090,26 @@ evaluate_const_expr7(char_u **arg, cctx_T *cctx UNUSED, typval_T *tv)
     else
        return FAIL;
 
-    *arg = skipwhite(*arg);
-    if (**arg != ')')
-       return FAIL;
-    *arg = skipwhite(*arg + 1);
+    if (has_call)
+    {
+       *arg = skipwhite(*arg);
+       if (**arg != ')')
+           return FAIL;
+       *arg = skipwhite(*arg + 1);
 
-    argvars[0] = *tv;
-    argvars[1].v_type = VAR_UNKNOWN;
-    tv->v_type = VAR_NUMBER;
-    tv->vval.v_number = 0;
-    f_has(argvars, tv);
-    clear_tv(&argvars[0]);
+       argvars[0] = *tv;
+       argvars[1].v_type = VAR_UNKNOWN;
+       tv->v_type = VAR_NUMBER;
+       tv->vval.v_number = 0;
+       f_has(argvars, tv);
+       clear_tv(&argvars[0]);
 
-    while (start_leader < end_leader)
-    {
-       if (*start_leader == '!')
-           tv->vval.v_number = !tv->vval.v_number;
-       ++start_leader;
+       while (start_leader < end_leader)
+       {
+           if (*start_leader == '!')
+               tv->vval.v_number = !tv->vval.v_number;
+           ++start_leader;
+       }
     }
 
     return OK;
@@ -4129,8 +4135,33 @@ evaluate_const_expr4(char_u **arg, cctx_T *cctx UNUSED, typval_T *tv)
      */
     if (type != EXPR_UNKNOWN)
     {
-       // TODO
-       return FAIL;
+       typval_T    tv2;
+       char_u      *s1, *s2;
+       char_u      buf1[NUMBUFLEN], buf2[NUMBUFLEN];
+       int         n;
+
+       // TODO:  Only string == string is supported now
+       if (tv->v_type != VAR_STRING)
+           return FAIL;
+       if (type != EXPR_EQUAL)
+           return FAIL;
+
+       // get the second variable
+       tv2.v_type = VAR_UNKNOWN;
+       *arg = skipwhite(p + len);
+       if (evaluate_const_expr7(arg, cctx, &tv2) == FAIL
+                                                  || tv2.v_type != VAR_STRING)
+       {
+           clear_tv(&tv2);
+           return FAIL;
+       }
+       s1 = tv_get_string_buf(tv, buf1);
+       s2 = tv_get_string_buf(&tv2, buf2);
+       n = STRCMP(s1, s2);
+       clear_tv(tv);
+       clear_tv(&tv2);
+       tv->v_type = VAR_BOOL;
+       tv->vval.v_number = n == 0 ? VVAL_TRUE : VVAL_FALSE;
     }
 
     return OK;