To: vim_dev@googlegroups.com Subject: Patch 8.2.2710 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.2710 Problem: Vim9: not all tests cover script and :def function. Solution: Run tests in both if possible. Fix differences. Files: src/eval.c, src/vim9compile.c, src/vim9execute.c, src/testdir/vim9.vim, src/testdir/test_vim9_expr.vim *** ../vim-8.2.2709/src/eval.c 2021-03-27 21:23:27.064153032 +0100 --- src/eval.c 2021-04-04 20:18:24.028030100 +0200 *************** *** 2330,2336 **** { if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) { ! error_white_both(p, 1); clear_tv(rettv); return FAIL; } --- 2330,2336 ---- { if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) { ! error_white_both(p, op_falsy ? 2 : 1); clear_tv(rettv); return FAIL; } *************** *** 2361,2367 **** ++*arg; if (evaluate && vim9script && !IS_WHITE_OR_NUL((*arg)[1])) { ! error_white_both(p, 1); clear_tv(rettv); return FAIL; } --- 2361,2367 ---- ++*arg; if (evaluate && vim9script && !IS_WHITE_OR_NUL((*arg)[1])) { ! error_white_both(p, op_falsy ? 2 : 1); clear_tv(rettv); return FAIL; } *************** *** 2774,2780 **** */ if (evaluate && vim9script && !IS_WHITE_OR_NUL(p[len])) { ! error_white_both(p, 1); clear_tv(rettv); return FAIL; } --- 2774,2780 ---- */ if (evaluate && vim9script && !IS_WHITE_OR_NUL(p[len])) { ! error_white_both(p, len); clear_tv(rettv); return FAIL; } *************** *** 3438,3446 **** case '@': ++*arg; if (evaluate) { ! rettv->v_type = VAR_STRING; ! rettv->vval.v_string = get_reg_contents(**arg, ! GREG_EXPR_SRC); } if (**arg != NUL) ++*arg; --- 3438,3453 ---- case '@': ++*arg; if (evaluate) { ! if (in_vim9script() && IS_WHITE_OR_NUL(**arg)) ! semsg(_(e_syntax_error_at_str), *arg); ! else if (in_vim9script() && !valid_yank_reg(**arg, FALSE)) ! emsg_invreg(**arg); ! else ! { ! rettv->v_type = VAR_STRING; ! rettv->vval.v_string = get_reg_contents(**arg, ! GREG_EXPR_SRC); ! } } if (**arg != NUL) ++*arg; *** ../vim-8.2.2709/src/vim9compile.c 2021-04-03 21:47:03.276908544 +0200 --- src/vim9compile.c 2021-04-04 20:39:06.544995935 +0200 *************** *** 4106,4112 **** ppconst->pp_is_const = FALSE; *arg = p + 1; ! if (may_get_next_line(*arg, arg, cctx) == FAIL) { emsg(_(e_missing_name_after_dot)); return FAIL; --- 4106,4112 ---- ppconst->pp_is_const = FALSE; *arg = p + 1; ! if (IS_WHITE_OR_NUL(**arg)) { emsg(_(e_missing_name_after_dot)); return FAIL; *************** *** 4785,4791 **** if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[2])) { semsg(_(e_white_space_required_before_and_after_str_at_str), ! op, *arg); return FAIL; } --- 4785,4791 ---- if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[2])) { semsg(_(e_white_space_required_before_and_after_str_at_str), ! op, p); return FAIL; } *** ../vim-8.2.2709/src/vim9execute.c 2021-04-03 19:32:40.750286283 +0200 --- src/vim9execute.c 2021-04-04 16:24:34.958274412 +0200 *************** *** 3962,3970 **** done: // function finished, get result from the stack. ! tv = STACK_TV_BOT(-1); ! *rettv = *tv; ! tv->v_type = VAR_UNKNOWN; ret = OK; failed: --- 3962,3977 ---- done: // function finished, get result from the stack. ! if (ufunc->uf_ret_type == &t_void) ! { ! rettv->v_type = VAR_VOID; ! } ! else ! { ! tv = STACK_TV_BOT(-1); ! *rettv = *tv; ! tv->v_type = VAR_UNKNOWN; ! } ret = OK; failed: *** ../vim-8.2.2709/src/testdir/vim9.vim 2021-01-21 12:34:11.441508288 +0100 --- src/testdir/vim9.vim 2021-04-04 16:58:38.997630294 +0200 *************** *** 107,115 **** --- 107,135 ---- CheckScriptFailure(['vim9script'] + lines, error, lnum + 1) enddef + " As CheckDefAndScriptFailure() but with two different exepcted errors. + def CheckDefAndScriptFailure2( + lines: list, + errorDef: string, + errorScript: string, + lnum = -3) + CheckDefFailure(lines, errorDef, lnum) + CheckScriptFailure(['vim9script'] + lines, errorScript, lnum + 1) + enddef + " Check that a command fails with the same error when executed in a :def " function and when used in Vim9 script. def CheckDefExecAndScriptFailure(lines: list, error: string, lnum = -3) CheckDefExecFailure(lines, error, lnum) CheckScriptFailure(['vim9script'] + lines, error, lnum + 1) enddef + + " As CheckDefExecAndScriptFailure() but with two different expected errors. + def CheckDefExecAndScriptFailure2( + lines: list, + errorDef: string, + errorScript: string, + lnum = -3) + CheckDefExecFailure(lines, errorDef, lnum) + CheckScriptFailure(['vim9script'] + lines, errorScript, lnum + 1) + enddef *** ../vim-8.2.2709/src/testdir/test_vim9_expr.vim 2021-04-03 21:47:03.276908544 +0200 --- src/testdir/test_vim9_expr.vim 2021-04-04 20:48:17.342766404 +0200 *************** *** 72,210 **** def Test_expr1_trinary_vimscript() # check line continuation var lines =<< trim END - vim9script var name = 1 ? 'yes' : 'no' assert_equal('yes', name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = v:false ? 'yes' : 'no' assert_equal('no', name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = v:false ? 'yes' : 'no' assert_equal('no', name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = v:false ? # comment 'yes' : # comment 'no' # comment assert_equal('no', name) END ! CheckScriptSuccess(lines) # check white space lines =<< trim END - vim9script var name = v:true?1:2 END ! CheckScriptFailure(lines, 'E1004: White space required before and after ''?'' at "?1:2"', 2) lines =<< trim END - vim9script var name = v:true? 1 : 2 END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script var name = v:true ?1 : 2 END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script var name = v:true ? 1: 2 END ! CheckScriptFailure(lines, 'E1004: White space required before and after '':'' at ": 2"', 2) lines =<< trim END - vim9script var name = v:true ? 1 :2 END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script var name = 'x' ? 1 : 2 END ! CheckScriptFailure(lines, 'E1135:', 2) lines =<< trim END - vim9script var name = [] ? 1 : 2 END ! CheckScriptFailure(lines, 'E745:', 2) lines =<< trim END - vim9script var name = {} ? 1 : 2 END ! CheckScriptFailure(lines, 'E728:', 2) # check after failure eval_flags is reset lines =<< trim END - vim9script try eval('0 ? 1: 2') catch endtry assert_equal(v:true, eval(string(v:true))) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script try eval('0 ? 1 :2') catch endtry assert_equal(v:true, eval(string(v:true))) END ! CheckScriptSuccess(lines) enddef func Test_expr1_trinary_fails() ! call CheckDefFailure(["var x = 1 ? 'one'"], "Missing ':' after '?'", 1) let msg = "White space required before and after '?'" ! call CheckDefFailure(["var x = 1? 'one' : 'two'"], msg, 1) ! call CheckDefFailure(["var x = 1 ?'one' : 'two'"], msg, 1) ! call CheckDefFailure(["var x = 1?'one' : 'two'"], msg, 1) let msg = "White space required before and after ':'" ! call CheckDefFailure(["var x = 1 ? 'one': 'two'"], msg, 1) ! call CheckDefFailure(["var x = 1 ? 'one' :'two'"], msg, 1) ! call CheckDefFailure(["var x = 1 ? 'one':'two'"], msg, 1) ! ! call CheckDefFailure(["var x = 'x' ? 'one' : 'two'"], 'E1135:', 1) ! call CheckDefFailure(["var x = 0z1234 ? 'one' : 'two'"], 'E974:', 1) ! call CheckDefExecFailure(["var x = [] ? 'one' : 'two'"], 'E745:', 1) ! call CheckDefExecFailure(["var x = {} ? 'one' : 'two'"], 'E728:', 1) call CheckDefExecFailure(["var x = false ? "], 'E1097:', 3) call CheckDefExecFailure(["var x = false ? 'one' : "], 'E1097:', 3) ! call CheckDefExecFailure(["var x = true ? xxx : 'foo'"], 'E1001:', 1) ! call CheckDefExecFailure(["var x = false ? 'foo' : xxx"], 'E1001:', 1) if has('float') ! call CheckDefFailure(["var x = 0.1 ? 'one' : 'two'"], 'E805:', 1) endif " missing argument detected even when common type is used ! call CheckDefFailure([ \ 'var X = FuncOne', \ 'var Y = FuncTwo', \ 'var Z = g:cond ? FuncOne : FuncTwo', --- 72,202 ---- def Test_expr1_trinary_vimscript() # check line continuation var lines =<< trim END var name = 1 ? 'yes' : 'no' assert_equal('yes', name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = v:false ? 'yes' : 'no' assert_equal('no', name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = v:false ? 'yes' : 'no' assert_equal('no', name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = v:false ? # comment 'yes' : # comment 'no' # comment assert_equal('no', name) END ! CheckDefAndScriptSuccess(lines) # check white space lines =<< trim END var name = v:true?1:2 END ! CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''?'' at "?1:2"', 1) ! lines =<< trim END var name = v:true? 1 : 2 END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) ! lines =<< trim END var name = v:true ?1 : 2 END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) ! lines =<< trim END var name = v:true ? 1: 2 END ! CheckDefAndScriptFailure(lines, 'E1004: White space required before and after '':'' at ": 2"', 1) ! lines =<< trim END var name = v:true ? 1 :2 END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) lines =<< trim END var name = 'x' ? 1 : 2 END ! CheckDefAndScriptFailure(lines, 'E1135:', 1) lines =<< trim END var name = [] ? 1 : 2 END ! CheckDefExecAndScriptFailure(lines, 'E745:', 1) lines =<< trim END var name = {} ? 1 : 2 END ! CheckDefExecAndScriptFailure(lines, 'E728:', 1) # check after failure eval_flags is reset lines =<< trim END try eval('0 ? 1: 2') catch endtry assert_equal(v:true, eval(string(v:true))) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END try eval('0 ? 1 :2') catch endtry assert_equal(v:true, eval(string(v:true))) END ! CheckDefAndScriptSuccess(lines) enddef func Test_expr1_trinary_fails() ! call CheckDefAndScriptFailure(["var x = 1 ? 'one'"], "Missing ':' after '?'", 1) let msg = "White space required before and after '?'" ! call CheckDefAndScriptFailure(["var x = 1? 'one' : 'two'"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1 ?'one' : 'two'"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1?'one' : 'two'"], msg, 1) let msg = "White space required before and after ':'" ! call CheckDefAndScriptFailure(["var x = 1 ? 'one': 'two'"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1 ? 'one' :'two'"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1 ? 'one':'two'"], msg, 1) ! ! call CheckDefAndScriptFailure(["var x = 'x' ? 'one' : 'two'"], 'E1135:', 1) ! call CheckDefAndScriptFailure(["var x = 0z1234 ? 'one' : 'two'"], 'E974:', 1) ! call CheckDefExecAndScriptFailure(["var x = [] ? 'one' : 'two'"], 'E745:', 1) ! call CheckDefExecAndScriptFailure(["var x = {} ? 'one' : 'two'"], 'E728:', 1) call CheckDefExecFailure(["var x = false ? "], 'E1097:', 3) + call CheckScriptFailure(['vim9script', "var x = false ? "], 'E15:', 2) call CheckDefExecFailure(["var x = false ? 'one' : "], 'E1097:', 3) + call CheckScriptFailure(['vim9script', "var x = false ? 'one' : "], 'E15:', 2) ! call CheckDefExecAndScriptFailure2(["var x = true ? xxx : 'foo'"], 'E1001:', 'E121:', 1) ! call CheckDefExecAndScriptFailure2(["var x = false ? 'foo' : xxx"], 'E1001:', 'E121:', 1) if has('float') ! call CheckDefAndScriptFailure(["var x = 0.1 ? 'one' : 'two'"], 'E805:', 1) endif " missing argument detected even when common type is used ! call CheckDefAndScriptFailure([ \ 'var X = FuncOne', \ 'var Y = FuncTwo', \ 'var Z = g:cond ? FuncOne : FuncTwo', *************** *** 234,242 **** CheckDefAndScriptSuccess(lines) var msg = "White space required before and after '??'" ! call CheckDefFailure(["var x = 1?? 'one' : 'two'"], msg, 1) ! call CheckDefFailure(["var x = 1 ??'one' : 'two'"], msg, 1) ! call CheckDefFailure(["var x = 1??'one' : 'two'"], msg, 1) enddef def Record(val: any): any --- 226,234 ---- CheckDefAndScriptSuccess(lines) var msg = "White space required before and after '??'" ! call CheckDefAndScriptFailure(["var x = 1?? 'one' : 'two'"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1 ??'one' : 'two'"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1??'one' : 'two'"], msg, 1) enddef def Record(val: any): any *************** *** 297,329 **** def Test_expr2_vimscript() # check line continuation var lines =<< trim END - vim9script var name = 0 || 1 assert_equal(true, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = v:false || v:true || v:false assert_equal(v:true, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = v:false || v:true || v:false assert_equal(v:true, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = v:false || # comment # comment v:true || --- 289,317 ---- def Test_expr2_vimscript() # check line continuation var lines =<< trim END var name = 0 || 1 assert_equal(true, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = v:false || v:true || v:false assert_equal(v:true, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = v:false || v:true || v:false assert_equal(v:true, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = v:false || # comment # comment v:true || *************** *** 331,372 **** v:false # comment assert_equal(v:true, name) END ! CheckScriptSuccess(lines) # check white space lines =<< trim END - vim9script var name = v:true||v:true END ! CheckScriptFailure(lines, 'E1004: White space required before and after ''||'' at "||v:true"', 2) lines =<< trim END - vim9script var name = v:true ||v:true END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script var name = v:true|| v:true END ! CheckScriptFailure(lines, 'E1004:', 2) enddef def Test_expr2_fails() var msg = "White space required before and after '||'" ! call CheckDefFailure(["var x = 1||2"], msg, 1) ! call CheckDefFailure(["var x = 1 ||2"], msg, 1) ! call CheckDefFailure(["var x = 1|| 2"], msg, 1) call CheckDefFailure(["var x = false || "], 'E1097:', 3) call CheckDefFailure(["var x = 1 || xxx"], 'E1001:', 1) ! call CheckDefFailure(["var x = [] || false"], 'E1012:', 1) ! call CheckDefFailure(["if 'yes' || 0", 'echo 0', 'endif'], 'E1012: Type mismatch; expected bool but got string', 1) # TODO: should fail at compile time ! call CheckDefExecFailure(["var x = 3 || 7"], 'E1023:', 1) ! call CheckScriptFailure(["vim9script", "var x = 3 || 7"], 'E1023:', 2) ! call CheckScriptFailure(["vim9script", "var x = [] || false"], 'E745:', 2) enddef " test && --- 319,364 ---- v:false # comment assert_equal(v:true, name) END ! CheckDefAndScriptSuccess(lines) # check white space lines =<< trim END var name = v:true||v:true END ! CheckDefExecAndScriptFailure(lines, 'E1004: White space required before and after ''||'' at "||v:true"', 1) ! lines =<< trim END var name = v:true ||v:true END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) ! lines =<< trim END var name = v:true|| v:true END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) enddef def Test_expr2_fails() var msg = "White space required before and after '||'" ! call CheckDefAndScriptFailure(["var x = 1||2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1 ||2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1|| 2"], msg, 1) call CheckDefFailure(["var x = false || "], 'E1097:', 3) + call CheckScriptFailure(['vim9script', "var x = false || "], 'E15:', 2) + # script does not fail, the second expression is skipped call CheckDefFailure(["var x = 1 || xxx"], 'E1001:', 1) ! ! call CheckDefAndScriptFailure2(["var x = [] || false"], 'E1012:', 'E745:', 1) ! ! call CheckDefAndScriptFailure2(["if 'yes' || 0", 'echo 0', 'endif'], 'E1012: Type mismatch; expected bool but got string', 'E1135: Using a String as a Bool', 1) # TODO: should fail at compile time ! call CheckDefExecAndScriptFailure(["var x = 3 || 7"], 'E1023:', 1) ! ! call CheckDefAndScriptFailure2(["var x = [] || false"], 'E1012: Type mismatch; expected bool but got list', 'E745:', 1) ! enddef " test && *************** *** 413,445 **** def Test_expr3_vimscript() # check line continuation var lines =<< trim END - vim9script var name = 0 && 1 assert_equal(false, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = v:true && v:true && v:true assert_equal(v:true, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = v:true && v:true && v:true assert_equal(v:true, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = v:true && # comment # comment v:true && --- 405,433 ---- def Test_expr3_vimscript() # check line continuation var lines =<< trim END var name = 0 && 1 assert_equal(false, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = v:true && v:true && v:true assert_equal(v:true, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = v:true && v:true && v:true assert_equal(v:true, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = v:true && # comment # comment v:true && *************** *** 447,495 **** v:true assert_equal(v:true, name) END ! CheckScriptSuccess(lines) # check white space lines =<< trim END - vim9script var name = v:true&&v:true END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script var name = v:true &&v:true END ! CheckScriptFailure(lines, 'E1004: White space required before and after ''&&'' at "&&v:true"', 2) lines =<< trim END - vim9script var name = v:true&& v:true END ! CheckScriptFailure(lines, 'E1004:', 2) enddef def Test_expr3_fails() var msg = "White space required before and after '&&'" ! CheckDefFailure(["var x = 1&&2"], msg, 1) ! CheckDefFailure(["var x = 1 &&2"], msg, 1) ! CheckDefFailure(["var x = 1&& 2"], msg, 1) ! CheckDefFailure(["if 'yes' && 0", 'echo 0', 'endif'], 'E1012: Type mismatch; expected bool but got string', 1) ! CheckDefExecFailure(['assert_equal(false, Record(1) && Record(4) && Record(0))'], 'E1023: Using a Number as a Bool: 4', 1) var lines =<< trim END if 3 && true endif END ! CheckDefExecFailure(lines, 'E1023:', 1) lines =<< trim END if 'yes' && true endif END ! CheckDefFailure(lines, 'E1012:', 1) enddef " global variables to use for tests with the "any" type --- 435,483 ---- v:true assert_equal(v:true, name) END ! CheckDefAndScriptSuccess(lines) # check white space lines =<< trim END var name = v:true&&v:true END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) ! lines =<< trim END var name = v:true &&v:true END ! CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''&&'' at "&&v:true"', 1) ! lines =<< trim END var name = v:true&& v:true END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) enddef def Test_expr3_fails() var msg = "White space required before and after '&&'" ! CheckDefAndScriptFailure(["var x = 1&&2"], msg, 1) ! CheckDefAndScriptFailure(["var x = 1 &&2"], msg, 1) ! CheckDefAndScriptFailure(["var x = 1&& 2"], msg, 1) ! g:vals = [] ! CheckDefAndScriptFailure2(["if 'yes' && 0", 'echo 0', 'endif'], 'E1012: Type mismatch; expected bool but got string', 'E1135: Using a String as a Bool', 1) ! CheckDefExecAndScriptFailure(['assert_equal(false, Record(1) && Record(4) && Record(0))'], 'E1023: Using a Number as a Bool: 4', 1) var lines =<< trim END if 3 && true endif END ! CheckDefExecAndScriptFailure(lines, 'E1023:', 1) lines =<< trim END if 'yes' && true endif END ! CheckDefAndScriptFailure2(lines, 'E1012:', 'E1135: Using a String as a Bool', 1) enddef " global variables to use for tests with the "any" type *************** *** 607,624 **** END CheckDefAndScriptSuccess(lines) ! CheckDefFailure(["var x = 'a' == xxx"], 'E1001:', 1) CheckDefFailure(["var x = 'a' == "], 'E1097:', 3) ! CheckDefExecFailure(['var items: any', 'eval 1', 'eval 2', 'if items == []', 'endif'], 'E691:', 4) ! CheckDefExecFailure(['var x: any = "a"', 'echo x == true'], 'E1072: Cannot compare string with bool', 2) ! CheckDefExecFailure(["var x: any = true", 'echo x == ""'], 'E1072: Cannot compare bool with string', 2) ! CheckDefExecFailure(["var x: any = 99", 'echo x == true'], 'E1138', 2) ! CheckDefExecFailure(["var x: any = 'a'", 'echo x == 99'], 'E1030:', 2) for op in ['>', '>=', '<', '<=', '=~', '!~'] ! CheckDefExecFailure([ "var a: any = 'a'", 'var b: any = true', 'echo a ' .. op .. ' b'], 'E1072:', 3) --- 595,613 ---- END CheckDefAndScriptSuccess(lines) ! CheckDefAndScriptFailure2(["var x = 'a' == xxx"], 'E1001:', 'E121:', 1) CheckDefFailure(["var x = 'a' == "], 'E1097:', 3) + CheckScriptFailure(['vim9script', "var x = 'a' == "], 'E15:', 2) ! CheckDefExecAndScriptFailure2(['var items: any', 'eval 1', 'eval 2', 'if items == []', 'endif'], 'E691:', 'E1072:', 4) ! CheckDefExecAndScriptFailure(['var x: any = "a"', 'echo x == true'], 'E1072: Cannot compare string with bool', 2) ! CheckDefExecAndScriptFailure(["var x: any = true", 'echo x == ""'], 'E1072: Cannot compare bool with string', 2) ! CheckDefExecAndScriptFailure2(["var x: any = 99", 'echo x == true'], 'E1138', 'E1072:', 2) ! CheckDefExecAndScriptFailure2(["var x: any = 'a'", 'echo x == 99'], 'E1030:', 'E1072:', 2) for op in ['>', '>=', '<', '<=', '=~', '!~'] ! CheckDefExecAndScriptFailure([ "var a: any = 'a'", 'var b: any = true', 'echo a ' .. op .. ' b'], 'E1072:', 3) *************** *** 877,1066 **** def Test_expr4_vim9script() # check line continuation var lines =<< trim END - vim9script var name = 0 < 1 assert_equal(true, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = 123 # comment != 123 assert_equal(false, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = 123 == 123 assert_equal(true, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var list = [1, 2, 3] var name = list is list assert_equal(true, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var list = [1, 2, 3] var name = list # comment # comment is list assert_equal(true, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var myblob = 0z1234 var name = myblob isnot 0z11 assert_equal(true, name) END ! CheckScriptSuccess(lines) # spot check mismatching types lines =<< trim END - vim9script echo '' == 0 END ! CheckScriptFailure(lines, 'E1072:', 2) lines =<< trim END - vim9script echo v:true > v:false END ! CheckScriptFailure(lines, 'Cannot compare bool with bool', 2) lines =<< trim END - vim9script echo 123 is 123 END ! CheckScriptFailure(lines, 'Cannot use "is" with number', 2) # check missing white space lines =<< trim END - vim9script echo 2>3 END ! CheckScriptFailure(lines, 'E1004: White space required before and after ''>'' at ">3"', 2) lines =<< trim END - vim9script echo 2 >3 END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script echo 2> 3 END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script echo 2!=3 END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script echo 2 !=3 END ! CheckScriptFailure(lines, 'E1004: White space required before and after ''!'' at "!=3"', 2) lines =<< trim END - vim9script echo 2!= 3 END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script echo len('xxx') == 3 END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var line = 'abc' echo line[1] =~ '\w' END ! CheckScriptSuccess(lines) enddef func Test_expr4_fails() let msg = "White space required before and after '>'" ! call CheckDefFailure(["var x = 1>2"], msg, 1) ! call CheckDefFailure(["var x = 1 >2"], msg, 1) ! call CheckDefFailure(["var x = 1> 2"], msg, 1) let msg = "White space required before and after '=='" ! call CheckDefFailure(["var x = 1==2"], msg, 1) ! call CheckDefFailure(["var x = 1 ==2"], msg, 1) ! call CheckDefFailure(["var x = 1== 2"], msg, 1) let msg = "White space required before and after 'is'" ! call CheckDefFailure(["var x = '1'is'2'"], msg, 1) ! call CheckDefFailure(["var x = '1' is'2'"], msg, 1) ! call CheckDefFailure(["var x = '1'is '2'"], msg, 1) let msg = "White space required before and after 'isnot'" ! call CheckDefFailure(["var x = '1'isnot'2'"], msg, 1) ! call CheckDefFailure(["var x = '1' isnot'2'"], msg, 1) ! call CheckDefFailure(["var x = '1'isnot '2'"], msg, 1) ! ! call CheckDefFailure(["var x = 1 is# 2"], 'E15:', 1) ! call CheckDefFailure(["var x = 1 is? 2"], 'E15:', 1) ! call CheckDefFailure(["var x = 1 isnot# 2"], 'E15:', 1) ! call CheckDefFailure(["var x = 1 isnot? 2"], 'E15:', 1) ! ! call CheckDefFailure(["var x = 1 == '2'"], 'Cannot compare number with string', 1) ! call CheckDefFailure(["var x = '1' == 2"], 'Cannot compare string with number', 1) ! call CheckDefFailure(["var x = 1 == RetVoid()"], 'Cannot compare number with void', 1) ! call CheckDefFailure(["var x = RetVoid() == 1"], 'Cannot compare void with number', 1) ! ! call CheckDefFailure(["var x = true > false"], 'Cannot compare bool with bool', 1) ! call CheckDefFailure(["var x = true >= false"], 'Cannot compare bool with bool', 1) ! call CheckDefFailure(["var x = true < false"], 'Cannot compare bool with bool', 1) ! call CheckDefFailure(["var x = true <= false"], 'Cannot compare bool with bool', 1) ! call CheckDefFailure(["var x = true =~ false"], 'Cannot compare bool with bool', 1) ! call CheckDefFailure(["var x = true !~ false"], 'Cannot compare bool with bool', 1) ! call CheckDefFailure(["var x = true is false"], 'Cannot use "is" with bool', 1) ! call CheckDefFailure(["var x = true isnot false"], 'Cannot use "isnot" with bool', 1) ! ! call CheckDefFailure(["var x = v:none is v:null"], 'Cannot use "is" with special', 1) ! call CheckDefFailure(["var x = v:none isnot v:null"], 'Cannot use "isnot" with special', 1) ! call CheckDefFailure(["var x = 123 is 123"], 'Cannot use "is" with number', 1) ! call CheckDefFailure(["var x = 123 isnot 123"], 'Cannot use "isnot" with number', 1) if has('float') ! call CheckDefFailure(["var x = 1.3 is 1.3"], 'Cannot use "is" with float', 1) ! call CheckDefFailure(["var x = 1.3 isnot 1.3"], 'Cannot use "isnot" with float', 1) endif ! call CheckDefFailure(["var x = 0za1 > 0z34"], 'Cannot compare blob with blob', 1) ! call CheckDefFailure(["var x = 0za1 >= 0z34"], 'Cannot compare blob with blob', 1) ! call CheckDefFailure(["var x = 0za1 < 0z34"], 'Cannot compare blob with blob', 1) ! call CheckDefFailure(["var x = 0za1 <= 0z34"], 'Cannot compare blob with blob', 1) ! call CheckDefFailure(["var x = 0za1 =~ 0z34"], 'Cannot compare blob with blob', 1) ! call CheckDefFailure(["var x = 0za1 !~ 0z34"], 'Cannot compare blob with blob', 1) ! ! call CheckDefFailure(["var x = [13] > [88]"], 'Cannot compare list with list', 1) ! call CheckDefFailure(["var x = [13] >= [88]"], 'Cannot compare list with list', 1) ! call CheckDefFailure(["var x = [13] < [88]"], 'Cannot compare list with list', 1) ! call CheckDefFailure(["var x = [13] <= [88]"], 'Cannot compare list with list', 1) ! call CheckDefFailure(["var x = [13] =~ [88]"], 'Cannot compare list with list', 1) ! call CheckDefFailure(["var x = [13] !~ [88]"], 'Cannot compare list with list', 1) ! ! call CheckDefFailure(['var j: job', 'var chan: channel', 'var r = j == chan'], 'Cannot compare job with channel', 3) ! call CheckDefFailure(['var j: job', 'var x: list', 'var r = j == x'], 'Cannot compare job with list', 3) ! call CheckDefFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3) ! call CheckDefFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3) endfunc " test addition, subtraction, concatenation --- 866,1043 ---- def Test_expr4_vim9script() # check line continuation var lines =<< trim END var name = 0 < 1 assert_equal(true, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = 123 # comment != 123 assert_equal(false, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = 123 == 123 assert_equal(true, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var list = [1, 2, 3] var name = list is list assert_equal(true, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var list = [1, 2, 3] var name = list # comment # comment is list assert_equal(true, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var myblob = 0z1234 var name = myblob isnot 0z11 assert_equal(true, name) END ! CheckDefAndScriptSuccess(lines) # spot check mismatching types lines =<< trim END echo '' == 0 END ! CheckDefAndScriptFailure(lines, 'E1072:', 1) lines =<< trim END echo v:true > v:false END ! CheckDefAndScriptFailure(lines, 'Cannot compare bool with bool', 1) lines =<< trim END echo 123 is 123 END ! CheckDefAndScriptFailure(lines, 'Cannot use "is" with number', 1) # check missing white space lines =<< trim END echo 2>3 END ! CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''>'' at ">3"', 1) ! lines =<< trim END echo 2 >3 END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) ! lines =<< trim END echo 2> 3 END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) ! lines =<< trim END echo 2!=3 END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) ! lines =<< trim END echo 2 !=3 END ! CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''!='' at "!=3"', 1) ! lines =<< trim END echo 2!= 3 END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) lines =<< trim END echo len('xxx') == 3 END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var line = 'abc' echo line[1] =~ '\w' END ! CheckDefAndScriptSuccess(lines) enddef func Test_expr4_fails() let msg = "White space required before and after '>'" ! call CheckDefAndScriptFailure(["var x = 1>2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1 >2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1> 2"], msg, 1) let msg = "White space required before and after '=='" ! call CheckDefAndScriptFailure(["var x = 1==2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1 ==2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1== 2"], msg, 1) let msg = "White space required before and after 'is'" ! call CheckDefAndScriptFailure(["var x = '1'is'2'"], msg, 1) ! call CheckDefAndScriptFailure(["var x = '1' is'2'"], msg, 1) ! call CheckDefAndScriptFailure(["var x = '1'is '2'"], msg, 1) let msg = "White space required before and after 'isnot'" ! call CheckDefAndScriptFailure(["var x = '1'isnot'2'"], msg, 1) ! call CheckDefAndScriptFailure(["var x = '1' isnot'2'"], msg, 1) ! call CheckDefAndScriptFailure(["var x = '1'isnot '2'"], msg, 1) ! ! call CheckDefAndScriptFailure(["var x = 1 is# 2"], 'E15:', 1) ! call CheckDefAndScriptFailure(["var x = 1 is? 2"], 'E15:', 1) ! call CheckDefAndScriptFailure(["var x = 1 isnot# 2"], 'E15:', 1) ! call CheckDefAndScriptFailure(["var x = 1 isnot? 2"], 'E15:', 1) ! ! call CheckDefAndScriptFailure(["var x = 1 == '2'"], 'Cannot compare number with string', 1) ! call CheckDefAndScriptFailure(["var x = '1' == 2"], 'Cannot compare string with number', 1) ! call CheckDefAndScriptFailure(["var x = 1 == RetVoid()"], 'Cannot compare number with void', 1) ! call CheckDefAndScriptFailure(["var x = RetVoid() == 1"], 'Cannot compare void with number', 1) ! ! call CheckDefAndScriptFailure(["var x = true > false"], 'Cannot compare bool with bool', 1) ! call CheckDefAndScriptFailure(["var x = true >= false"], 'Cannot compare bool with bool', 1) ! call CheckDefAndScriptFailure(["var x = true < false"], 'Cannot compare bool with bool', 1) ! call CheckDefAndScriptFailure(["var x = true <= false"], 'Cannot compare bool with bool', 1) ! call CheckDefAndScriptFailure(["var x = true =~ false"], 'Cannot compare bool with bool', 1) ! call CheckDefAndScriptFailure(["var x = true !~ false"], 'Cannot compare bool with bool', 1) ! call CheckDefAndScriptFailure(["var x = true is false"], 'Cannot use "is" with bool', 1) ! call CheckDefAndScriptFailure(["var x = true isnot false"], 'Cannot use "isnot" with bool', 1) ! ! call CheckDefAndScriptFailure(["var x = v:none is v:null"], 'Cannot use "is" with special', 1) ! call CheckDefAndScriptFailure(["var x = v:none isnot v:null"], 'Cannot use "isnot" with special', 1) ! call CheckDefAndScriptFailure(["var x = 123 is 123"], 'Cannot use "is" with number', 1) ! call CheckDefAndScriptFailure(["var x = 123 isnot 123"], 'Cannot use "isnot" with number', 1) if has('float') ! call CheckDefAndScriptFailure(["var x = 1.3 is 1.3"], 'Cannot use "is" with float', 1) ! call CheckDefAndScriptFailure(["var x = 1.3 isnot 1.3"], 'Cannot use "isnot" with float', 1) endif ! call CheckDefAndScriptFailure(["var x = 0za1 > 0z34"], 'Cannot compare blob with blob', 1) ! call CheckDefAndScriptFailure(["var x = 0za1 >= 0z34"], 'Cannot compare blob with blob', 1) ! call CheckDefAndScriptFailure(["var x = 0za1 < 0z34"], 'Cannot compare blob with blob', 1) ! call CheckDefAndScriptFailure(["var x = 0za1 <= 0z34"], 'Cannot compare blob with blob', 1) ! call CheckDefAndScriptFailure(["var x = 0za1 =~ 0z34"], 'Cannot compare blob with blob', 1) ! call CheckDefAndScriptFailure(["var x = 0za1 !~ 0z34"], 'Cannot compare blob with blob', 1) ! ! call CheckDefAndScriptFailure(["var x = [13] > [88]"], 'Cannot compare list with list', 1) ! call CheckDefAndScriptFailure(["var x = [13] >= [88]"], 'Cannot compare list with list', 1) ! call CheckDefAndScriptFailure(["var x = [13] < [88]"], 'Cannot compare list with list', 1) ! call CheckDefAndScriptFailure(["var x = [13] <= [88]"], 'Cannot compare list with list', 1) ! call CheckDefAndScriptFailure(["var x = [13] =~ [88]"], 'Cannot compare list with list', 1) ! call CheckDefAndScriptFailure(["var x = [13] !~ [88]"], 'Cannot compare list with list', 1) ! ! call CheckDefAndScriptFailure(['var j: job', 'var chan: channel', 'var r = j == chan'], 'Cannot compare job with channel', 3) ! call CheckDefAndScriptFailure(['var j: job', 'var x: list', 'var r = j == x'], 'Cannot compare job with list', 3) ! call CheckDefAndScriptFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3) ! call CheckDefAndScriptFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3) endfunc " test addition, subtraction, concatenation *************** *** 1132,1276 **** def Test_expr5_vim9script() # check line continuation var lines =<< trim END - vim9script var name = 11 + 77 - 22 assert_equal(66, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = 11 + 77 - 22 assert_equal(66, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = 11 + # comment 77 - # comment 22 assert_equal(66, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = 'one' .. 'two' assert_equal('onetwo', name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script echo 'abc' is# 'abc' END ! CheckScriptFailure(lines, 'E15:', 2) lines =<< trim END - vim9script echo {} - 22 END ! CheckScriptFailure(lines, 'E728:', 2) lines =<< trim END - vim9script echo [] - 33 END ! CheckScriptFailure(lines, 'E745:', 2) lines =<< trim END - vim9script echo 0z1234 - 44 END ! CheckScriptFailure(lines, 'E974:', 2) lines =<< trim END - vim9script echo 'abc' is? 'abc' END ! CheckScriptFailure(lines, 'E15:', 2) lines =<< trim END - vim9script echo 'abc' isnot# 'abc' END ! CheckScriptFailure(lines, 'E15:', 2) lines =<< trim END - vim9script echo 'abc' isnot? 'abc' END ! CheckScriptFailure(lines, 'E15:', 2) # check white space lines =<< trim END - vim9script echo 5+6 END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script echo 5 +6 END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script echo 5+ 6 END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script echo 'a'..'b' END ! CheckScriptFailure(lines, 'E1004: White space required before and after ''..'' at "..''b''"', 2) lines =<< trim END - vim9script echo 'a' ..'b' END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script echo 'a'.. 'b' END ! CheckScriptFailure(lines, 'E1004:', 2) # check invalid string concatenation lines =<< trim END - vim9script echo 'a' .. [1] END ! CheckScriptFailure(lines, 'E730:', 2) lines =<< trim END - vim9script echo 'a' .. {a: 1} END ! CheckScriptFailure(lines, 'E731:', 2) lines =<< trim END - vim9script echo 'a' .. test_void() END ! CheckScriptFailure(lines, 'E908:', 2) lines =<< trim END - vim9script echo 'a' .. 0z33 END ! CheckScriptFailure(lines, 'E976:', 2) lines =<< trim END - vim9script echo 'a' .. function('len') END ! CheckScriptFailure(lines, 'E729:', 2) lines =<< trim END - vim9script new ['']->setline(1) /pattern --- 1109,1237 ---- def Test_expr5_vim9script() # check line continuation var lines =<< trim END var name = 11 + 77 - 22 assert_equal(66, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = 11 + 77 - 22 assert_equal(66, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = 11 + # comment 77 - # comment 22 assert_equal(66, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = 'one' .. 'two' assert_equal('onetwo', name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END echo 'abc' is# 'abc' END ! CheckDefAndScriptFailure(lines, 'E15:', 1) lines =<< trim END echo {} - 22 END ! CheckDefAndScriptFailure2(lines, 'E1036:', 'E728:', 1) lines =<< trim END echo [] - 33 END ! CheckDefAndScriptFailure2(lines, 'E1036:', 'E745:', 1) lines =<< trim END echo 0z1234 - 44 END ! CheckDefAndScriptFailure2(lines, 'E1036', 'E974:', 1) lines =<< trim END echo 'abc' is? 'abc' END ! CheckDefAndScriptFailure(lines, 'E15:', 1) lines =<< trim END echo 'abc' isnot# 'abc' END ! CheckDefAndScriptFailure(lines, 'E15:', 1) lines =<< trim END echo 'abc' isnot? 'abc' END ! CheckDefAndScriptFailure(lines, 'E15:', 1) # check white space lines =<< trim END echo 5+6 END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) lines =<< trim END echo 5 +6 END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) ! lines =<< trim END echo 5+ 6 END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) lines =<< trim END echo 'a'..'b' END ! CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''..'' at "..''b''"', 1) ! lines =<< trim END echo 'a' ..'b' END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) ! lines =<< trim END echo 'a'.. 'b' END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) # check invalid string concatenation lines =<< trim END echo 'a' .. [1] END ! CheckDefAndScriptFailure2(lines, 'E1105:', 'E730:', 1) ! lines =<< trim END echo 'a' .. {a: 1} END ! CheckDefAndScriptFailure2(lines, 'E1105:', 'E731:', 1) ! lines =<< trim END echo 'a' .. test_void() END ! CheckDefAndScriptFailure2(lines, 'E1105:', 'E908:', 1) ! lines =<< trim END echo 'a' .. 0z33 END ! CheckDefAndScriptFailure2(lines, 'E1105:', 'E976:', 1) ! lines =<< trim END echo 'a' .. function('len') END ! CheckDefAndScriptFailure2(lines, 'E1105:', 'E729:', 1) lines =<< trim END new ['']->setline(1) /pattern *************** *** 1278,1284 **** eval 0 bwipe! END ! CheckScriptFailure(lines, "E1004: White space required before and after '/' at \"/pattern") enddef def Test_expr5_vim9script_channel() --- 1239,1245 ---- eval 0 bwipe! END ! CheckDefAndScriptFailure(lines, "E1004: White space required before and after '/' at \"/pattern", 3) enddef def Test_expr5_vim9script_channel() *************** *** 1286,1300 **** MissingFeature 'float' else var lines =<< trim END - vim9script echo 'a' .. test_null_job() END ! CheckScriptFailure(lines, 'E908:', 2) lines =<< trim END - vim9script echo 'a' .. test_null_channel() END ! CheckScriptFailure(lines, 'E908:', 2) endif enddef --- 1247,1259 ---- MissingFeature 'float' else var lines =<< trim END echo 'a' .. test_null_job() END ! CheckDefAndScriptFailure2(lines, 'E1105:', 'E908:', 1) lines =<< trim END echo 'a' .. test_null_channel() END ! CheckDefAndScriptFailure2(lines, 'E1105:', 'E908:', 1) endif enddef *************** *** 1328,1392 **** func Test_expr5_fails() let msg = "White space required before and after '+'" ! call CheckDefFailure(["var x = 1+2"], msg, 1) ! call CheckDefFailure(["var x = 1 +2"], msg, 1) ! call CheckDefFailure(["var x = 1+ 2"], msg, 1) let msg = "White space required before and after '-'" ! call CheckDefFailure(["var x = 1-2"], msg, 1) ! call CheckDefFailure(["var x = 1 -2"], msg, 1) ! call CheckDefFailure(["var x = 1- 2"], msg, 1) let msg = "White space required before and after '..'" ! call CheckDefFailure(["var x = '1'..'2'"], msg, 1) ! call CheckDefFailure(["var x = '1' ..'2'"], msg, 1) ! call CheckDefFailure(["var x = '1'.. '2'"], msg, 1) ! ! call CheckDefFailure(["var x = 0z1122 + 33"], 'E1051:', 1) ! call CheckDefFailure(["var x = 0z1122 + [3]"], 'E1051:', 1) ! call CheckDefFailure(["var x = 0z1122 + 'asd'"], 'E1051:', 1) ! call CheckDefFailure(["var x = 33 + 0z1122"], 'E1051:', 1) ! call CheckDefFailure(["var x = [3] + 0z1122"], 'E1051:', 1) ! call CheckDefFailure(["var x = 'asdf' + 0z1122"], 'E1051:', 1) ! call CheckDefFailure(["var x = 6 + xxx"], 'E1001:', 1) ! ! call CheckDefFailure(["var x = 'a' .. [1]"], 'E1105:', 1) ! call CheckDefFailure(["var x = 'a' .. {a: 1}"], 'E1105:', 1) ! call CheckDefFailure(["var x = 'a' .. test_void()"], 'E1105:', 1) ! call CheckDefFailure(["var x = 'a' .. 0z32"], 'E1105:', 1) ! call CheckDefFailure(["var x = 'a' .. function('len')"], 'E1105:', 1) ! call CheckDefFailure(["var x = 'a' .. function('len', ['a'])"], 'E1105:', 1) ! ! call CheckScriptFailure(['vim9script', 'var x = 1 + v:none'], 'E611:', 2) ! call CheckScriptFailure(['vim9script', 'var x = 1 + v:null'], 'E611:', 2) ! call CheckScriptFailure(['vim9script', 'var x = 1 + v:true'], 'E1138:', 2) ! call CheckScriptFailure(['vim9script', 'var x = 1 + v:false'], 'E1138:', 2) ! call CheckScriptFailure(['vim9script', 'var x = 1 + true'], 'E1138:', 2) ! call CheckScriptFailure(['vim9script', 'var x = 1 + false'], 'E1138:', 2) endfunc func Test_expr5_fails_channel() CheckFeature channel ! call CheckDefFailure(["var x = 'a' .. test_null_job()"], 'E1105:', 1) ! call CheckDefFailure(["var x = 'a' .. test_null_channel()"], 'E1105:', 1) endfunc def Test_expr5_list_add() ! # concatenating two lists with same member types is OK ! var d = {} ! for i in ['a'] + ['b'] ! d = {[i]: 0} ! endfor ! ! # concatenating two lists with different member types results in "any" ! var dany = {} ! for i in ['a'] + [12] ! dany[i] = i ! endfor ! assert_equal({a: 'a', 12: 12}, dany) ! # result of glob() is "any", runtime type check ! var sl: list = glob('*.txt', false, true) + [''] enddef " test multiply, divide, modulo --- 1287,1354 ---- func Test_expr5_fails() let msg = "White space required before and after '+'" ! call CheckDefAndScriptFailure(["var x = 1+2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1 +2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1+ 2"], msg, 1) let msg = "White space required before and after '-'" ! call CheckDefAndScriptFailure(["var x = 1-2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1 -2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1- 2"], msg, 1) let msg = "White space required before and after '..'" ! call CheckDefAndScriptFailure(["var x = '1'..'2'"], msg, 1) ! call CheckDefAndScriptFailure(["var x = '1' ..'2'"], msg, 1) ! call CheckDefAndScriptFailure(["var x = '1'.. '2'"], msg, 1) ! ! call CheckDefAndScriptFailure2(["var x = 0z1122 + 33"], 'E1051:', 'E974:', 1) ! call CheckDefAndScriptFailure2(["var x = 0z1122 + [3]"], 'E1051:', 'E974:', 1) ! call CheckDefAndScriptFailure2(["var x = 0z1122 + 'asd'"], 'E1051:', 'E974:', 1) ! call CheckDefAndScriptFailure2(["var x = 33 + 0z1122"], 'E1051:', 'E974:', 1) ! call CheckDefAndScriptFailure2(["var x = [3] + 0z1122"], 'E1051:', 'E745:', 1) ! call CheckDefAndScriptFailure2(["var x = 'asdf' + 0z1122"], 'E1051:', 'E1030:', 1) ! call CheckDefAndScriptFailure2(["var x = 6 + xxx"], 'E1001:', 'E121:', 1) ! ! call CheckDefAndScriptFailure2(["var x = 'a' .. [1]"], 'E1105:', 'E730:', 1) ! call CheckDefAndScriptFailure2(["var x = 'a' .. {a: 1}"], 'E1105:', 'E731:', 1) ! call CheckDefAndScriptFailure2(["var x = 'a' .. test_void()"], 'E1105:', 'E908:', 1) ! call CheckDefAndScriptFailure2(["var x = 'a' .. 0z32"], 'E1105:', 'E976:', 1) ! call CheckDefAndScriptFailure2(["var x = 'a' .. function('len')"], 'E1105:', 'E729:', 1) ! call CheckDefAndScriptFailure2(["var x = 'a' .. function('len', ['a'])"], 'E1105:', 'E729:', 1) ! ! call CheckDefAndScriptFailure2(['var x = 1 + v:none'], 'E1051:', 'E611:', 1) ! call CheckDefAndScriptFailure2(['var x = 1 + v:null'], 'E1051:', 'E611:', 1) ! call CheckDefAndScriptFailure2(['var x = 1 + v:true'], 'E1051:', 'E1138:', 1) ! call CheckDefAndScriptFailure2(['var x = 1 + v:false'], 'E1051:', 'E1138:', 1) ! call CheckDefAndScriptFailure2(['var x = 1 + true'], 'E1051:', 'E1138:', 1) ! call CheckDefAndScriptFailure2(['var x = 1 + false'], 'E1051:', 'E1138:', 1) endfunc func Test_expr5_fails_channel() CheckFeature channel ! call CheckDefAndScriptFailure2(["var x = 'a' .. test_null_job()"], 'E1105:', 'E908:', 1) ! call CheckDefAndScriptFailure2(["var x = 'a' .. test_null_channel()"], 'E1105:', 'E908:', 1) endfunc def Test_expr5_list_add() ! var lines =<< trim END ! # concatenating two lists with same member types is OK ! var d = {} ! for i in ['a'] + ['b'] ! d = {[i]: 0} ! endfor ! ! # concatenating two lists with different member types results in "any" ! var dany = {} ! for i in ['a'] + [12] ! dany[i] = i ! endfor ! assert_equal({a: 'a', 12: 12}, dany) ! # result of glob() is "any", runtime type check ! var sl: list = glob('*.txt', false, true) + [''] ! END ! CheckDefAndScriptSuccess(lines) enddef " test multiply, divide, modulo *************** *** 1430,1437 **** END CheckDefAndScriptSuccess(lines) ! CheckDefFailure(["var x = 6 * xxx"], 'E1001:', 1) CheckDefFailure(["var d = 6 * "], 'E1097:', 3) CheckDefExecAndScriptFailure(['echo 1 / 0'], 'E1154', 1) CheckDefExecAndScriptFailure(['echo 1 % 0'], 'E1154', 1) --- 1392,1400 ---- END CheckDefAndScriptSuccess(lines) ! CheckDefAndScriptFailure2(["var x = 6 * xxx"], 'E1001:', 'E121:', 1) CheckDefFailure(["var d = 6 * "], 'E1097:', 3) + CheckScriptFailure(['vim9script', "var d = 6 * "], 'E15:', 2) CheckDefExecAndScriptFailure(['echo 1 / 0'], 'E1154', 1) CheckDefExecAndScriptFailure(['echo 1 % 0'], 'E1154', 1) *************** *** 1440,1463 **** def Test_expr6_vim9script() # check line continuation var lines =<< trim END - vim9script var name = 11 * 22 / 3 assert_equal(80, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = 25 % 10 assert_equal(5, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = 25 # comment --- 1403,1423 ---- def Test_expr6_vim9script() # check line continuation var lines =<< trim END var name = 11 * 22 / 3 assert_equal(80, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = 25 % 10 assert_equal(5, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = 25 # comment *************** *** 1465,1497 **** % 10 assert_equal(5, name) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var name = 11 * 22 / 3 assert_equal(80, name) END ! CheckScriptSuccess(lines) # check white space lines =<< trim END - vim9script echo 5*6 END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script echo 5 *6 END ! CheckScriptFailure(lines, 'E1004:', 2) lines =<< trim END - vim9script echo 5* 6 END ! CheckScriptFailure(lines, 'E1004:', 2) enddef def Test_expr6_float() --- 1425,1455 ---- % 10 assert_equal(5, name) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var name = 11 * 22 / 3 assert_equal(80, name) END ! CheckDefAndScriptSuccess(lines) # check white space lines =<< trim END echo 5*6 END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) ! lines =<< trim END echo 5 *6 END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) ! lines =<< trim END echo 5* 6 END ! CheckDefAndScriptFailure(lines, 'E1004:', 1) enddef def Test_expr6_float() *************** *** 1529,1573 **** func Test_expr6_fails() let msg = "White space required before and after '*'" ! call CheckDefFailure(["var x = 1*2"], msg, 1) ! call CheckDefFailure(["var x = 1 *2"], msg, 1) ! call CheckDefFailure(["var x = 1* 2"], msg, 1) let msg = "White space required before and after '/'" ! call CheckDefFailure(["var x = 1/2"], msg, 1) ! call CheckDefFailure(["var x = 1 /2"], msg, 1) ! call CheckDefFailure(["var x = 1/ 2"], msg, 1) let msg = "White space required before and after '%'" ! call CheckDefFailure(["var x = 1%2"], msg, 1) ! call CheckDefFailure(["var x = 1 %2"], msg, 1) ! call CheckDefFailure(["var x = 1% 2"], msg, 1) ! ! call CheckDefFailure(["var x = '1' * '2'"], 'E1036:', 1) ! call CheckDefFailure(["var x = '1' / '2'"], 'E1036:', 1) ! call CheckDefFailure(["var x = '1' % '2'"], 'E1035:', 1) ! ! call CheckDefFailure(["var x = 0z01 * 0z12"], 'E1036:', 1) ! call CheckDefFailure(["var x = 0z01 / 0z12"], 'E1036:', 1) ! call CheckDefFailure(["var x = 0z01 % 0z12"], 'E1035:', 1) ! ! call CheckDefFailure(["var x = [1] * [2]"], 'E1036:', 1) ! call CheckDefFailure(["var x = [1] / [2]"], 'E1036:', 1) ! call CheckDefFailure(["var x = [1] % [2]"], 'E1035:', 1) ! ! call CheckDefFailure(["var x = {one: 1} * {two: 2}"], 'E1036:', 1) ! call CheckDefFailure(["var x = {one: 1} / {two: 2}"], 'E1036:', 1) ! call CheckDefFailure(["var x = {one: 1} % {two: 2}"], 'E1035:', 1) ! call CheckDefFailure(["var x = 0xff[1]"], 'E1107:', 1) if has('float') ! call CheckDefFailure(["var x = 0.7[1]"], 'E1107:', 1) endif endfunc func Test_expr6_float_fails() CheckFeature float ! call CheckDefFailure(["var x = 1.0 % 2"], 'E1035:', 1) endfunc " define here to use old style parsing --- 1487,1531 ---- func Test_expr6_fails() let msg = "White space required before and after '*'" ! call CheckDefAndScriptFailure(["var x = 1*2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1 *2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1* 2"], msg, 1) let msg = "White space required before and after '/'" ! call CheckDefAndScriptFailure(["var x = 1/2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1 /2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1/ 2"], msg, 1) let msg = "White space required before and after '%'" ! call CheckDefAndScriptFailure(["var x = 1%2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1 %2"], msg, 1) ! call CheckDefAndScriptFailure(["var x = 1% 2"], msg, 1) ! ! call CheckDefAndScriptFailure2(["var x = '1' * '2'"], 'E1036:', 'E1030:', 1) ! call CheckDefAndScriptFailure2(["var x = '1' / '2'"], 'E1036:', 'E1030:', 1) ! call CheckDefAndScriptFailure2(["var x = '1' % '2'"], 'E1035:', 'E1030:', 1) ! ! call CheckDefAndScriptFailure2(["var x = 0z01 * 0z12"], 'E1036:', 'E974:', 1) ! call CheckDefAndScriptFailure2(["var x = 0z01 / 0z12"], 'E1036:', 'E974:', 1) ! call CheckDefAndScriptFailure2(["var x = 0z01 % 0z12"], 'E1035:', 'E974:', 1) ! ! call CheckDefAndScriptFailure2(["var x = [1] * [2]"], 'E1036:', 'E745:', 1) ! call CheckDefAndScriptFailure2(["var x = [1] / [2]"], 'E1036:', 'E745:', 1) ! call CheckDefAndScriptFailure2(["var x = [1] % [2]"], 'E1035:', 'E745:', 1) ! ! call CheckDefAndScriptFailure2(["var x = {one: 1} * {two: 2}"], 'E1036:', 'E728:', 1) ! call CheckDefAndScriptFailure2(["var x = {one: 1} / {two: 2}"], 'E1036:', 'E728:', 1) ! call CheckDefAndScriptFailure2(["var x = {one: 1} % {two: 2}"], 'E1035:', 'E728:', 1) ! call CheckDefAndScriptFailure2(["var x = 0xff[1]"], 'E1107:', 'E1062:', 1) if has('float') ! call CheckDefAndScriptFailure2(["var x = 0.7[1]"], 'E1107:', 'E806:', 1) endif endfunc func Test_expr6_float_fails() CheckFeature float ! call CheckDefAndScriptFailure2(["var x = 1.0 % 2"], 'E1035:', 'E804:', 1) endfunc " define here to use old style parsing *************** *** 1605,1614 **** var nr = 234 assert_equal(234, nr) ! CheckDefFailure(["var x = 123"], 'E1010:', 1) CheckDefFailure(["var x = "], 'E1097:', 3) ! CheckDefFailure(["var x = 123"], 'E1068:', 1) ! CheckDefFailure(["var x = 234 assert_equal(234, nr) ! CheckDefAndScriptFailure2(["var x = 123"], 'E1010:', 'E15:', 1) CheckDefFailure(["var x = "], 'E1097:', 3) ! CheckScriptFailure(['vim9script', "var x = "], 'E15:', 2) ! CheckDefAndScriptFailure2(["var x = 123"], 'E1068:', 'E15:', 1) ! CheckDefAndScriptFailure2(["var x = = v:completed_item CheckDefFailure(["var old: list = v:oldfiles"], 'E1012: Type mismatch; expected list but got list', 1) new exec "normal! afoo fo\\" ! CheckDefExecFailure(["var old: dict = v:completed_item"], 'E1012: Type mismatch; expected dict but got dict', 1) bwipe! enddef --- 1633,1642 ---- var compl: dict = v:completed_item CheckDefFailure(["var old: list = v:oldfiles"], 'E1012: Type mismatch; expected list but got list', 1) + CheckScriptFailure(['vim9script', 'v:oldfiles = ["foo"]', "var old: list = v:oldfiles"], 'E1012: Type mismatch; expected list but got list', 3) new exec "normal! afoo fo\\" ! CheckDefExecAndScriptFailure(["var old: dict = v:completed_item"], 'E1012: Type mismatch; expected dict but got dict', 1) bwipe! enddef *************** *** 1710,1720 **** END CheckDefAndScriptSuccess(lines) ! CheckDefFailure(['v:true = true'], 'E46:', 1) ! CheckDefFailure(['v:true = false'], 'E46:', 1) ! CheckDefFailure(['v:false = true'], 'E46:', 1) ! CheckDefFailure(['v:null = 11'], 'E46:', 1) ! CheckDefFailure(['v:none = 22'], 'E46:', 1) enddef def Test_expr7_list() --- 1670,1680 ---- END CheckDefAndScriptSuccess(lines) ! CheckDefAndScriptFailure(['v:true = true'], 'E46:', 1) ! CheckDefAndScriptFailure(['v:true = false'], 'E46:', 1) ! CheckDefAndScriptFailure(['v:false = true'], 'E46:', 1) ! CheckDefAndScriptFailure(['v:null = 11'], 'E46:', 1) ! CheckDefAndScriptFailure(['v:none = 22'], 'E46:', 1) enddef def Test_expr7_list() *************** *** 1747,1782 **** var rangelist: list = range(3) g:rangelist = range(3) ! CheckDefExecFailure(["var x: list = g:rangelist"], 'E1012: Type mismatch; expected list but got list', 1) ! CheckDefFailure(["var x = 1234[3]"], 'E1107:', 1) ! CheckDefExecFailure(["var x = g:anint[3]"], 'E1062:', 1) ! CheckDefFailure(["var x = g:list_mixed[xxx]"], 'E1001:', 1) ! CheckDefFailure(["var x = [1,2,3]"], 'E1069:', 1) ! CheckDefFailure(["var x = [1 ,2, 3]"], 'E1068:', 1) ! CheckDefExecFailure(["echo 1", "var x = [][0]", "echo 3"], 'E684:', 2) ! CheckDefExecFailure(["var x = g:list_mixed['xx']"], 'E1012:', 1) CheckDefFailure(["var x = g:list_mixed["], 'E1097:', 3) CheckDefFailure(["var x = g:list_mixed[0"], 'E1097:', 3) ! CheckDefExecFailure(["var x = g:list_empty[3]"], 'E684:', 1) ! CheckDefExecFailure(["var l: list = [234, 'x']"], 'E1012:', 1) ! CheckDefExecFailure(["var l: list = ['x', 234]"], 'E1012:', 1) ! CheckDefExecFailure(["var l: list = [234, 'x']"], 'E1012:', 1) ! CheckDefExecFailure(["var l: list = ['x', 123]"], 'E1012:', 1) lines =<< trim END - vim9script var datalist: list def Main() datalist += ['x'. enddef Main() END ! CheckScriptFailure(lines, 'E1127:') lines =<< trim END var numbers = [1, 2, 3, 4] --- 1707,1743 ---- var rangelist: list = range(3) g:rangelist = range(3) ! CheckDefExecAndScriptFailure(["var x: list = g:rangelist"], 'E1012: Type mismatch; expected list but got list', 1) ! CheckDefAndScriptFailure2(["var x = 1234[3]"], 'E1107:', 'E1062:', 1) ! CheckDefExecAndScriptFailure(["var x = g:anint[3]"], 'E1062:', 1) ! CheckDefAndScriptFailure2(["var x = g:list_mixed[xxx]"], 'E1001:', 'E121:', 1) ! CheckDefAndScriptFailure(["var x = [1,2,3]"], 'E1069:', 1) ! CheckDefAndScriptFailure(["var x = [1 ,2, 3]"], 'E1068:', 1) ! CheckDefExecAndScriptFailure(["echo 1", "var x = [][0]", "echo 3"], 'E684:', 2) ! CheckDefExecAndScriptFailure2(["var x = g:list_mixed['xx']"], 'E1012:', 'E1030:', 1) CheckDefFailure(["var x = g:list_mixed["], 'E1097:', 3) + CheckScriptFailure(['vim9script', "var x = g:list_mixed["], 'E15:', 2) CheckDefFailure(["var x = g:list_mixed[0"], 'E1097:', 3) ! CheckScriptFailure(['vim9script', "var x = g:list_mixed[0"], 'E111:', 2) ! CheckDefExecAndScriptFailure(["var x = g:list_empty[3]"], 'E684:', 1) ! CheckDefExecAndScriptFailure(["var l: list = [234, 'x']"], 'E1012:', 1) ! CheckDefExecAndScriptFailure(["var l: list = ['x', 234]"], 'E1012:', 1) ! CheckDefExecAndScriptFailure(["var l: list = [234, 'x']"], 'E1012:', 1) ! CheckDefExecAndScriptFailure(["var l: list = ['x', 123]"], 'E1012:', 1) lines =<< trim END var datalist: list def Main() datalist += ['x'. enddef Main() END ! CheckDefAndScriptFailure(lines, 'E1127:') lines =<< trim END var numbers = [1, 2, 3, 4] *************** *** 1791,1797 **** def Test_expr7_list_vim9script() var lines =<< trim END - vim9script var l = [ 11, 22, --- 1752,1757 ---- *************** *** 1808,1867 **** # comment 4] END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var l = [11, 22] assert_equal([11, 22], l) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var l = [11,22] END ! CheckScriptFailure(lines, 'E1069:', 2) lines =<< trim END - vim9script var l = [11 , 22] END ! CheckScriptFailure(lines, 'E1068:', 2) lines =<< trim END - vim9script var l: list = [234, 'x'] END ! CheckScriptFailure(lines, 'E1012:', 2) lines =<< trim END - vim9script var l: list = ['x', 234] END ! CheckScriptFailure(lines, 'E1012:', 2) lines =<< trim END - vim9script var l: list = ['x', 234] END ! CheckScriptFailure(lines, 'E1012:', 2) lines =<< trim END - vim9script var l: list = [234, 'x'] END ! CheckScriptFailure(lines, 'E1012:', 2) lines =<< trim END - vim9script def Failing() job_stop() enddef var list = [Failing] END if has('channel') ! CheckScriptFailure(lines, 'E119:', 1) else ! CheckScriptFailure(lines, 'E117:', 1) endif enddef --- 1768,1822 ---- # comment 4] END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var l = [11, 22] assert_equal([11, 22], l) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var l = [11,22] END ! CheckDefAndScriptFailure(lines, 'E1069:', 1) lines =<< trim END var l = [11 , 22] END ! CheckDefAndScriptFailure(lines, 'E1068:', 1) lines =<< trim END var l: list = [234, 'x'] END ! CheckDefAndScriptFailure(lines, 'E1012:', 1) ! lines =<< trim END var l: list = ['x', 234] END ! CheckDefAndScriptFailure(lines, 'E1012:', 1) ! lines =<< trim END var l: list = ['x', 234] END ! CheckDefAndScriptFailure(lines, 'E1012:', 1) ! lines =<< trim END var l: list = [234, 'x'] END ! CheckDefAndScriptFailure(lines, 'E1012:', 1) lines =<< trim END def Failing() job_stop() enddef var list = [Failing] END if has('channel') ! CheckDefAndScriptFailure(lines, 'E119:', 0) else ! CheckDefAndScriptFailure(lines, 'E117:', 0) endif enddef *************** *** 1930,1963 **** END CheckDefAndScriptSuccess(lines) ! CheckDefFailure(["var Ref = (a)=>a + 1"], 'E1004:') ! CheckDefFailure(["var Ref = (a)=> a + 1"], 'E1004: White space required before and after ''=>'' at "=> a + 1"') ! CheckDefFailure(["var Ref = (a) =>a + 1"], 'E1004:') ! CheckDefFailure(["filter([1, 2], (k,v) => 1)"], 'E1069:', 1) # error is in first line of the lambda ! CheckDefFailure(["var L = (a) => a + b"], 'E1001:', 0) assert_equal('xxxyyy', 'xxx'->((a, b) => a .. b)('yyy')) CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x')"], 'E118:') CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x', 'y')"], 'E118:') ! CheckDefFailure(["echo 'asdf'->((a) => a)(x)"], 'E1001:', 1) ! CheckDefSuccess(['var Fx = (a) => ({k1: 0,', ' k2: 1})']) ! CheckDefFailure(['var Fx = (a) => ({k1: 0', ' k2: 1})'], 'E722:', 2) ! CheckDefFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2) ! CheckDefSuccess(['var Fx = (a) => [0,', ' 1]']) ! CheckDefFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2) # no error for existing script variable when checking for lambda lines =<< trim END - vim9script var name = 0 eval (name + 2) / 3 END ! CheckScriptSuccess(lines) enddef def Test_expr7_lambda_block() --- 1885,1917 ---- END CheckDefAndScriptSuccess(lines) ! CheckDefAndScriptFailure(["var Ref = (a)=>a + 1"], 'E1004:') ! CheckDefAndScriptFailure(["var Ref = (a)=> a + 1"], 'E1004: White space required before and after ''=>'' at "=> a + 1"') ! CheckDefAndScriptFailure(["var Ref = (a) =>a + 1"], 'E1004:') ! CheckDefAndScriptFailure(["filter([1, 2], (k,v) => 1)"], 'E1069:', 1) # error is in first line of the lambda ! CheckDefAndScriptFailure(["var L = (a) => a + b"], 'E1001:', 0) assert_equal('xxxyyy', 'xxx'->((a, b) => a .. b)('yyy')) CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x')"], 'E118:') CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x', 'y')"], 'E118:') ! CheckDefAndScriptFailure2(["echo 'asdf'->((a) => a)(x)"], 'E1001:', 'E121:', 1) ! CheckDefAndScriptSuccess(['var Fx = (a) => ({k1: 0,', ' k2: 1})']) ! CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0', ' k2: 1})'], 'E722:', 2) ! CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2) ! CheckDefAndScriptSuccess(['var Fx = (a) => [0,', ' 1]']) ! CheckDefAndScriptFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2) # no error for existing script variable when checking for lambda lines =<< trim END var name = 0 eval (name + 2) / 3 END ! CheckDefAndScriptSuccess(lines) enddef def Test_expr7_lambda_block() *************** *** 2009,2020 **** CheckDefAndScriptFailure(lines, 'E1171', 1) # line nr is function start lines =<< trim END - vim9script var Func = (nr: number): int => { var ll =<< ENDIT nothing END ! CheckScriptFailure(lines, 'E1145: Missing heredoc end marker: ENDIT', 2) enddef def NewLambdaWithComments(): func --- 1963,1974 ---- CheckDefAndScriptFailure(lines, 'E1171', 1) # line nr is function start lines =<< trim END var Func = (nr: number): int => { var ll =<< ENDIT nothing END ! CheckDefFailure(lines, 'E1145: Missing heredoc end marker: ENDIT', 0) ! CheckScriptFailure(['vim9script'] + lines, 'E1145: Missing heredoc end marker: ENDIT', 2) enddef def NewLambdaWithComments(): func *************** *** 2099,2127 **** CheckDefAndScriptFailure(["var Ref = (a) =>a + 1"], 'E1004: White space required before and after ''=>'' at " =>a + 1"') ! CheckDefFailure(["var Ref: func(number): number = (a: number): string => 'x'"], 'E1012:') ! CheckDefFailure(["var Ref: func(number): string = (a: number): string => 99"], 'E1012:') ! CheckDefFailure(["filter([1, 2], (k,v) => 1)"], 'E1069:', 1) # error is in first line of the lambda ! CheckDefFailure(["var L = (a) -> a + b"], 'E1001:', 1) ! # TODO: ->(lambda)() doesn't work yet ! # assert_equal('xxxyyy', 'xxx'->((a, b) => a .. b)('yyy')) ! # CheckDefExecFailure(["var s = 'asdf'->{a -> a}('x')"], ! # 'E1106: One argument too many') ! # CheckDefExecFailure(["var s = 'asdf'->{a -> a}('x', 'y')"], ! # 'E1106: 2 arguments too many') ! # CheckDefFailure(["echo 'asdf'->{a -> a}(x)"], 'E1001:', 1) ! CheckDefFailure(['var Fx = (a) => ({k1: 0', ' k2: 1})'], 'E722:', 2) ! CheckDefFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2) ! CheckDefFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2) enddef def Test_expr7_lambda_vim9script() var lines =<< trim END vim9script var v = 10->((a) => --- 2053,2081 ---- CheckDefAndScriptFailure(["var Ref = (a) =>a + 1"], 'E1004: White space required before and after ''=>'' at " =>a + 1"') ! CheckDefAndScriptFailure(["var Ref: func(number): number = (a: number): string => 'x'"], 'E1012:') ! CheckDefAndScriptFailure(["var Ref: func(number): string = (a: number): string => 99"], 'E1012:') ! CheckDefAndScriptFailure(["filter([1, 2], (k,v) => 1)"], 'E1069:', 1) # error is in first line of the lambda ! CheckDefAndScriptFailure2(["var L = (a) -> a + b"], 'E1001:', 'E121:', 1) ! assert_equal('xxxyyy', 'xxx'->((a, b) => a .. b)('yyy')) ! CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x')"], ! 'E118: Too many arguments for function:') ! CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x', 'y')"], ! 'E118: Too many arguments for function:') ! CheckDefFailure(["echo 'asdf'->((a) => a)(x)"], 'E1001:', 1) ! CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0', ' k2: 1})'], 'E722:', 2) ! CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2) ! CheckDefAndScriptFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2) enddef def Test_expr7_lambda_vim9script() + # TODO: make this work in a :def function var lines =<< trim END vim9script var v = 10->((a) => *************** *** 2134,2148 **** # nested lambda with line breaks lines =<< trim END - vim9script search('"', 'cW', 0, 0, () => synstack('.', col('.')) ->map((_, v) => synIDattr(v, 'name'))->len()) END ! CheckScriptSuccess(lines) enddef ! def Test_epxr7_funcref() var lines =<< trim END def RetNumber(): number return 123 --- 2088,2101 ---- # nested lambda with line breaks lines =<< trim END search('"', 'cW', 0, 0, () => synstack('.', col('.')) ->map((_, v) => synIDattr(v, 'name'))->len()) END ! CheckDefAndScriptSuccess(lines) enddef ! def Test_expr7_funcref() var lines =<< trim END def RetNumber(): number return 123 *************** *** 2239,2273 **** CheckDefAndScriptFailure(["var x = 'a' .. #{a: 1}"], 'E1170:', 1) CheckDefAndScriptFailure(["var x = true ? #{a: 1}"], 'E1170:', 1) ! CheckDefFailure(["var x = {a:8}"], 'E1069:', 1) ! CheckDefFailure(["var x = {a : 8}"], 'E1068:', 1) ! CheckDefFailure(["var x = {a :8}"], 'E1068:', 1) ! CheckDefFailure(["var x = {a: 8 , b: 9}"], 'E1068:', 1) ! CheckDefFailure(["var x = {a: 1,b: 2}"], 'E1069:', 1) ! CheckDefFailure(["var x = {xxx}"], 'E720:', 1) ! CheckDefFailure(["var x = {xxx: 1", "var y = 2"], 'E722:', 2) CheckDefFailure(["var x = {xxx: 1,"], 'E723:', 2) ! CheckDefFailure(["var x = {['a']: xxx}"], 'E1001:', 1) ! CheckDefFailure(["var x = {a: 1, a: 2}"], 'E721:', 1) ! CheckDefExecFailure(["var x = g:anint.member"], 'E715:', 1) ! CheckDefExecFailure(["var x = g:dict_empty.member"], 'E716:', 1) ! ! CheckDefExecFailure(['var x: dict = {a: 234, b: "1"}'], 'E1012:', 1) ! CheckDefExecFailure(['var x: dict = {a: "x", b: 134}'], 'E1012:', 1) ! CheckDefExecFailure(['var x: dict = {a: 234, b: "1"}'], 'E1012:', 1) ! CheckDefExecFailure(['var x: dict = {a: "x", b: 134}'], 'E1012:', 1) # invalid types for the key ! CheckDefFailure(["var x = {[[1, 2]]: 0}"], 'E1105:', 1) CheckDefFailure(['var x = ({'], 'E723:', 2) ! CheckDefExecFailure(['{}[getftype("file")]'], 'E716: Key not present in Dictionary: ""', 1) enddef def Test_expr7_dict_vim9script() var lines =<< trim END - vim9script var d = { ['one']: 1, --- 2192,2227 ---- CheckDefAndScriptFailure(["var x = 'a' .. #{a: 1}"], 'E1170:', 1) CheckDefAndScriptFailure(["var x = true ? #{a: 1}"], 'E1170:', 1) ! CheckDefAndScriptFailure(["var x = {a:8}"], 'E1069:', 1) ! CheckDefAndScriptFailure(["var x = {a : 8}"], 'E1068:', 1) ! CheckDefAndScriptFailure(["var x = {a :8}"], 'E1068:', 1) ! CheckDefAndScriptFailure(["var x = {a: 8 , b: 9}"], 'E1068:', 1) ! CheckDefAndScriptFailure(["var x = {a: 1,b: 2}"], 'E1069:', 1) ! CheckDefAndScriptFailure(["var x = {xxx}"], 'E720:', 1) ! CheckDefAndScriptFailure(["var x = {xxx: 1", "var y = 2"], 'E722:', 2) CheckDefFailure(["var x = {xxx: 1,"], 'E723:', 2) ! CheckScriptFailure(['vim9script', "var x = {xxx: 1,"], 'E723:', 2) ! CheckDefAndScriptFailure2(["var x = {['a']: xxx}"], 'E1001:', 'E121:', 1) ! CheckDefAndScriptFailure(["var x = {a: 1, a: 2}"], 'E721:', 1) ! CheckDefExecAndScriptFailure2(["var x = g:anint.member"], 'E715:', 'E15:', 1) ! CheckDefExecAndScriptFailure(["var x = g:dict_empty.member"], 'E716:', 1) ! ! CheckDefExecAndScriptFailure(['var x: dict = {a: 234, b: "1"}'], 'E1012:', 1) ! CheckDefExecAndScriptFailure(['var x: dict = {a: "x", b: 134}'], 'E1012:', 1) ! CheckDefExecAndScriptFailure(['var x: dict = {a: 234, b: "1"}'], 'E1012:', 1) ! CheckDefExecAndScriptFailure(['var x: dict = {a: "x", b: 134}'], 'E1012:', 1) # invalid types for the key ! CheckDefAndScriptFailure2(["var x = {[[1, 2]]: 0}"], 'E1105:', 'E730:', 1) CheckDefFailure(['var x = ({'], 'E723:', 2) ! CheckScriptFailure(['vim9script', 'var x = ({'], 'E723:', 2) ! CheckDefExecAndScriptFailure(['{}[getftype("file")]'], 'E716: Key not present in Dictionary: ""', 1) enddef def Test_expr7_dict_vim9script() var lines =<< trim END var d = { ['one']: 1, *************** *** 2289,2428 **** var dd = {k: 123->len()} assert_equal(3, dd.k) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var d = { ["one"]: "one", ["two"]: "two", } assert_equal({one: 'one', two: 'two'}, d) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var d = {one: 1, two: 2, } assert_equal({one: 1, two: 2}, d) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var d = {one:1, two: 2} END ! CheckScriptFailure(lines, 'E1069:', 2) lines =<< trim END - vim9script var d = {one: 1,two: 2} END ! CheckScriptFailure(lines, 'E1069:', 2) lines =<< trim END - vim9script var d = {one : 1} END ! CheckScriptFailure(lines, 'E1068:', 2) lines =<< trim END - vim9script var d = {one:1} END ! CheckScriptFailure(lines, 'E1069:', 2) lines =<< trim END - vim9script var d = {one: 1 , two: 2} END ! CheckScriptFailure(lines, 'E1068:', 2) lines =<< trim END - vim9script var l: dict = {a: 234, b: 'x'} END ! CheckScriptFailure(lines, 'E1012:', 2) lines =<< trim END - vim9script var l: dict = {a: 'x', b: 234} END ! CheckScriptFailure(lines, 'E1012:', 2) lines =<< trim END - vim9script var l: dict = {a: 'x', b: 234} END ! CheckScriptFailure(lines, 'E1012:', 2) lines =<< trim END - vim9script var l: dict = {a: 234, b: 'x'} END ! CheckScriptFailure(lines, 'E1012:', 2) lines =<< trim END - vim9script var d = {['a']: 234, ['b': 'x'} END ! CheckScriptFailure(lines, 'E1139:', 2) lines =<< trim END - vim9script def Func() var d = {['a']: 234, ['b': 'x'} enddef defcompile END ! CheckScriptFailure(lines, 'E1139:', 1) lines =<< trim END - vim9script var d = {'a': END ! CheckScriptFailure(lines, 'E15:', 2) lines =<< trim END - vim9script def Func() var d = {'a': enddef defcompile END ! CheckScriptFailure(lines, 'E723:', 1) lines =<< trim END - vim9script def Failing() job_stop() enddef var dict = {name: Failing} END if has('channel') ! CheckScriptFailure(lines, 'E119:', 1) else ! CheckScriptFailure(lines, 'E117:', 1) endif enddef let g:oneString = 'one' def Test_expr_member() ! assert_equal(1, g:dict_one.one) ! var d: dict = g:dict_one ! assert_equal(1, d['one']) ! assert_equal(1, d[ ! 'one' ! ]) ! assert_equal(1, d ! .one) ! d = {1: 1, _: 2} ! assert_equal(1, d ! .1) ! assert_equal(2, d ! ._) ! ! # getting the one member should clear the dict after getting the item ! assert_equal('one', {one: 'one'}.one) ! assert_equal('one', {one: 'one'}[g:oneString]) ! ! CheckDefFailure(["var x = g:dict_one.#$!"], 'E1002:', 1) ! CheckDefExecFailure(["var d: dict", "echo d['a']"], 'E716:', 2) ! CheckDefExecFailure(["var d: dict", "d = g:list_empty"], 'E1012: Type mismatch; expected dict but got list', 2) enddef def Test_expr7_any_index_slice() --- 2243,2376 ---- var dd = {k: 123->len()} assert_equal(3, dd.k) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var d = { ["one"]: "one", ["two"]: "two", } assert_equal({one: 'one', two: 'two'}, d) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var d = {one: 1, two: 2, } assert_equal({one: 1, two: 2}, d) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var d = {one:1, two: 2} END ! CheckDefAndScriptFailure(lines, 'E1069:', 1) lines =<< trim END var d = {one: 1,two: 2} END ! CheckDefAndScriptFailure(lines, 'E1069:', 1) lines =<< trim END var d = {one : 1} END ! CheckDefAndScriptFailure(lines, 'E1068:', 1) lines =<< trim END var d = {one:1} END ! CheckDefAndScriptFailure(lines, 'E1069:', 1) lines =<< trim END var d = {one: 1 , two: 2} END ! CheckDefAndScriptFailure(lines, 'E1068:', 1) lines =<< trim END var l: dict = {a: 234, b: 'x'} END ! CheckDefAndScriptFailure(lines, 'E1012:', 1) ! lines =<< trim END var l: dict = {a: 'x', b: 234} END ! CheckDefAndScriptFailure(lines, 'E1012:', 1) ! lines =<< trim END var l: dict = {a: 'x', b: 234} END ! CheckDefAndScriptFailure(lines, 'E1012:', 1) ! lines =<< trim END var l: dict = {a: 234, b: 'x'} END ! CheckDefAndScriptFailure(lines, 'E1012:', 1) lines =<< trim END var d = {['a']: 234, ['b': 'x'} END ! CheckDefAndScriptFailure(lines, 'E1139:', 1) ! lines =<< trim END def Func() var d = {['a']: 234, ['b': 'x'} enddef defcompile END ! CheckDefAndScriptFailure(lines, 'E1139:', 0) ! lines =<< trim END var d = {'a': END ! CheckDefFailure(lines, 'E723:', 2) ! CheckScriptFailure(['vim9script'] + lines, 'E15:', 2) ! lines =<< trim END def Func() var d = {'a': enddef defcompile END ! CheckDefAndScriptFailure(lines, 'E723:', 0) lines =<< trim END def Failing() job_stop() enddef var dict = {name: Failing} END if has('channel') ! CheckDefAndScriptFailure(lines, 'E119:', 0) else ! CheckDefAndScriptFailure(lines, 'E117:', 1) endif enddef let g:oneString = 'one' def Test_expr_member() ! var lines =<< trim END ! assert_equal(1, g:dict_one.one) ! var d: dict = g:dict_one ! assert_equal(1, d['one']) ! assert_equal(1, d[ ! 'one' ! ]) ! assert_equal(1, d ! .one) ! d = {1: 1, _: 2} ! assert_equal(1, d ! .1) ! assert_equal(2, d ! ._) ! ! # getting the one member should clear the dict after getting the item ! assert_equal('one', {one: 'one'}.one) ! assert_equal('one', {one: 'one'}[g:oneString]) ! END ! CheckDefAndScriptSuccess(lines) ! ! CheckDefAndScriptFailure2(["var x = g:dict_one.#$!"], 'E1002:', 'E15:', 1) ! CheckDefExecAndScriptFailure(["var d: dict", "echo d['a']"], 'E716:', 2) ! CheckDefExecAndScriptFailure(["var d: dict", "d = g:list_empty"], 'E1012: Type mismatch; expected dict but got list', 2) enddef def Test_expr7_any_index_slice() *************** *** 2518,2540 **** assert_equal(2, g:testdict['b']) END ! CheckDefSuccess(lines) ! CheckScriptSuccess(['vim9script'] + lines) ! CheckDefExecFailure(['echo g:testblob[2]'], 'E979:', 1) ! CheckScriptFailure(['vim9script', 'echo g:testblob[2]'], 'E979:', 2) ! CheckDefExecFailure(['echo g:testblob[-3]'], 'E979:', 1) ! CheckScriptFailure(['vim9script', 'echo g:testblob[-3]'], 'E979:', 2) ! ! CheckDefExecFailure(['echo g:testlist[4]'], 'E684: list index out of range: 4', 1) ! CheckScriptFailure(['vim9script', 'echo g:testlist[4]'], 'E684:', 2) ! CheckDefExecFailure(['echo g:testlist[-5]'], 'E684:', 1) ! CheckScriptFailure(['vim9script', 'echo g:testlist[-5]'], 'E684: list index out of range: -5', 2) ! ! CheckDefExecFailure(['echo g:testdict["a" : "b"]'], 'E719:', 1) ! CheckScriptFailure(['vim9script', 'echo g:testdict["a" : "b"]'], 'E719:', 2) ! CheckDefExecFailure(['echo g:testdict[1]'], 'E716:', 1) ! CheckScriptFailure(['vim9script', 'echo g:testdict[1]'], 'E716:', 2) unlet g:teststring unlet g:testblob --- 2466,2481 ---- assert_equal(2, g:testdict['b']) END ! CheckDefAndScriptSuccess(lines) ! ! CheckDefExecAndScriptFailure(['echo g:testblob[2]'], 'E979:', 1) ! CheckDefExecAndScriptFailure(['echo g:testblob[-3]'], 'E979:', 1) ! CheckDefExecAndScriptFailure(['echo g:testlist[4]'], 'E684: list index out of range: 4', 1) ! CheckDefExecAndScriptFailure(['echo g:testlist[-5]'], 'E684:', 1) ! ! CheckDefExecAndScriptFailure(['echo g:testdict["a" : "b"]'], 'E719:', 1) ! CheckDefExecAndScriptFailure(['echo g:testdict[1]'], 'E716:', 1) unlet g:teststring unlet g:testblob *************** *** 2543,2549 **** def Test_expr_member_vim9script() var lines =<< trim END - vim9script var d = {one: 'one', two: 'two', --- 2484,2489 ---- *************** *** 2560,2569 **** 'one' ]) END ! CheckScriptSuccess(lines) lines =<< trim END - vim9script var l = [1, 2, 3, 4 --- 2500,2508 ---- 'one' ]) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var l = [1, 2, 3, 4 *************** *** 2581,2587 **** : ]) END ! CheckScriptSuccess(lines) enddef def SetSomeVar() --- 2520,2526 ---- : ]) END ! CheckDefAndScriptSuccess(lines) enddef def SetSomeVar() *************** *** 2589,2676 **** enddef def Test_expr7_option() ! # option ! set ts=11 ! assert_equal(11, &ts) ! &ts = 9 ! assert_equal(9, &ts) ! set ts=8 ! set grepprg=some\ text ! assert_equal('some text', &grepprg) ! &grepprg = test_null_string() ! assert_equal('', &grepprg) ! set grepprg& ! ! # check matching type ! var bval: bool = &tgc ! var nval: number = &ts ! var sval: string = &path ! ! # check v_lock is cleared (requires using valgrind, doesn't always show) ! SetSomeVar() ! b:someVar = 0 ! unlet b:someVar enddef def Test_expr7_environment() ! # environment variable ! assert_equal('testvar', $TESTVAR) ! assert_equal('', $ASDF_ASD_XXX) ! CheckDefFailure(["var x = $$$"], 'E1002:', 1) enddef def Test_expr7_register() ! @a = 'register a' ! assert_equal('register a', @a) ! var fname = expand('%') ! assert_equal(fname, @%) ! feedkeys(":echo 'some'\", "xt") ! assert_equal("echo 'some'", @:) ! normal axyz ! assert_equal("xyz", @.) ! CheckDefFailure(["@. = 'yes'"], 'E354:', 1) ! @/ = 'slash' ! assert_equal('slash', @/) ! @= = 'equal' ! assert_equal('equal', @=) enddef def Test_expr7_namespace() ! g:some_var = 'some' ! assert_equal('some', get(g:, 'some_var')) ! assert_equal('some', get(g:, 'some_var', 'xxx')) ! assert_equal('xxx', get(g:, 'no_var', 'xxx')) ! unlet g:some_var ! ! b:some_var = 'some' ! assert_equal('some', get(b:, 'some_var')) ! assert_equal('some', get(b:, 'some_var', 'xxx')) ! assert_equal('xxx', get(b:, 'no_var', 'xxx')) ! unlet b:some_var ! ! w:some_var = 'some' ! assert_equal('some', get(w:, 'some_var')) ! assert_equal('some', get(w:, 'some_var', 'xxx')) ! assert_equal('xxx', get(w:, 'no_var', 'xxx')) ! unlet w:some_var ! ! t:some_var = 'some' ! assert_equal('some', get(t:, 'some_var')) ! assert_equal('some', get(t:, 'some_var', 'xxx')) ! assert_equal('xxx', get(t:, 'no_var', 'xxx')) ! unlet t:some_var ! ! # check using g: in a for loop more than DO_NOT_FREE_CNT times ! for i in range(100000) ! if has_key(g:, 'does-not-exist') ! endif ! endfor enddef def Test_expr7_parens() --- 2528,2628 ---- enddef def Test_expr7_option() ! var lines =<< trim END ! # option ! set ts=11 ! assert_equal(11, &ts) ! &ts = 9 ! assert_equal(9, &ts) ! set ts=8 ! set grepprg=some\ text ! assert_equal('some text', &grepprg) ! &grepprg = test_null_string() ! assert_equal('', &grepprg) ! set grepprg& ! ! # check matching type ! var bval: bool = &tgc ! var nval: number = &ts ! var sval: string = &path ! ! # check v_lock is cleared (requires using valgrind, doesn't always show) ! SetSomeVar() ! b:someVar = 0 ! unlet b:someVar ! END ! CheckDefAndScriptSuccess(lines) enddef def Test_expr7_environment() ! var lines =<< trim END ! # environment variable ! assert_equal('testvar', $TESTVAR) ! assert_equal('', $ASDF_ASD_XXX) ! END ! CheckDefAndScriptSuccess(lines) ! CheckDefAndScriptFailure2(["var x = $$$"], 'E1002:', 'E15:', 1) enddef def Test_expr7_register() ! var lines =<< trim END ! @a = 'register a' ! assert_equal('register a', @a) ! var fname = expand('%') ! assert_equal(fname, @%) ! feedkeys(":echo 'some'\", "xt") ! assert_equal("echo 'some'", @:) ! normal axyz ! assert_equal("xyz", @.) ! @/ = 'slash' ! assert_equal('slash', @/) ! @= = 'equal' ! assert_equal('equal', @=) ! END ! CheckDefAndScriptSuccess(lines) ! ! CheckDefAndScriptFailure2(["@. = 'yes'"], 'E354:', 'E488:', 1) enddef def Test_expr7_namespace() ! var lines =<< trim END ! g:some_var = 'some' ! assert_equal('some', get(g:, 'some_var')) ! assert_equal('some', get(g:, 'some_var', 'xxx')) ! assert_equal('xxx', get(g:, 'no_var', 'xxx')) ! unlet g:some_var ! ! b:some_var = 'some' ! assert_equal('some', get(b:, 'some_var')) ! assert_equal('some', get(b:, 'some_var', 'xxx')) ! assert_equal('xxx', get(b:, 'no_var', 'xxx')) ! unlet b:some_var ! ! w:some_var = 'some' ! assert_equal('some', get(w:, 'some_var')) ! assert_equal('some', get(w:, 'some_var', 'xxx')) ! assert_equal('xxx', get(w:, 'no_var', 'xxx')) ! unlet w:some_var ! ! t:some_var = 'some' ! assert_equal('some', get(t:, 'some_var')) ! assert_equal('some', get(t:, 'some_var', 'xxx')) ! assert_equal('xxx', get(t:, 'no_var', 'xxx')) ! unlet t:some_var ! ! # check using g: in a for loop more than DO_NOT_FREE_CNT times ! for i in range(100000) ! if has_key(g:, 'does-not-exist') ! endif ! endfor ! END ! CheckDefAndScriptSuccess(lines) enddef def Test_expr7_parens() *************** *** 2706,2721 **** enddef def Test_expr7_negate_add() - assert_equal(-99, -99) - assert_equal(-99, - 99) - assert_equal(99, +99) - - var nr = 88 - assert_equal(-88, -nr) - assert_equal(-88, - nr) - assert_equal(88, + nr) - var lines =<< trim END var n = 12 echo ++n END --- 2658,2676 ---- enddef def Test_expr7_negate_add() var lines =<< trim END + assert_equal(-99, -99) + assert_equal(-99, - 99) + assert_equal(99, +99) + + var nr = 88 + assert_equal(-88, -nr) + assert_equal(-88, - nr) + assert_equal(88, + nr) + END + CheckDefAndScriptSuccess(lines) + + lines =<< trim END var n = 12 echo ++n END *************** *** 2779,2790 **** assert_equal('yes', 'yes' ->s:Echo4Arg()) ! CheckDefFailure(["var x = 'yes'->Echo"], 'E107:', 1) ! CheckScriptFailure([ ! "vim9script", ! "var x = substitute ('x', 'x', 'x', 'x')" ! ], 'E121:', 2) ! CheckDefFailure(["var Ref = function('len' [1, 2])"], 'E1123:', 1) var auto_lines =<< trim END def g:some#func(): string --- 2734,2744 ---- assert_equal('yes', 'yes' ->s:Echo4Arg()) ! CheckDefAndScriptFailure(["var x = 'yes'->Echo"], 'E107:', 1) ! CheckDefAndScriptFailure2([ ! "var x = substitute ('x', 'x', 'x', 'x')" ! ], 'E1001:', 'E121:', 1) ! CheckDefAndScriptFailure2(["var Ref = function('len' [1, 2])"], 'E1123:', 'E116:', 1) var auto_lines =<< trim END def g:some#func(): string *************** *** 2803,2838 **** enddef def Test_expr7_method_call() ! new ! setline(1, ['first', 'last']) ! 'second'->append(1) ! "third"->append(2) ! assert_equal(['first', 'second', 'third', 'last'], getline(1, '$')) ! bwipe! ! var bufnr = bufnr() ! var loclist = [{bufnr: bufnr, lnum: 42, col: 17, text: 'wrong'}] ! loclist->setloclist(0) ! assert_equal([{bufnr: bufnr, ! lnum: 42, ! col: 17, ! text: 'wrong', ! pattern: '', ! valid: 1, ! vcol: 0, ! nr: 0, ! type: '', ! module: ''} ! ], getloclist(0)) ! var result: bool = get({n: 0}, 'n', 0) ! assert_equal(false, result) ! assert_equal('+string+', 'string'->((s) => '+' .. s .. '+')()) ! assert_equal('-text-', 'text'->((s, c) => c .. s .. c)('-')) ! var Join = (l) => join(l, 'x') ! assert_equal('axb', ['a', 'b']->(Join)()) enddef --- 2757,2795 ---- enddef def Test_expr7_method_call() ! var lines =<< trim END ! new ! setline(1, ['first', 'last']) ! 'second'->append(1) ! "third"->append(2) ! assert_equal(['first', 'second', 'third', 'last'], getline(1, '$')) ! bwipe! ! var bufnr = bufnr() ! var loclist = [{bufnr: bufnr, lnum: 42, col: 17, text: 'wrong'}] ! loclist->setloclist(0) ! assert_equal([{bufnr: bufnr, ! lnum: 42, ! col: 17, ! text: 'wrong', ! pattern: '', ! valid: 1, ! vcol: 0, ! nr: 0, ! type: '', ! module: ''} ! ], getloclist(0)) ! var result: bool = get({n: 0}, 'n', 0) ! assert_equal(false, result) ! assert_equal('+string+', 'string'->((s) => '+' .. s .. '+')()) ! assert_equal('-text-', 'text'->((s, c) => c .. s .. c)('-')) ! var Join = (l) => join(l, 'x') ! assert_equal('axb', ['a', 'b']->(Join)()) ! END ! CheckDefAndScriptSuccess(lines) enddef *************** *** 2888,2931 **** func Test_expr7_fails() call CheckDefFailure(["var x = (12"], "E1097:", 3) ! call CheckDefFailure(["var x = -'xx'"], "E1030:", 1) ! call CheckDefFailure(["var x = +'xx'"], "E1030:", 1) ! call CheckDefFailure(["var x = -0z12"], "E974:", 1) ! call CheckDefExecFailure(["var x = -[8]"], "E39:", 1) ! call CheckDefExecFailure(["var x = -{a: 1}"], "E39:", 1) ! call CheckDefFailure(["var x = @"], "E1002:", 1) ! call CheckDefFailure(["var x = @<"], "E354:", 1) call CheckDefFailure(["var x = [1, 2"], "E697:", 2) ! call CheckDefFailure(["var x = [notfound]"], "E1001:", 1) ! call CheckDefFailure(["var X = () => 123)"], "E488:", 1) ! call CheckDefFailure(["var x = 123->((x) => x + 5)"], "E107:", 1) ! call CheckDefFailure(["var x = ¬exist"], 'E113:', 1) ! call CheckDefFailure(["&grepprg = [343]"], 'E1012:', 1) ! call CheckDefExecFailure(["echo s:doesnt_exist"], 'E121:', 1) ! call CheckDefExecFailure(["echo g:doesnt_exist"], 'E121:', 1) ! call CheckDefFailure(["echo a:somevar"], 'E1075:', 1) ! call CheckDefFailure(["echo l:somevar"], 'E1075:', 1) ! call CheckDefFailure(["echo x:somevar"], 'E1075:', 1) ! call CheckDefExecFailure(["var x = +g:astring"], 'E1030:', 1) ! call CheckDefExecFailure(["var x = +g:ablob"], 'E974:', 1) ! call CheckDefExecFailure(["var x = +g:alist"], 'E745:', 1) ! call CheckDefExecFailure(["var x = +g:adict"], 'E728:', 1) ! call CheckDefFailure(["var x = ''", "var y = x.memb"], 'E715:', 2) ! call CheckDefFailure(["'yes'->", "Echo()"], 'E488: Trailing characters: ->', 1) call CheckDefExecFailure(["[1, 2->len()"], 'E697:', 2) ! call CheckDefExecFailure(["{a: 1->len()"], 'E723:', 2) call CheckDefExecFailure(["{['a']: 1->len()"], 'E723:', 2) endfunc let g:Funcrefs = [function('add')] --- 2845,2896 ---- func Test_expr7_fails() call CheckDefFailure(["var x = (12"], "E1097:", 3) + call CheckScriptFailure(['vim9script', "var x = (12"], 'E110:', 2) ! call CheckDefAndScriptFailure(["var x = -'xx'"], "E1030:", 1) ! call CheckDefAndScriptFailure(["var x = +'xx'"], "E1030:", 1) ! call CheckDefAndScriptFailure(["var x = -0z12"], "E974:", 1) ! call CheckDefExecAndScriptFailure2(["var x = -[8]"], "E39:", 'E745:', 1) ! call CheckDefExecAndScriptFailure2(["var x = -{a: 1}"], "E39:", 'E728:', 1) ! call CheckDefAndScriptFailure(["var x = @"], "E1002:", 1) ! call CheckDefAndScriptFailure(["var x = @<"], "E354:", 1) call CheckDefFailure(["var x = [1, 2"], "E697:", 2) ! call CheckScriptFailure(['vim9script', "var x = [1, 2"], 'E696:', 2) ! ! call CheckDefAndScriptFailure2(["var x = [notfound]"], "E1001:", 'E121:', 1) ! call CheckDefAndScriptFailure2(["var X = () => 123)"], "E488:", 'E15:', 1) ! call CheckDefAndScriptFailure(["var x = 123->((x) => x + 5)"], "E107:", 1) ! call CheckDefAndScriptFailure(["var x = ¬exist"], 'E113:', 1) ! call CheckDefAndScriptFailure2(["&grepprg = [343]"], 'E1012:', 'E730:', 1) ! call CheckDefExecAndScriptFailure(["echo s:doesnt_exist"], 'E121:', 1) ! call CheckDefExecAndScriptFailure(["echo g:doesnt_exist"], 'E121:', 1) ! call CheckDefAndScriptFailure2(["echo a:somevar"], 'E1075:', 'E121:', 1) ! call CheckDefAndScriptFailure2(["echo l:somevar"], 'E1075:', 'E121:', 1) ! call CheckDefAndScriptFailure2(["echo x:somevar"], 'E1075:', 'E121:', 1) ! call CheckDefExecAndScriptFailure(["var x = +g:astring"], 'E1030:', 1) ! call CheckDefExecAndScriptFailure(["var x = +g:ablob"], 'E974:', 1) ! call CheckDefExecAndScriptFailure(["var x = +g:alist"], 'E745:', 1) ! call CheckDefExecAndScriptFailure(["var x = +g:adict"], 'E728:', 1) ! call CheckDefAndScriptFailure2(["var x = ''", "var y = x.memb"], 'E715:', 'E15:', 2) ! call CheckDefAndScriptFailure2(["'yes'->", "Echo()"], 'E488: Trailing characters: ->', 'E260: Missing name after ->', 1) call CheckDefExecFailure(["[1, 2->len()"], 'E697:', 2) ! call CheckScriptFailure(['vim9script', "[1, 2->len()"], 'E696:', 2) ! ! call CheckDefFailure(["{a: 1->len()"], 'E723:', 2) ! call CheckScriptFailure(['vim9script', "{a: 1->len()"], 'E722:', 2) ! call CheckDefExecFailure(["{['a']: 1->len()"], 'E723:', 2) + call CheckScriptFailure(['vim9script', "{['a']: 1->len()"], 'E722:', 2) endfunc let g:Funcrefs = [function('add')] *************** *** 2939,2974 **** endfunc def Test_expr7_trailing() ! # user function call ! assert_equal(123, g:CallMe(123)) ! assert_equal(123, g:CallMe( 123)) ! assert_equal(123, g:CallMe(123 )) ! assert_equal('yesno', g:CallMe2('yes', 'no')) ! assert_equal('yesno', g:CallMe2( 'yes', 'no' )) ! assert_equal('nothing', g:CallMe('nothing')) ! ! # partial call ! var Part = function('g:CallMe') ! assert_equal('yes', Part('yes')) ! ! # funcref call, using list index ! var l = [] ! g:Funcrefs[0](l, 2) ! assert_equal([2], l) ! ! # method call ! l = [2, 5, 6] ! l->map((k, v) => k + v) ! assert_equal([2, 6, 8], l) ! ! # lambda method call ! l = [2, 5] ! l->((ll) => add(ll, 8))() ! assert_equal([2, 5, 8], l) ! ! # dict member ! var d = {key: 123} ! assert_equal(123, d.key) enddef def Test_expr7_string_subscript() --- 2904,2942 ---- endfunc def Test_expr7_trailing() ! var lines =<< trim END ! # user function call ! assert_equal(123, g:CallMe(123)) ! assert_equal(123, g:CallMe( 123)) ! assert_equal(123, g:CallMe(123 )) ! assert_equal('yesno', g:CallMe2('yes', 'no')) ! assert_equal('yesno', g:CallMe2( 'yes', 'no' )) ! assert_equal('nothing', g:CallMe('nothing')) ! ! # partial call ! var Part = function('g:CallMe') ! assert_equal('yes', Part('yes')) ! ! # funcref call, using list index ! var l = [] ! g:Funcrefs[0](l, 2) ! assert_equal([2], l) ! ! # method call ! l = [2, 5, 6] ! l->map((k, v) => k + v) ! assert_equal([2, 6, 8], l) ! ! # lambda method call ! l = [2, 5] ! l->((ll) => add(ll, 8))() ! assert_equal([2, 5, 8], l) ! ! # dict member ! var d = {key: 123} ! assert_equal(123, d.key) ! END ! CheckDefAndScriptSuccess(lines) enddef def Test_expr7_string_subscript() *************** *** 3022,3109 **** assert_equal('bçdëf', text[1 :]) assert_equal('ábçdëf', text[:]) END ! CheckDefSuccess(lines) ! CheckScriptSuccess(['vim9script'] + lines) lines =<< trim END var d = 'asdf'[1 : END CheckDefFailure(lines, 'E1097:', 3) lines =<< trim END var d = 'asdf'[1 : xxx] END ! CheckDefFailure(lines, 'E1001:', 1) lines =<< trim END var d = 'asdf'[1 : 2 END CheckDefFailure(lines, 'E1097:', 3) lines =<< trim END var d = 'asdf'[1 : 2 echo d END ! CheckDefFailure(lines, 'E111:', 2) lines =<< trim END var d = 'asdf'['1'] echo d END ! CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) lines =<< trim END var d = 'asdf'['1' : 2] echo d END ! CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) lines =<< trim END var d = 'asdf'[1 : '2'] echo d END ! CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) enddef def Test_expr7_list_subscript() var lines =<< trim END ! var list = [0, 1, 2, 3, 4] ! assert_equal(0, list[0]) ! assert_equal(4, list[4]) ! assert_equal(4, list[-1]) ! assert_equal(0, list[-5]) ! ! assert_equal([0, 1, 2, 3, 4], list[0 : 4]) ! assert_equal([0, 1, 2, 3, 4], list[:]) ! assert_equal([1, 2, 3, 4], list[1 :]) ! assert_equal([2, 3, 4], list[2 : -1]) ! assert_equal([4], list[4 : -1]) ! assert_equal([], list[5 : -1]) ! assert_equal([], list[999 : -1]) ! assert_equal([1, 2, 3, 4], list[g:theone : g:thefour]) ! ! assert_equal([0, 1, 2, 3], list[0 : 3]) ! assert_equal([0], list[0 : 0]) ! assert_equal([0, 1, 2, 3, 4], list[0 : -1]) ! assert_equal([0, 1, 2], list[0 : -3]) ! assert_equal([0], list[0 : -5]) ! assert_equal([], list[0 : -6]) ! assert_equal([], list[0 : -99]) END CheckDefAndScriptSuccess(lines) lines = ['var l = [0, 1, 2]', 'echo l[g:astring : g:theone]'] ! CheckDefExecFailure(lines, 'E1012:') ! CheckScriptFailure(['vim9script'] + lines, 'E1030:', 3) lines =<< trim END - vim9script var ld = [] def Func() eval ld[0].key enddef defcompile END ! CheckScriptSuccess(lines) enddef def Test_expr7_dict_subscript() var lines =<< trim END - vim9script var l = [{lnum: 2}, {lnum: 1}] var res = l[0].lnum > l[1].lnum assert_true(res) --- 2990,3081 ---- assert_equal('bçdëf', text[1 :]) assert_equal('ábçdëf', text[:]) END ! CheckDefAndScriptSuccess(lines) lines =<< trim END var d = 'asdf'[1 : END CheckDefFailure(lines, 'E1097:', 3) + CheckScriptFailure(['vim9script'] + lines, 'E15:', 2) + lines =<< trim END var d = 'asdf'[1 : xxx] END ! CheckDefAndScriptFailure2(lines, 'E1001:', 'E121:', 1) ! lines =<< trim END var d = 'asdf'[1 : 2 END CheckDefFailure(lines, 'E1097:', 3) + CheckScriptFailure(['vim9script'] + lines, 'E111:', 2) + lines =<< trim END var d = 'asdf'[1 : 2 echo d END ! CheckDefAndScriptFailure(lines, 'E111:', 2) ! lines =<< trim END var d = 'asdf'['1'] echo d END ! CheckDefAndScriptFailure2(lines, 'E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "1"', 1) ! lines =<< trim END var d = 'asdf'['1' : 2] echo d END ! CheckDefAndScriptFailure2(lines, 'E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "1"', 1) ! lines =<< trim END var d = 'asdf'[1 : '2'] echo d END ! CheckDefAndScriptFailure2(lines, 'E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "2"', 1) enddef def Test_expr7_list_subscript() var lines =<< trim END ! var list = [0, 1, 2, 3, 4] ! assert_equal(0, list[0]) ! assert_equal(4, list[4]) ! assert_equal(4, list[-1]) ! assert_equal(0, list[-5]) ! ! assert_equal([0, 1, 2, 3, 4], list[0 : 4]) ! assert_equal([0, 1, 2, 3, 4], list[:]) ! assert_equal([1, 2, 3, 4], list[1 :]) ! assert_equal([2, 3, 4], list[2 : -1]) ! assert_equal([4], list[4 : -1]) ! assert_equal([], list[5 : -1]) ! assert_equal([], list[999 : -1]) ! assert_equal([1, 2, 3, 4], list[g:theone : g:thefour]) ! ! assert_equal([0, 1, 2, 3], list[0 : 3]) ! assert_equal([0], list[0 : 0]) ! assert_equal([0, 1, 2, 3, 4], list[0 : -1]) ! assert_equal([0, 1, 2], list[0 : -3]) ! assert_equal([0], list[0 : -5]) ! assert_equal([], list[0 : -6]) ! assert_equal([], list[0 : -99]) END CheckDefAndScriptSuccess(lines) lines = ['var l = [0, 1, 2]', 'echo l[g:astring : g:theone]'] ! CheckDefExecAndScriptFailure2(lines, 'E1012:', 'E1030:', 2) lines =<< trim END var ld = [] def Func() eval ld[0].key enddef defcompile END ! CheckDefAndScriptSuccess(lines) enddef def Test_expr7_dict_subscript() var lines =<< trim END var l = [{lnum: 2}, {lnum: 1}] var res = l[0].lnum > l[1].lnum assert_true(res) *************** *** 3117,3179 **** enddef defcompile END ! CheckScriptSuccess(lines) enddef def Test_expr7_subscript_linebreak() ! var range = range( ! 3) ! var l = range ! ->mapnew('string(v:key)') ! assert_equal(['0', '1', '2'], l) ! ! l = range ! ->mapnew('string(v:key)') ! assert_equal(['0', '1', '2'], l) ! ! l = range # comment ! ->mapnew('string(v:key)') ! assert_equal(['0', '1', '2'], l) ! ! l = range ! ! ->mapnew('string(v:key)') ! assert_equal(['0', '1', '2'], l) ! ! l = range ! # comment ! ->mapnew('string(v:key)') ! assert_equal(['0', '1', '2'], l) ! ! assert_equal('1', l[ ! 1]) ! ! var d = {one: 33} ! assert_equal(33, d. ! one) enddef func Test_expr7_trailing_fails() ! call CheckDefFailure(['var l = [2]', 'l->((ll) => add(ll, 8))'], 'E107:', 2) ! call CheckDefFailure(['var l = [2]', 'l->((ll) => add(ll, 8)) ()'], 'E274:', 2) endfunc func Test_expr_fails() ! call CheckDefFailure(["var x = '1'is2"], 'E488:', 1) ! call CheckDefFailure(["var x = '1'isnot2"], 'E488:', 1) - call CheckDefFailure(["CallMe ('yes')"], 'E476:', 1) - call CheckScriptFailure(["CallMe ('yes')"], 'E492:', 1) call CheckDefAndScriptFailure(["CallMe2('yes','no')"], 'E1069:', 1) - call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:', 1) ! call CheckDefFailure(["v:nosuch += 3"], 'E1001:', 1) ! call CheckDefFailure(["var v:statusmsg = ''"], 'E1016: Cannot declare a v: variable:', 1) ! call CheckDefFailure(["var asdf = v:nosuch"], 'E1001:', 1) call CheckDefFailure(["echo len('asdf'"], 'E110:', 2) ! call CheckDefFailure(["echo Func0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], 'E1011:', 1) ! call CheckDefFailure(["echo doesnotexist()"], 'E117:', 1) endfunc " vim: shiftwidth=2 sts=2 expandtab --- 3089,3162 ---- enddef defcompile END ! CheckDefAndScriptSuccess(lines) enddef def Test_expr7_subscript_linebreak() ! var lines =<< trim END ! var range = range( ! 3) ! var l = range ! ->mapnew('string(v:key)') ! assert_equal(['0', '1', '2'], l) ! ! l = range ! ->mapnew('string(v:key)') ! assert_equal(['0', '1', '2'], l) ! ! l = range # comment ! ->mapnew('string(v:key)') ! assert_equal(['0', '1', '2'], l) ! ! l = range ! ! ->mapnew('string(v:key)') ! assert_equal(['0', '1', '2'], l) ! ! l = range ! # comment ! ->mapnew('string(v:key)') ! assert_equal(['0', '1', '2'], l) ! ! assert_equal('1', l[ ! 1]) ! ! var d = {one: 33} ! assert_equal(33, d ! .one) ! END ! CheckDefAndScriptSuccess(lines) ! ! lines =<< trim END ! var d = {one: 33} ! assert_equal(33, d. ! one) ! END ! CheckDefAndScriptFailure2(lines, 'E1127:', 'E116:', 2) enddef func Test_expr7_trailing_fails() ! call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8))'], 'E107:', 2) ! call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8)) ()'], 'E274:', 2) endfunc func Test_expr_fails() ! call CheckDefAndScriptFailure2(["var x = '1'is2"], 'E488:', 'E15:', 1) ! call CheckDefAndScriptFailure2(["var x = '1'isnot2"], 'E488:', 'E15:', 1) ! ! call CheckDefAndScriptFailure2(["CallMe ('yes')"], 'E476:', 'E492:', 1) call CheckDefAndScriptFailure(["CallMe2('yes','no')"], 'E1069:', 1) ! call CheckDefAndScriptFailure2(["v:nosuch += 3"], 'E1001:', 'E121:', 1) ! call CheckDefAndScriptFailure(["var v:statusmsg = ''"], 'E1016: Cannot declare a v: variable:', 1) ! call CheckDefAndScriptFailure2(["var asdf = v:nosuch"], 'E1001:', 'E121:', 1) call CheckDefFailure(["echo len('asdf'"], 'E110:', 2) ! call CheckScriptFailure(['vim9script', "echo len('asdf'"], 'E116:', 2) ! ! call CheckDefAndScriptFailure2(["echo Func0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], 'E1011:', 'E117:', 1) ! call CheckDefAndScriptFailure(["echo doesnotexist()"], 'E117:', 1) endfunc " vim: shiftwidth=2 sts=2 expandtab *** ../vim-8.2.2709/src/version.c 2021-04-04 15:57:08.635155547 +0200 --- src/version.c 2021-04-04 20:10:40.785136669 +0200 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 2710, /**/ -- "I don’t know how to make a screenshot" - Richard Stallman, July 2002 (when asked to send a screenshot of his desktop for unix.se) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///