# HG changeset patch # User Bram Moolenaar # Date 1644874203 -3600 # Node ID 4097434c7c67e537e75beb68c63cae1e9d88929c # Parent 4cbf7a83346814d8bd2fa4d0f7bf360346b1bb0c patch 8.2.4384: Vim9: error message not tested, some code not tested Commit: https://github.com/vim/vim/commit/bc510064027da8024d59460c9c816aea4ffac096 Author: Bram Moolenaar Date: Mon Feb 14 21:19:04 2022 +0000 patch 8.2.4384: Vim9: error message not tested, some code not tested Problem: Vim9: error message not tested, some code not tested. Solution: Add a couple of test cases. Give an error for a command modifier without a command. diff --git a/src/errors.h b/src/errors.h --- a/src/errors.h +++ b/src/errors.h @@ -2791,7 +2791,8 @@ EXTERN char e_missing_argument_type_for_ // E1080 unused EXTERN char e_cannot_unlet_str[] INIT(= N_("E1081: Cannot unlet %s")); -// E1082 unused +EXTERN char e_command_modifier_without_command[] + INIT(= N_("E1082: Command modifier without command")); EXTERN char e_missing_backtick[] INIT(= N_("E1083: Missing backtick")); EXTERN char e_cannot_delete_vim9_script_function_str[] diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -2784,6 +2784,7 @@ parse_command_modifiers( { char_u *p; int starts_with_colon = FALSE; + int vim9script = in_vim9script(); CLEAR_POINTER(cmod); cmod->cmod_flags = sticky_cmdmod_flags; @@ -2819,12 +2820,18 @@ parse_command_modifiers( if (eap->nextcmd != NULL) ++eap->nextcmd; } + if (vim9script && has_cmdmod(cmod, FALSE)) + *errormsg = _(e_command_modifier_without_command); return FAIL; } if (*eap->cmd == NUL) { if (!skip_only) + { ex_pressedreturn = TRUE; + if (vim9script && has_cmdmod(cmod, FALSE)) + *errormsg = _(e_command_modifier_without_command); + } return FAIL; } @@ -2838,7 +2845,7 @@ parse_command_modifiers( // verbose[expr] = 2 // But not: // verbose [a, b] = list - if (in_vim9script()) + if (vim9script) { char_u *s, *n; @@ -2915,7 +2922,7 @@ parse_command_modifiers( #ifdef FEAT_EVAL // in ":filter #pat# cmd" # does not // start a comment - && (!in_vim9script() || VIM_ISWHITE(p[1])) + && (!vim9script || VIM_ISWHITE(p[1])) #endif )) break; @@ -2928,7 +2935,7 @@ parse_command_modifiers( } #ifdef FEAT_EVAL // Avoid that "filter(arg)" is recognized. - if (in_vim9script() && !VIM_ISWHITE(p[-1])) + if (vim9script && !VIM_ISWHITE(p[-1])) break; #endif if (skip_only) diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim --- a/src/testdir/test_vim9_assign.vim +++ b/src/testdir/test_vim9_assign.vim @@ -350,6 +350,11 @@ def Test_assign_unpack() assert_equal(1, v1) assert_equal(2, v2) + var _x: number + [_x, v2] = [6, 7] + assert_equal(6, _x) + assert_equal(7, v2) + var reslist = [] for text in ['aaa {bbb} ccc', 'ddd {eee} fff'] var before: string @@ -1481,6 +1486,7 @@ def Test_assign_dict() v9.CheckDefFailure(["var d: dict = {a: '', b: true}"], 'E1012: Type mismatch; expected dict but got dict', 1) v9.CheckDefFailure(["var d: dict> = {x: {a: '', b: true}}"], 'E1012: Type mismatch; expected dict> but got dict>', 1) + v9.CheckDefFailure(["var d = {x: 1}", "d[1 : 2] = {y: 2}"], 'E1165: Cannot use a range with an assignment: d[1 : 2] =', 2) enddef def Test_assign_dict_unknown_type() diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -1133,6 +1133,16 @@ def Test_useless_command_modifier() silent endtry END v9.CheckDefAndScriptFailure(lines, 'E1176:', 3) + + lines =<< trim END + leftabove + END + v9.CheckDefAndScriptFailure(lines, 'E1082:', 1) + + lines =<< trim END + leftabove # comment + END + v9.CheckDefAndScriptFailure(lines, 'E1082:', 1) enddef def Test_eval_command() diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4384, +/**/ 4383, /**/ 4382, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -2761,13 +2761,7 @@ compile_def_function( cctx.ctx_has_cmdmod = FALSE; if (parse_command_modifiers(&ea, &errormsg, &local_cmdmod, FALSE) == FAIL) - { - if (errormsg != NULL) - goto erret; - // empty line or comment - line = (char_u *)""; - continue; - } + goto erret; generate_cmdmods(&cctx, &local_cmdmod); undo_cmdmod(&local_cmdmod);