Mercurial > vim
changeset 20113:2c23053c654a v8.2.0612
patch 8.2.0612: Vim9: no check for space before #comment
Commit: https://github.com/vim/vim/commit/2c5ed4e3300378ce76c8d9c3818d6f73e5119f68
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Apr 20 19:42:10 2020 +0200
patch 8.2.0612: Vim9: no check for space before #comment
Problem: Vim9: no check for space before #comment.
Solution: Add space checks.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 20 Apr 2020 19:45:03 +0200 |
parents | b209e0dd46a4 |
children | 80e88fbca4ea |
files | src/ex_cmds.c src/ex_eval.c src/gui.c src/highlight.c src/proto/regexp.pro src/regexp.c src/testdir/test_sort.vim src/testdir/test_vim9_script.vim src/version.c |
diffstat | 9 files changed, 96 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -451,12 +451,9 @@ ex_sort(exarg_T *eap) } else if (!ASCII_ISALPHA(*p) && regmatch.regprog == NULL) { - s = skip_regexp(p + 1, *p, TRUE); - if (*s != *p) - { - emsg(_(e_invalpat)); + s = skip_regexp_err(p + 1, *p, TRUE); + if (s == NULL) goto sortend; - } *s = NUL; // Use last search pattern if sort pattern is empty. if (s == p + 1)
--- a/src/ex_eval.c +++ b/src/ex_eval.c @@ -1021,12 +1021,12 @@ ex_else(exarg_T *eap) if (eap->cmdidx == CMD_elseif) { result = eval_to_bool(eap->arg, &error, &eap->nextcmd, skip); + // When throwing error exceptions, we want to throw always the first // of several errors in a row. This is what actually happens when // a conditional error was detected above and there is another failure // when parsing the expression. Since the skip flag is set in this // case, the parsing error will be ignored by emsg(). - if (!skip && !error) { if (result) @@ -1518,7 +1518,7 @@ ex_catch(exarg_T *eap) &cstack->cs_looplevel); } - if (ends_excmd(*eap->arg)) // no argument, catch all errors + if (ends_excmd2(eap->cmd, eap->arg)) // no argument, catch all errors { pat = (char_u *)".*"; end = NULL; @@ -1527,7 +1527,9 @@ ex_catch(exarg_T *eap) else { pat = eap->arg + 1; - end = skip_regexp(pat, *eap->arg, TRUE); + end = skip_regexp_err(pat, *eap->arg, TRUE); + if (end == NULL) + give_up = TRUE; } if (!give_up) @@ -1548,7 +1550,8 @@ ex_catch(exarg_T *eap) if (!skip && (cstack->cs_flags[idx] & CSF_THROWN) && !(cstack->cs_flags[idx] & CSF_CAUGHT)) { - if (end != NULL && *end != NUL && !ends_excmd(*skipwhite(end + 1))) + if (end != NULL && *end != NUL + && !ends_excmd2(end, skipwhite(end + 1))) { emsg(_(e_trailing)); return;
--- a/src/gui.c +++ b/src/gui.c @@ -5036,7 +5036,7 @@ ex_gui(exarg_T *eap) // of the argument ending up after the shell prompt. msg_clr_eos_force(); #ifdef GUI_MAY_SPAWN - if (!ends_excmd(*eap->arg)) + if (!ends_excmd2(eap->cmd, eap->arg)) gui_start(eap->arg); else #endif @@ -5045,7 +5045,7 @@ ex_gui(exarg_T *eap) channel_gui_register_all(); #endif } - if (!ends_excmd(*eap->arg)) + if (!ends_excmd2(eap->cmd, eap->arg)) ex_next(eap); }
--- a/src/highlight.c +++ b/src/highlight.c @@ -658,7 +658,7 @@ do_highlight( /* * If no argument, list current highlighting. */ - if (ends_excmd(*line)) + if (!init && ends_excmd2(line - 1, line)) { for (i = 1; i <= highlight_ga.ga_len && !got_int; ++i) // TODO: only call when the group has attributes set
--- a/src/proto/regexp.pro +++ b/src/proto/regexp.pro @@ -1,6 +1,7 @@ /* regexp.c */ int re_multiline(regprog_T *prog); -char_u *skip_regexp(char_u *startp, int dirc, int magic); +char_u *skip_regexp(char_u *startp, int delim, int magic); +char_u *skip_regexp_err(char_u *startp, int delim, int magic); char_u *skip_regexp_ex(char_u *startp, int dirc, int magic, char_u **newp, int *dropped); reg_extmatch_T *ref_extmatch(reg_extmatch_T *em); void unref_extmatch(reg_extmatch_T *em);
--- a/src/regexp.c +++ b/src/regexp.c @@ -534,17 +534,37 @@ skip_anyof(char_u *p) /* * Skip past regular expression. - * Stop at end of "startp" or where "dirc" is found ('/', '?', etc). + * Stop at end of "startp" or where "delim" is found ('/', '?', etc). * Take care of characters with a backslash in front of it. * Skip strings inside [ and ]. */ char_u * skip_regexp( char_u *startp, - int dirc, + int delim, int magic) { - return skip_regexp_ex(startp, dirc, magic, NULL, NULL); + return skip_regexp_ex(startp, delim, magic, NULL, NULL); +} + +/* + * Call skip_regexp() and when the delimiter does not match give an error and + * return NULL. + */ + char_u * +skip_regexp_err( + char_u *startp, + int delim, + int magic) +{ + char_u *p = skip_regexp(startp, delim, magic); + + if (*p != delim) + { + semsg(_("E654: missing delimiter after search pattern: %s"), startp); + return NULL; + } + return p; } /*
--- a/src/testdir/test_sort.vim +++ b/src/testdir/test_sort.vim @@ -1255,7 +1255,7 @@ func Test_sort_cmd() call setline(1, ['line1', 'line2']) call assert_fails('sort no', 'E474:') call assert_fails('sort c', 'E475:') - call assert_fails('sort #pat%', 'E682:') + call assert_fails('sort #pat%', 'E654:') enew! endfunc
--- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -1153,22 +1153,76 @@ def Test_vim9_comment() CheckDefFailure([ 'try# comment', - 'echo "yes"', + ' echo "yes"', 'catch', 'endtry', ], 'E488:') + CheckScriptFailure([ + 'vim9script', + 'try# comment', + 'echo "yes"', + ], 'E488:') CheckDefFailure([ 'try', - 'echo "yes"', + ' echo "yes"', 'catch# comment', 'endtry', ], 'E488:') + CheckScriptFailure([ + 'vim9script', + 'try', + ' echo "yes"', + 'catch# comment', + 'endtry', + ], 'E654:') + CheckDefFailure([ + 'try', + ' echo "yes"', + 'catch /pat/# comment', + 'endtry', + ], 'E488:') + CheckScriptFailure([ + 'vim9script', + 'try', + ' throw "pat"', + 'catch /pat/# comment', + 'endtry', + ], 'E605:') CheckDefFailure([ 'try', 'echo "yes"', 'catch', 'endtry# comment', ], 'E488:') + CheckScriptFailure([ + 'vim9script', + 'try', + ' echo "yes"', + 'catch', + 'endtry# comment', + ], 'E600:') + + CheckScriptSuccess([ + 'vim9script', + 'hi # comment', + ]) + CheckScriptFailure([ + 'vim9script', + 'hi# comment', + ], 'E416:') +enddef + +def Test_vim9_comment_gui() + CheckCanRunGui + + CheckScriptFailure([ + 'vim9script', + 'gui#comment' + ], 'E499:') + CheckScriptFailure([ + 'vim9script', + 'gui -f#comment' + ], 'E499:') enddef def Test_vim9_comment_not_compiled()