# HG changeset patch # User Bram Moolenaar # Date 1585775703 -7200 # Node ID dd3c80122a0e070c1ad7a97a9affb0eace495718 # Parent 8aa17104800a010c6ea05c69780264c90de2f913 patch 8.2.0495: Vim9: some code not tested Commit: https://github.com/vim/vim/commit/80c34ca312506c2c65eef6b119e214f7e6f87eb9 Author: Bram Moolenaar Date: Wed Apr 1 23:05:18 2020 +0200 patch 8.2.0495: Vim9: some code not tested Problem: Vim9: some code not tested. Solution: Add more tests. Support more const expressions. diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -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(['¬ex += 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() diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 495, +/**/ 494, /**/ 493, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -4043,6 +4043,7 @@ evaluate_const_expr7(char_u **arg, cctx_ { 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_ 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_ else return FAIL; - *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]); - - while (start_leader < end_leader) + if (has_call) { - if (*start_leader == '!') - tv->vval.v_number = !tv->vval.v_number; - ++start_leader; + *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]); + + 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_ */ 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;