]> granicus.if.org Git - vim/commitdiff
patch 8.2.0612: Vim9: no check for space before #comment v8.2.0612
authorBram Moolenaar <Bram@vim.org>
Mon, 20 Apr 2020 17:42:10 +0000 (19:42 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 20 Apr 2020 17:42:10 +0000 (19:42 +0200)
Problem:    Vim9: no check for space before #comment.
Solution:   Add space checks.

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

index bd114631bbd0147e24d745ad3b489191b0e13714..f38bdacb63a9f795375dae7c95f1ea2f3d563372 100644 (file)
@@ -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)
index 7ffc145ae43a84db40d4e6056a92dad1fc049fee..4aa265836123015f896f4bbe7236fd88b1dc4048 100644 (file)
@@ -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;
index cdfc929e9f0d6a43ed5932d2532380aed8ded1ff..5959043279b946ca40de2bdfeb3208aea4bb0d89 100644 (file)
--- 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);
 }
 
index ee2e43754d8757680e2c6a4984a3c7dc4581e400..9476a7ddac6f2d0a8ef88dfb50f5c76364f60a2d 100644 (file)
@@ -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
index 27ba8e59a080b450d69bfee9f66e9b5113321c42..d3a77541515d173623bd129a2cf86cc4c6d7ec09 100644 (file)
@@ -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);
index 3911c906165f1f1ae0139fb45bd499672285f6fc..c222d9c2eeb2a197bfa6dbb87ff45b4ae6b27c22 100644 (file)
@@ -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, 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)
 {
-    return skip_regexp_ex(startp, dirc, magic, NULL, NULL);
+    char_u *p = skip_regexp(startp, delim, magic);
+
+    if (*p != delim)
+    {
+       semsg(_("E654: missing delimiter after search pattern: %s"), startp);
+       return NULL;
+    }
+    return p;
 }
 
 /*
index 92e8f49d48538fff8926a94fce0a3aeef15ca5ed..aa74a92d0c2d51a93b7fa381eb17c3b3cc575d8b 100644 (file)
@@ -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
index 70653f0332512b0fcf3d91a17b78d1b25ece5532..a541d8808de55bb72ae73483b886ee3a51dde54c 100644 (file)
@@ -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()
index d051d79c8d16c56e2682e119012da4733c6f8b6c..de9413b8c068c7111f7d2fafad32501e8d3d6b68 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    612,
 /**/
     611,
 /**/