diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-04-09 21:47:10 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2024-04-09 21:47:10 +0200 |
commit | 9a91d2b72c20f213bbf77f27b7edd01e0e43d5e0 (patch) | |
tree | a7eeb41a66f128f991990a2d5785684423306349 /src | |
parent | 1af0fbf955f799392f614bc38f9d2fcbd9960526 (diff) |
patch 9.1.0287: Vim9: comment may be treated as heredoc startv9.1.0287
Problem: Vim9: comment may be treated as heredoc start.
(Ernie Rael)
Solution: Use skip_var_list() instead of find_name_end().
(zeertzjq)
fixes: #14444
closes: #14446
Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/eval.c | 2 | ||||
-rw-r--r-- | src/testdir/test_let.vim | 52 | ||||
-rw-r--r-- | src/testdir/test_vim9_assign.vim | 11 | ||||
-rw-r--r-- | src/userfunc.c | 20 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim.h | 1 |
6 files changed, 80 insertions, 8 deletions
diff --git a/src/eval.c b/src/eval.c index 187b4d4d87..e4c8baefb3 100644 --- a/src/eval.c +++ b/src/eval.c @@ -6894,7 +6894,7 @@ find_name_end( int br_nest = 0; char_u *p; int len; - int allow_curly = (flags & FNE_ALLOW_CURLY) || !in_vim9script(); + int allow_curly = !in_vim9script(); if (expr_start != NULL) { diff --git a/src/testdir/test_let.vim b/src/testdir/test_let.vim index c99207c127..1d616350ba 100644 --- a/src/testdir/test_let.vim +++ b/src/testdir/test_let.vim @@ -396,6 +396,42 @@ func Test_let_heredoc_fails() call assert_report('Caught exception: ' .. v:exception) endtry + try + let @- =<< trim TEXT + change + insert + append + TEXT + call assert_report('No exception thrown') + catch /E730:/ + catch + call assert_report('Caught exception: ' .. v:exception) + endtry + + try + let [a b c] =<< trim TEXT + change + insert + append + TEXT + call assert_report('No exception thrown') + catch /E475:/ + catch + call assert_report('Caught exception: ' .. v:exception) + endtry + + try + let [a; b; c] =<< trim TEXT + change + insert + append + TEXT + call assert_report('No exception thrown') + catch /E452:/ + catch + call assert_report('Caught exception: ' .. v:exception) + endtry + let text =<< trim END func WrongSyntax() let v =<< that there @@ -571,6 +607,22 @@ append END call assert_equal(['change', 'insert', 'append'], [a, b, c]) + " unpack assignment with semicolon + let [a; b] =<< END +change +insert +append +END + call assert_equal(['change', ['insert', 'append']], [a, b]) + + " unpack assignment with registers + let [@/, @", @-] =<< END +change +insert +append +END + call assert_equal(['change', 'insert', 'append'], [@/, @", @-]) + " curly braces name and list slice assignment let foo_3_bar = ['', '', ''] let foo_{1 + 2}_bar[ : ] =<< END diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim index 4414f55c06..82dc3e5ca9 100644 --- a/src/testdir/test_vim9_assign.vim +++ b/src/testdir/test_vim9_assign.vim @@ -1997,6 +1997,17 @@ def Test_heredoc() END v9.CheckScriptSuccess(lines) + # commented out heredoc assignment without space after '#' + lines =<< trim END + vim9script + def Func() + #x =<< trim [CODE] + #[CODE] + enddef + Func() + END + v9.CheckScriptSuccess(lines) + v9.CheckDefFailure(['var lines =<< trim END X', 'END'], 'E488:') v9.CheckDefFailure(['var lines =<< trim END " comment', 'END'], 'E488:') diff --git a/src/userfunc.c b/src/userfunc.c index 1bd1a28459..015733cdb1 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -1227,12 +1227,20 @@ get_function_body( || checkforcmd(&arg, "const", 5) || vim9_function) { - while (vim_strchr((char_u *)"$@&", *arg) != NULL) - ++arg; - arg = skipwhite(find_name_end(arg, NULL, NULL, - FNE_INCL_BR | FNE_ALLOW_CURLY)); - if (vim9_function && *arg == ':') - arg = skipwhite(skip_type(skipwhite(arg + 1), FALSE)); + int save_sc_version = current_sctx.sc_version; + int var_count = 0; + int semicolon = 0; + char_u *argend; + + current_sctx.sc_version + = vim9_function ? SCRIPT_VERSION_VIM9 : 1; + argend = skip_var_list(arg, TRUE, &var_count, &semicolon, + TRUE); + if (argend == NULL) + // Invalid list assignment: skip to closing bracket. + argend = find_name_end(arg, NULL, NULL, FNE_INCL_BR); + arg = skipwhite(argend); + current_sctx.sc_version = save_sc_version; if (arg[0] == '=' && arg[1] == '<' && arg[2] =='<') { p = skipwhite(arg + 3); diff --git a/src/version.c b/src/version.c index 4cece61ad6..8cb3262c89 100644 --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 287, +/**/ 286, /**/ 285, @@ -2818,7 +2818,6 @@ typedef int (*opt_expand_cb_T)(optexpand_T *args, int *numMatches, char_u ***mat // flags for find_name_end() #define FNE_INCL_BR 1 // include [] in name #define FNE_CHECK_START 2 // check name starts with valid character -#define FNE_ALLOW_CURLY 4 // always allow curly braces name // BSD is supposed to cover FreeBSD and similar systems. #if (defined(SUN_SYSTEM) || defined(BSD) || defined(__FreeBSD_kernel__)) \ |