diff --git a/src/errors.h b/src/errors.h index 3b15d105fccef3bd7fc1c398bd94c7ea10ed3142..3468ab780c198db679991591db788340a1b71ef2 100644 --- a/src/errors.h +++ b/src/errors.h @@ -650,3 +650,5 @@ EXTERN char e_argument_of_exists_compiled_must_be_literal_string[] INIT(= N_("E1232: Argument of exists_compiled() must be a literal string")); EXTERN char e_exists_compiled_can_only_be_used_in_def_function[] INIT(= N_("E1233: exists_compiled() can only be used in a :def function")); +EXTERN char e_legacy_must_be_followed_by_command[] + INIT(= N_("E1234: legacy must be followed by a command")); diff --git a/src/eval.c b/src/eval.c index 020f55720c5b366d8ec5ac7f6c9e4e33c5bd2efc..12931aff5119c40eab8268b2cf122ffd988ecea3 100644 --- a/src/eval.c +++ b/src/eval.c @@ -2860,8 +2860,7 @@ eval5(char_u **arg, typval_T *rettv, evalarg_T *evalarg) // "++" and "--" on the next line are a separate command. p = eval_next_non_blank(*arg, evalarg, &getnext); op = *p; - concat = op == '.' && (*(p + 1) == '.' - || (current_sctx.sc_version < 2 && !vim9script)); + concat = op == '.' && (*(p + 1) == '.' || in_old_script(2)); if ((op != '+' && op != '-' && !concat) || p[1] == '=' || (p[1] == '.' && p[2] == '=')) break; @@ -3402,7 +3401,7 @@ eval7( if (**arg == '.' && (!isdigit(*(*arg + 1)) #ifdef FEAT_FLOAT - || current_sctx.sc_version < 2 + || in_old_script(2) #endif )) { @@ -5877,7 +5876,7 @@ handle_subscript( || (**arg == '.' && (rettv->v_type == VAR_DICT || (!evaluate && (*arg)[1] != '.' - && current_sctx.sc_version >= 2)))) + && !in_old_script(2))))) { dict_unref(selfdict); if (rettv->v_type == VAR_DICT) diff --git a/src/evalvars.c b/src/evalvars.c index 90dc7fbd1b94c4ab15592809d634432704e7e7ff..2de7999a0f4f2c6912b6a8e9601b5c9590448378 100644 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -774,7 +774,7 @@ ex_let(exarg_T *eap) --argend; expr = skipwhite(argend); concat = expr[0] == '.' - && ((expr[1] == '=' && current_sctx.sc_version < 2) + && ((expr[1] == '=' && in_old_script(2)) || (expr[1] == '.' && expr[2] == '=')); has_assign = *expr == '=' || (vim_strchr((char_u *)"+-*/%", *expr) != NULL && expr[1] == '='); @@ -2932,7 +2932,7 @@ find_var_ht(char_u *name, char_u **varname) // "version" is "v:version" in all scopes if scriptversion < 3. // Same for a few other variables marked with VV_COMPAT. - if (current_sctx.sc_version < 3) + if (in_old_script(3)) { hi = hash_find(&compat_hashtab, name); if (!HASHITEM_EMPTY(hi)) diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 9640c500be1caf6f80257146c46645c664a55e07..d29a93265327a5005692c1297c742a8809d54e91 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -2951,7 +2951,7 @@ parse_command_modifiers( if (ends_excmd2(p, eap->cmd)) { *errormsg = - _(e_vim9cmd_must_be_followed_by_command); + _(e_legacy_must_be_followed_by_command); return FAIL; } cmod->cmod_flags |= CMOD_LEGACY; diff --git a/src/proto/vim9script.pro b/src/proto/vim9script.pro index 1b73e87bba0d1a59b34c34b173694836b3ceb272..97c1c92ad4d214e1e11590c276ab003b74142113 100644 --- a/src/proto/vim9script.pro +++ b/src/proto/vim9script.pro @@ -1,5 +1,6 @@ /* vim9script.c */ int in_vim9script(void); +int in_old_script(int max_version); int current_script_is_vim9(void); void ex_vim9script(exarg_T *eap); int not_in_vim9(exarg_T *eap); diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim index 49bb8739f89550cbdf32b1dfcd4c511ed21d8f0b..a9e95ff59a120a76fac72e8b86b248d28088a449 100644 --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -13,9 +13,25 @@ def Test_vim9cmd() vim9cm assert_equal('yes', y) END CheckScriptSuccess(lines) + assert_fails('vim9cmd', 'E1164:') + assert_fails('legacy', 'E1234:') assert_fails('vim9cmd echo "con" . "cat"', 'E15:') + lines =<< trim END + let str = 'con' + vim9cmd str .= 'cat' + END + CheckScriptFailure(lines, 'E492:') + + lines =<< trim END + vim9script + legacy echo "con" . "cat" + legacy let str = 'con' + legacy let str .= 'cat' + END + CheckScriptSuccess(lines) + lines =<< trim END vim9script def Foo() @@ -24,11 +40,47 @@ def Test_vim9cmd() nmap ,; :vim9cmd <SID>Foo()<CR> END CheckScriptSuccess(lines) + feedkeys(',;', 'xt') assert_equal("bar", g:found_bar) - nunmap ,; unlet g:found_bar + + lines =<< trim END + vim9script + legacy echo 1'000 + END + CheckScriptFailure(lines, 'E115:') + + if has('float') + lines =<< trim END + vim9script + echo .10 + END + CheckScriptSuccess(lines) + lines =<< trim END + vim9cmd echo .10 + END + CheckScriptSuccess(lines) + lines =<< trim END + vim9script + legacy echo .10 + END + CheckScriptFailure(lines, 'E15:') + endif + + echo v:version + assert_fails('vim9cmd echo version', 'E121:') + lines =<< trim END + vim9script + echo version + END + CheckScriptFailure(lines, 'E121:') + lines =<< trim END + vim9script + legacy echo version + END + CheckScriptSuccess(lines) enddef def Test_edit_wildcards() diff --git a/src/typval.c b/src/typval.c index cdb617554e0a5adf499486298bd04eb67306b16d..5fb98eb6733ab618aed7b8cb11dda7b5a075c03a 100644 --- a/src/typval.c +++ b/src/typval.c @@ -1704,7 +1704,7 @@ eval_number( int want_string UNUSED) { int len; - int skip_quotes = current_sctx.sc_version >= 4 || in_vim9script(); + int skip_quotes = !in_old_script(4); #ifdef FEAT_FLOAT char_u *p; int get_float = FALSE; diff --git a/src/version.c b/src/version.c index a2a229bf50bc0b1c50728f5b1a8f4714211cdeff..34793f11efc2e5bb0239e04d8fb442438da9b980 100644 --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 3347, /**/ 3346, /**/ diff --git a/src/vim9script.c b/src/vim9script.c index 66305a304eb54186d6a1b31b4543485e45b8a93e..19991097a03cf36b0ba37d45dad7222bda6f5e29 100644 --- a/src/vim9script.c +++ b/src/vim9script.c @@ -33,6 +33,18 @@ in_vim9script(void) } #if defined(FEAT_EVAL) || defined(PROTO) +/* + * Return TRUE when currently in a script with script version smaller than + * "max_version" or command modifiers forced it. + */ + int +in_old_script(int max_version) +{ + return (current_sctx.sc_version <= max_version + && !(cmdmod.cmod_flags & CMOD_VIM9CMD)) + || (cmdmod.cmod_flags & CMOD_LEGACY); +} + /* * Return TRUE if the current script is Vim9 script. * This also returns TRUE in a legacy function in a Vim9 script.