# HG changeset patch # User Bram Moolenaar # Date 1585860304 -7200 # Node ID ea4f8e7896272be3d13fca113036c1a84c0a68f8 # Parent 4966949f841ab711eef9b5d38c211c0482811a60 patch 8.2.0503: Vim9: some code is not tested Commit: https://github.com/vim/vim/commit/585fea7b98b79f2c6d92fa8a2340e461aff805c8 Author: Bram Moolenaar Date: Thu Apr 2 22:33:21 2020 +0200 patch 8.2.0503: Vim9: some code is not tested Problem: Vim9: some code is not tested. Solution: Add tests. Fix uncovered problems. diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -112,6 +112,8 @@ def Test_assignment() call CheckDefFailure(['¬ex += 3'], 'E113:') call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') call CheckDefFailure(['&path += 3'], 'E1013:') + " test freeing ISN_STOREOPT + call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') &ts = 8 g:inc_counter += 1 @@ -171,6 +173,9 @@ def Test_assignment() let thechannel: channel assert_equal(test_null_channel(), thechannel) endif + + let nr = 1234 | nr = 5678 + assert_equal(5678, nr) enddef func Test_assignment_failure() @@ -253,8 +258,16 @@ enddef func Test_block_failure() call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') + call CheckDefFailure(['}'], 'E1025:') + call CheckDefFailure(['{', 'echo 1'], 'E1026:') endfunc +def Test_cmd_modifier() + tab echo '0' + call CheckDefFailure(['5tab echo 3'], 'E16:') +enddef + + def ReturnString(): string return 'string' enddef @@ -326,6 +339,8 @@ def Test_call_default_args() assert_equal('string', MyDefaultArgs()) assert_equal('one', MyDefaultArgs('one')) assert_fails('call MyDefaultArgs("one", "two")', 'E118:') + + call CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef'], 'E1001:') enddef func Test_call_default_args_from_func() @@ -480,6 +495,16 @@ def Test_try_catch_fails() call CheckDefFailure(['catch'], 'E603:') call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:') call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') + call CheckDefFailure(['finally'], 'E606:') + call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') + call CheckDefFailure(['endtry'], 'E602:') + call CheckDefFailure(['while 1', 'endtry'], 'E170:') + call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') + call CheckDefFailure(['if 2', 'endtry'], 'E171:') + call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') + + call CheckDefFailure(['throw'], 'E471:') + call CheckDefFailure(['throw xxx'], 'E1001:') enddef let s:export_script_lines =<< trim END @@ -939,6 +964,7 @@ def Test_if_elseif_else_fails() call CheckDefFailure(['else'], 'E581:') call CheckDefFailure(['endif'], 'E580:') call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') + call CheckDefFailure(['if true', 'echo 1'], 'E171:') enddef let g:bool_true = v:true @@ -951,6 +977,16 @@ def Test_if_const_expr() endif assert_equal(true, res) + g:glob = 2 + if false + execute('let g:glob = 3') + endif + assert_equal(2, g:glob) + if true + execute('let g:glob = 3') + endif + assert_equal(3, g:glob) + res = false if g:bool_true ? true : false res = true @@ -1092,10 +1128,13 @@ def Test_execute_cmd() execute cmd_first .. cmd_last assert_equal('execute-var-var', getline(1)) bwipe! + + call CheckDefFailure(['execute xxx'], 'E1001:') enddef def Test_echo_cmd() - echo 'something' + echo 'some' + echon 'thing' assert_match('^something$', Screenline(&lines)) let str1 = 'some' @@ -1141,6 +1180,7 @@ def Test_for_loop_fails() call CheckDefFailure(['for i in "text"'], 'E1024:') call CheckDefFailure(['for i in xxx'], 'E1001:') call CheckDefFailure(['endfor'], 'E588:') + call CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') enddef def Test_while_loop() @@ -1166,6 +1206,7 @@ def Test_while_loop_fails() call CheckDefFailure(['if true', 'continue'], 'E586:') call CheckDefFailure(['break'], 'E587:') call CheckDefFailure(['if true', 'break'], 'E587:') + call CheckDefFailure(['while 1', 'echo 3'], 'E170:') enddef def Test_interrupt_loop() @@ -1185,28 +1226,6 @@ def Test_interrupt_loop() assert_true(caught, 'should have caught an exception') enddef -def Test_substitute_cmd() - new - setline(1, 'something') - :substitute(some(other( - assert_equal('otherthing', getline(1)) - bwipe! - - " also when the context is Vim9 script - let lines =<< trim END - vim9script - new - setline(1, 'something') - :substitute(some(other( - assert_equal('otherthing', getline(1)) - bwipe! - END - writefile(lines, 'Xvim9lines') - source Xvim9lines - - delete('Xvim9lines') -enddef - def Test_redef_failure() call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef') so Xdef @@ -1285,4 +1304,27 @@ func Test_internalfunc_arg_error() call delete('Xinvalidarg') endfunc +" Keep this last, it messes up highlighting. +def Test_substitute_cmd() + new + setline(1, 'something') + :substitute(some(other( + assert_equal('otherthing', getline(1)) + bwipe! + + " also when the context is Vim9 script + let lines =<< trim END + vim9script + new + setline(1, 'something') + :substitute(some(other( + assert_equal('otherthing', getline(1)) + bwipe! + END + writefile(lines, 'Xvim9lines') + source Xvim9lines + + delete('Xvim9lines') +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -739,6 +739,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 503, +/**/ 502, /**/ 501, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -4972,6 +4972,7 @@ compile_finally(char_u *arg, cctx_T *cct // Fill in the "end" label in jumps at the end of the blocks. compile_fill_jump_to_end(&scope->se_u.se_try.ts_end_label, cctx); + isn->isn_arg.try.try_finally = instr->ga_len; if (scope->se_u.se_try.ts_catch_label != 0) { // Previous catch without match jumps here @@ -4979,7 +4980,6 @@ compile_finally(char_u *arg, cctx_T *cct isn->isn_arg.jump.jump_where = instr->ga_len; } - isn->isn_arg.try.try_finally = instr->ga_len; // TODO: set index in ts_finally_label jumps return arg; @@ -5350,13 +5350,7 @@ compile_def_function(ufunc_T *ufunc, int line = p; continue; } - if (ea.cmdidx == CMD_let) - { - line = compile_assignment(ea.cmd, &ea, CMD_SIZE, &cctx); - if (line == NULL) - goto erret; - continue; - } + // CMD_let cannot happen, compile_assignment() above is used iemsg("Command from find_ex_command() not handled"); goto erret; } @@ -5464,6 +5458,7 @@ compile_def_function(ufunc_T *ufunc, int } if (line == NULL) goto erret; + line = skipwhite(line); if (cctx.ctx_type_stack.ga_len < 0) {