]> granicus.if.org Git - vim/commitdiff
patch 8.2.1125: Vim9: double quote can be a string or a comment v8.2.1125
authorBram Moolenaar <Bram@vim.org>
Sat, 4 Jul 2020 12:15:00 +0000 (14:15 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 4 Jul 2020 12:15:00 +0000 (14:15 +0200)
Problem:    Vim9: double quote can be a string or a comment.
Solution:   Only support comments starting with # to avoid confusion.

src/dict.c
src/eval.c
src/list.c
src/proto/eval.pro
src/version.c
src/vim9script.c

index 53824f75d6396a6f7290e18247c80c6ee20d3d35..a549ed71b130ef8a924c72564a707385c8d798c9 100644 (file)
@@ -787,8 +787,8 @@ get_literal_key(char_u **arg, typval_T *tv)
 
 /*
  * Allocate a variable for a Dictionary and fill it from "*arg".
+ * "*arg" points to the "{".
  * "literal" is TRUE for #{key: val}
- * "flags" can have EVAL_EVALUATE and other EVAL_ flags.
  * Return OK or FAIL.  Returns NOTDONE for {expr}.
  */
     int
@@ -830,7 +830,7 @@ eval_dict(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int literal)
     tvkey.v_type = VAR_UNKNOWN;
     tv.v_type = VAR_UNKNOWN;
 
-    *arg = skipwhite_and_linebreak_keep_string(*arg + 1, evalarg);
+    *arg = skipwhite_and_linebreak(*arg + 1, evalarg);
     while (**arg != '}' && **arg != NUL)
     {
        if ((literal
@@ -862,7 +862,7 @@ eval_dict(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int literal)
            goto failret;
        }
 
-       *arg = skipwhite_and_linebreak_keep_string(*arg + 1, evalarg);
+       *arg = skipwhite_and_linebreak(*arg + 1, evalarg);
        if (eval1(arg, &tv, evalarg) == FAIL)   // recursive!
        {
            if (evaluate)
@@ -904,7 +904,7 @@ eval_dict(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int literal)
        }
 
        // the "}" can be on the next line
-       *arg = skipwhite_and_linebreak_keep_string(*arg, evalarg);
+       *arg = skipwhite_and_linebreak(*arg, evalarg);
        if (**arg == '}')
            break;
        if (!had_comma)
index c569710ab5579edbde9b21cf26bf6eb9b16be7b5..1468070ae6c09aa7ccda515221ba3f604ae0dc0b 100644 (file)
@@ -1866,9 +1866,9 @@ eval_func(
 }
 
 /*
- * If inside Vim9 script, "arg" points to the end of a line (ignoring comments)
- * and there is a next line, return the next line (skipping blanks) and set
- * "getnext".
+ * If inside Vim9 script, "arg" points to the end of a line (ignoring a #
+ * comment) and there is a next line, return the next line (skipping blanks)
+ * and set "getnext".
  * Otherwise just return "arg" unmodified and set "getnext" to FALSE.
  * "arg" must point somewhere inside a line, not at the start.
  */
@@ -1880,7 +1880,7 @@ eval_next_non_blank(char_u *arg, evalarg_T *evalarg, int *getnext)
            && evalarg != NULL
            && evalarg->eval_cookie != NULL
            && (*arg == NUL || (VIM_ISWHITE(arg[-1])
-                                            && (*arg == '"' || *arg == '#'))))
+                                            && *arg == '#' && arg[1] != '{')))
     {
        char_u *p = getline_peek(evalarg->eval_getline, evalarg->eval_cookie);
 
@@ -1927,26 +1927,14 @@ skipwhite_and_linebreak(char_u *arg, evalarg_T *evalarg)
     int            getnext;
     char_u  *p = skipwhite(arg);
 
+    if (evalarg == NULL)
+       return skipwhite(arg);
     eval_next_non_blank(p, evalarg, &getnext);
     if (getnext)
        return eval_next_line(evalarg);
     return p;
 }
 
-/*
- * Call eval_next_non_blank() and get the next line if needed, but not when a
- * double quote follows.  Used inside an expression.
- */
-    char_u *
-skipwhite_and_linebreak_keep_string(char_u *arg, evalarg_T *evalarg)
-{
-    char_u  *p = skipwhite(arg);
-
-    if (*p == '"')
-       return p;
-    return skipwhite_and_linebreak(arg, evalarg);
-}
-
 /*
  * After using "evalarg" filled from "eap" free the memory.
  */
index 9475ef99e207889fb2d2c75a191024c62264143d..e8d5f5f546f9b5e15694bc1c7eb0156c5cd13500 100644 (file)
@@ -1177,7 +1177,7 @@ eval_list(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int do_error)
            return FAIL;
     }
 
-    *arg = skipwhite_and_linebreak_keep_string(*arg + 1, evalarg);
+    *arg = skipwhite_and_linebreak(*arg + 1, evalarg);
     while (**arg != ']' && **arg != NUL)
     {
        if (eval1(arg, &tv, evalarg) == FAIL)   // recursive!
@@ -1209,7 +1209,7 @@ eval_list(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int do_error)
 
        // The "]" can be on the next line.  But a double quoted string may
        // follow, not a comment.
-       *arg = skipwhite_and_linebreak_keep_string(*arg, evalarg);
+       *arg = skipwhite_and_linebreak(*arg, evalarg);
        if (**arg == ']')
            break;
 
index 910fdfd1801300366f8e8fba20b84501d0044a29..3e8790795792c381f519a97b0a9088ffb3ae8337 100644 (file)
@@ -32,7 +32,6 @@ int pattern_match(char_u *pat, char_u *text, int ic);
 char_u *eval_next_non_blank(char_u *arg, evalarg_T *evalarg, int *getnext);
 char_u *eval_next_line(evalarg_T *evalarg);
 char_u *skipwhite_and_linebreak(char_u *arg, evalarg_T *evalarg);
-char_u *skipwhite_and_linebreak_keep_string(char_u *arg, evalarg_T *evalarg);
 void clear_evalarg(evalarg_T *evalarg, exarg_T *eap);
 int eval0(char_u *arg, typval_T *rettv, exarg_T *eap, evalarg_T *evalarg);
 int eval1(char_u **arg, typval_T *rettv, evalarg_T *evalarg);
index 2f4bb6bd557f6974ba39a1c5e1a0bb041187fb8d..b36f248f8d856635222a39fe47ff769b928091f3 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1125,
 /**/
     1124,
 /**/
index 14586f9b8a06501c1c8897f82014ca102d0c318a..ef447c7e3524855f2581e0ffb464606e656b2f9a 100644 (file)
@@ -342,7 +342,7 @@ handle_import(
        goto erret;
     }
 
-    arg = skipwhite_and_linebreak_keep_string(arg + 4, evalarg);
+    arg = skipwhite_and_linebreak(arg + 4, evalarg);
     tv.v_type = VAR_UNKNOWN;
     // TODO: should we accept any expression?
     if (*arg == '\'')