Patch 8.2.1365
Problem: Vim9: no error for missing white space around operator.
Solution: Check for white space. (closes #6618)
Files: src/eval.c, src/vim9compile.c, src/proto/vim9compile.pro,
src/evalvars.c, src/testdir/test_vim9_expr.vim,
src/testdir/test_vim9_func.vim
*** ../vim-8.2.1364/src/eval.c 2020-08-04 15:52:58.281452992 +0200
--- src/eval.c 2020-08-04 23:06:34.991516468 +0200
***************
*** 2574,2579 ****
--- 2574,2580 ----
int getnext;
char_u *p;
int op;
+ int oplen;
int concat;
typval_T var2;
***************
*** 2584,2594 ****
if (op != '+' && op != '-' && !concat)
break;
if (getnext)
*arg = eval_next_line(evalarg);
else
*arg = p;
! evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE);
if ((op != '+' || (rettv->v_type != VAR_LIST
&& rettv->v_type != VAR_BLOB))
#ifdef FEAT_FLOAT
--- 2585,2603 ----
if (op != '+' && op != '-' && !concat)
break;
+ evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE);
if (getnext)
*arg = eval_next_line(evalarg);
else
+ {
+ if (evaluate && in_vim9script() && !VIM_ISWHITE(**arg))
+ {
+ error_white_both(p, 1);
+ clear_tv(rettv);
+ return FAIL;
+ }
*arg = p;
! }
if ((op != '+' || (rettv->v_type != VAR_LIST
&& rettv->v_type != VAR_BLOB))
#ifdef FEAT_FLOAT
***************
*** 2613,2621 ****
/*
* Get the second variable.
*/
! if (op == '.' && *(*arg + 1) == '.') // .. string concatenation
! ++*arg;
! *arg = skipwhite_and_linebreak(*arg + 1, evalarg);
if (eval6(arg, &var2, evalarg, op == '.') == FAIL)
{
clear_tv(rettv);
--- 2622,2635 ----
/*
* Get the second variable.
*/
! oplen = (op == '.' && *(*arg + 1) == '.') ? 2 : 1;
! if (evaluate && in_vim9script() && !IS_WHITE_OR_NUL((*arg)[oplen]))
! {
! error_white_both(p, oplen);
! clear_tv(rettv);
! return FAIL;
! }
! *arg = skipwhite_and_linebreak(*arg + oplen, evalarg);
if (eval6(arg, &var2, evalarg, op == '.') == FAIL)
{
clear_tv(rettv);
***************
*** 3358,3363 ****
--- 3372,3378 ----
}
else
{
+ *arg = skipwhite(*arg);
if (**arg != '(')
{
if (verbose)
***************
*** 4841,4847 ****
/*
* Get the length of the name of a function or internal variable.
! * "arg" is advanced to the first non-white character after the name.
* Return 0 if something is wrong.
*/
int
--- 4856,4862 ----
/*
* Get the length of the name of a function or internal variable.
! * "arg" is advanced to after the name.
* Return 0 if something is wrong.
*/
int
***************
*** 4867,4873 ****
return 0;
len = (int)(p - *arg);
! *arg = skipwhite(p);
return len;
}
--- 4882,4888 ----
return 0;
len = (int)(p - *arg);
! *arg = p;
return len;
}
*** ../vim-8.2.1364/src/vim9compile.c 2020-08-02 18:58:50.465504251 +0200
--- src/vim9compile.c 2020-08-04 22:38:16.156297785 +0200
***************
*** 4244,4249 ****
--- 4244,4261 ----
}
/*
+ * Give the "white on both sides" error, taking the operator from "p[len]".
+ */
+ void
+ error_white_both(char_u *op, int len)
+ {
+ char_u buf[10];
+
+ vim_strncpy(buf, op, len);
+ semsg(_(e_white_both), buf);
+ }
+
+ /*
* * number multiplication
* / number division
* % number modulo
***************
*** 4275,4284 ****
if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(op[1]))
{
! char_u buf[3];
!
! vim_strncpy(buf, op, 1);
! semsg(_(e_white_both), buf);
return FAIL;
}
*arg = skipwhite(op + 1);
--- 4287,4293 ----
if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(op[1]))
{
! error_white_both(op, 1);
return FAIL;
}
*arg = skipwhite(op + 1);
***************
*** 4354,4363 ****
if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(op[oplen]))
{
! char_u buf[3];
!
! vim_strncpy(buf, op, oplen);
! semsg(_(e_white_both), buf);
return FAIL;
}
--- 4363,4369 ----
if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(op[oplen]))
{
! error_white_both(op, oplen);
return FAIL;
}
***************
*** 4486,4495 ****
if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[len]))
{
! char_u buf[7];
!
! vim_strncpy(buf, p, len);
! semsg(_(e_white_both), buf);
return FAIL;
}
--- 4492,4498 ----
if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[len]))
{
! error_white_both(p, len);
return FAIL;
}
***************
*** 5132,5141 ****
if (oplen > 0 && (!VIM_ISWHITE(*sp) || !VIM_ISWHITE(op[oplen])))
{
! char_u buf[4];
!
! vim_strncpy(buf, op, oplen);
! semsg(_(e_white_both), buf);
return NULL;
}
--- 5135,5141 ----
if (oplen > 0 && (!VIM_ISWHITE(*sp) || !VIM_ISWHITE(op[oplen])))
{
! error_white_both(op, oplen);
return NULL;
}
*** ../vim-8.2.1364/src/proto/vim9compile.pro 2020-07-29 21:20:37.926626437
+0200
--- src/proto/vim9compile.pro 2020-08-04 22:35:13.564665955 +0200
***************
*** 17,22 ****
--- 17,23 ----
char_u *next_line_from_context(cctx_T *cctx, int skip_comment);
char_u *to_name_const_end(char_u *arg);
exptype_T get_compare_type(char_u *p, int *len, int *type_is);
+ void error_white_both(char_u *op, int len);
int assignment_len(char_u *p, int *heredoc);
void vim9_declare_error(char_u *name);
int check_vim9_unlet(char_u *name);
*** ../vim-8.2.1364/src/evalvars.c 2020-08-02 16:58:55.763760810 +0200
--- src/evalvars.c 2020-08-04 23:09:25.579081607 +0200
***************
*** 1137,1142 ****
--- 1137,1143 ----
}
else
{
+ arg = skipwhite(arg);
if (tofree != NULL)
name = tofree;
if (eval_variable(name, len, &tv, NULL, TRUE, FALSE) == FAIL)
***************
*** 3358,3363 ****
--- 3359,3365 ----
int
var_exists(char_u *var)
{
+ char_u *arg = var;
char_u *name;
char_u *tofree;
typval_T tv;
***************
*** 3366,3372 ****
// get_name_len() takes care of expanding curly braces
name = var;
! len = get_name_len(&var, &tofree, TRUE, FALSE);
if (len > 0)
{
if (tofree != NULL)
--- 3368,3374 ----
// get_name_len() takes care of expanding curly braces
name = var;
! len = get_name_len(&arg, &tofree, TRUE, FALSE);
if (len > 0)
{
if (tofree != NULL)
***************
*** 3375,3386 ****
if (n)
{
// handle d.key, l[idx], f(expr)
! n = (handle_subscript(&var, &tv, &EVALARG_EVALUATE, FALSE) == OK);
if (n)
clear_tv(&tv);
}
}
! if (*var != NUL)
n = FALSE;
vim_free(tofree);
--- 3377,3389 ----
if (n)
{
// handle d.key, l[idx], f(expr)
! arg = skipwhite(arg);
! n = (handle_subscript(&arg, &tv, &EVALARG_EVALUATE, FALSE) == OK);
if (n)
clear_tv(&tv);
}
}
! if (*arg != NUL)
n = FALSE;
vim_free(tofree);
*** ../vim-8.2.1364/src/testdir/test_vim9_expr.vim 2020-08-02
18:58:50.465504251 +0200
--- src/testdir/test_vim9_expr.vim 2020-08-04 22:41:51.495790616 +0200
***************
*** 872,877 ****
--- 872,910 ----
echo 'abc' isnot? 'abc'
END
CheckScriptFailure(lines, 'E15:')
+
+ # check white space
+ lines =<< trim END
+ vim9script
+ echo 5+6
+ END
+ CheckScriptFailure(lines, 'E1004:')
+ lines =<< trim END
+ vim9script
+ echo 5 +6
+ END
+ CheckScriptFailure(lines, 'E1004:')
+ lines =<< trim END
+ vim9script
+ echo 5+ 6
+ END
+ CheckScriptFailure(lines, 'E1004:')
+
+ lines =<< trim END
+ vim9script
+ echo 'a'..'b'
+ END
+ CheckScriptFailure(lines, 'E1004:')
+ lines =<< trim END
+ vim9script
+ echo 'a' ..'b'
+ END
+ CheckScriptFailure(lines, 'E1004:')
+ lines =<< trim END
+ vim9script
+ echo 'a'.. 'b'
+ END
+ CheckScriptFailure(lines, 'E1004:')
enddef
def Test_expr5_float()
*** ../vim-8.2.1364/src/testdir/test_vim9_func.vim 2020-08-01
23:22:15.192256533 +0200
--- src/testdir/test_vim9_func.vim 2020-08-04 23:22:08.625024678 +0200
***************
*** 1270,1276 ****
def TreeWalk(dir: string): list<any>
return readdir(dir)->map({_, val ->
fnamemodify(dir .. '/' .. val, ':p')->isdirectory()
! ? {val : TreeWalk(dir .. '/' .. val)}
: val
})
enddef
--- 1270,1276 ----
def TreeWalk(dir: string): list<any>
return readdir(dir)->map({_, val ->
fnamemodify(dir .. '/' .. val, ':p')->isdirectory()
! ? {val: TreeWalk(dir .. '/' .. val)}
: val
})
enddef
*** ../vim-8.2.1364/src/version.c 2020-08-04 21:46:15.366707429 +0200
--- src/version.c 2020-08-04 22:33:27.980843240 +0200
***************
*** 756,757 ****
--- 756,759 ----
{ /* Add new patch number below this line */
+ /**/
+ 1365,
/**/
--
~
~
~
".signature" 4 lines, 50 characters written
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/202008050854.0758sOCA3237845%40masaka.moolenaar.net.