mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.2.1125: Vim9: double quote can be a string or a comment
Problem: Vim9: double quote can be a string or a comment. Solution: Only support comments starting with # to avoid confusion.
This commit is contained in:
@@ -787,8 +787,8 @@ get_literal_key(char_u **arg, typval_T *tv)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate a variable for a Dictionary and fill it from "*arg".
|
* Allocate a variable for a Dictionary and fill it from "*arg".
|
||||||
|
* "*arg" points to the "{".
|
||||||
* "literal" is TRUE for #{key: val}
|
* "literal" is TRUE for #{key: val}
|
||||||
* "flags" can have EVAL_EVALUATE and other EVAL_ flags.
|
|
||||||
* Return OK or FAIL. Returns NOTDONE for {expr}.
|
* Return OK or FAIL. Returns NOTDONE for {expr}.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
@@ -830,7 +830,7 @@ eval_dict(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int literal)
|
|||||||
tvkey.v_type = VAR_UNKNOWN;
|
tvkey.v_type = VAR_UNKNOWN;
|
||||||
tv.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)
|
while (**arg != '}' && **arg != NUL)
|
||||||
{
|
{
|
||||||
if ((literal
|
if ((literal
|
||||||
@@ -862,7 +862,7 @@ eval_dict(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int literal)
|
|||||||
goto failret;
|
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 (eval1(arg, &tv, evalarg) == FAIL) // recursive!
|
||||||
{
|
{
|
||||||
if (evaluate)
|
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
|
// the "}" can be on the next line
|
||||||
*arg = skipwhite_and_linebreak_keep_string(*arg, evalarg);
|
*arg = skipwhite_and_linebreak(*arg, evalarg);
|
||||||
if (**arg == '}')
|
if (**arg == '}')
|
||||||
break;
|
break;
|
||||||
if (!had_comma)
|
if (!had_comma)
|
||||||
|
24
src/eval.c
24
src/eval.c
@@ -1866,9 +1866,9 @@ eval_func(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If inside Vim9 script, "arg" points to the end of a line (ignoring comments)
|
* If inside Vim9 script, "arg" points to the end of a line (ignoring a #
|
||||||
* and there is a next line, return the next line (skipping blanks) and set
|
* comment) and there is a next line, return the next line (skipping blanks)
|
||||||
* "getnext".
|
* and set "getnext".
|
||||||
* Otherwise just return "arg" unmodified and set "getnext" to FALSE.
|
* Otherwise just return "arg" unmodified and set "getnext" to FALSE.
|
||||||
* "arg" must point somewhere inside a line, not at the start.
|
* "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 != NULL
|
||||||
&& evalarg->eval_cookie != NULL
|
&& evalarg->eval_cookie != NULL
|
||||||
&& (*arg == NUL || (VIM_ISWHITE(arg[-1])
|
&& (*arg == NUL || (VIM_ISWHITE(arg[-1])
|
||||||
&& (*arg == '"' || *arg == '#'))))
|
&& *arg == '#' && arg[1] != '{')))
|
||||||
{
|
{
|
||||||
char_u *p = getline_peek(evalarg->eval_getline, evalarg->eval_cookie);
|
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;
|
int getnext;
|
||||||
char_u *p = skipwhite(arg);
|
char_u *p = skipwhite(arg);
|
||||||
|
|
||||||
|
if (evalarg == NULL)
|
||||||
|
return skipwhite(arg);
|
||||||
eval_next_non_blank(p, evalarg, &getnext);
|
eval_next_non_blank(p, evalarg, &getnext);
|
||||||
if (getnext)
|
if (getnext)
|
||||||
return eval_next_line(evalarg);
|
return eval_next_line(evalarg);
|
||||||
return p;
|
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.
|
* After using "evalarg" filled from "eap" free the memory.
|
||||||
*/
|
*/
|
||||||
|
@@ -1177,7 +1177,7 @@ eval_list(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int do_error)
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
*arg = skipwhite_and_linebreak_keep_string(*arg + 1, evalarg);
|
*arg = skipwhite_and_linebreak(*arg + 1, evalarg);
|
||||||
while (**arg != ']' && **arg != NUL)
|
while (**arg != ']' && **arg != NUL)
|
||||||
{
|
{
|
||||||
if (eval1(arg, &tv, evalarg) == FAIL) // recursive!
|
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
|
// The "]" can be on the next line. But a double quoted string may
|
||||||
// follow, not a comment.
|
// follow, not a comment.
|
||||||
*arg = skipwhite_and_linebreak_keep_string(*arg, evalarg);
|
*arg = skipwhite_and_linebreak(*arg, evalarg);
|
||||||
if (**arg == ']')
|
if (**arg == ']')
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@@ -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_non_blank(char_u *arg, evalarg_T *evalarg, int *getnext);
|
||||||
char_u *eval_next_line(evalarg_T *evalarg);
|
char_u *eval_next_line(evalarg_T *evalarg);
|
||||||
char_u *skipwhite_and_linebreak(char_u *arg, 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);
|
void clear_evalarg(evalarg_T *evalarg, exarg_T *eap);
|
||||||
int eval0(char_u *arg, typval_T *rettv, exarg_T *eap, evalarg_T *evalarg);
|
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);
|
int eval1(char_u **arg, typval_T *rettv, evalarg_T *evalarg);
|
||||||
|
@@ -754,6 +754,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1125,
|
||||||
/**/
|
/**/
|
||||||
1124,
|
1124,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -342,7 +342,7 @@ handle_import(
|
|||||||
goto erret;
|
goto erret;
|
||||||
}
|
}
|
||||||
|
|
||||||
arg = skipwhite_and_linebreak_keep_string(arg + 4, evalarg);
|
arg = skipwhite_and_linebreak(arg + 4, evalarg);
|
||||||
tv.v_type = VAR_UNKNOWN;
|
tv.v_type = VAR_UNKNOWN;
|
||||||
// TODO: should we accept any expression?
|
// TODO: should we accept any expression?
|
||||||
if (*arg == '\'')
|
if (*arg == '\'')
|
||||||
|
Reference in New Issue
Block a user