changeset 19894:ea4f8e789627 v8.2.0503

patch 8.2.0503: Vim9: some code is not tested Commit: https://github.com/vim/vim/commit/585fea7b98b79f2c6d92fa8a2340e461aff805c8 Author: Bram Moolenaar <Bram@vim.org> 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.
author Bram Moolenaar <Bram@vim.org>
date Thu, 02 Apr 2020 22:45:04 +0200
parents 4966949f841a
children 301db57c7e83
files src/testdir/test_vim9_script.vim src/version.c src/vim9compile.c
diffstat 3 files changed, 70 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -112,6 +112,8 @@ def Test_assignment()
   call CheckDefFailure(['&notex += 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
--- 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,
--- 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)
 	{