aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorii14 <ii14@users.noreply.github.com>2022-09-07 20:45:22 +0200
committerzeertzjq <zeertzjq@outlook.com>2022-09-08 08:17:30 +0800
commit4a67f9d386bb16149eecf32f45a3cb73878f12e7 (patch)
treef5235ef14dce746338bf8fb12a3b0c0d5facb788
parent93a0c2dd63e369528664037b118ff9b9b38a20d4 (diff)
downloadrneovim-4a67f9d386bb16149eecf32f45a3cb73878f12e7.tar.gz
rneovim-4a67f9d386bb16149eecf32f45a3cb73878f12e7.tar.bz2
rneovim-4a67f9d386bb16149eecf32f45a3cb73878f12e7.zip
vim-patch:9.0.0409: #{g:x} was seen as a curly-braces expression
Problem: #{g:x} was seen as a curly-braces expression. Solution: Do never see #{} as a curly-braces expression. (closes vim/vim#11075) https://github.com/vim/vim/commit/7c7e1e9b98d4e5dbe7358c795a635c6f1f36f418
-rw-r--r--src/nvim/eval.c6
-rw-r--r--src/nvim/testdir/test_listdict.vim4
-rw-r--r--test/functional/ex_cmds/source_spec.lua4
3 files changed, 10 insertions, 4 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 1171695be3..aa2849279e 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -4587,12 +4587,14 @@ static int dict_get_tv(char **arg, typval_T *rettv, int evaluate, bool literal)
char *curly_expr = skipwhite(*arg + 1);
char buf[NUMBUFLEN];
- // First check if it's not a curly-braces thing: {expr}.
+ // First check if it's not a curly-braces expression: {expr}.
// Must do this without evaluating, otherwise a function may be called
// twice. Unfortunately this means we need to call eval1() twice for the
// first item.
- // But {} is an empty Dictionary.
+ // "{}" is an empty Dictionary.
+ // "#{abc}" is never a curly-braces expression.
if (*curly_expr != '}'
+ && !literal
&& eval1(&curly_expr, &tv, false) == OK
&& *skipwhite(curly_expr) == '}') {
return NOTDONE;
diff --git a/src/nvim/testdir/test_listdict.vim b/src/nvim/testdir/test_listdict.vim
index f0440ae14b..9cef6905a5 100644
--- a/src/nvim/testdir/test_listdict.vim
+++ b/src/nvim/testdir/test_listdict.vim
@@ -168,6 +168,10 @@ func Test_dict()
" allow key starting with number at the start, not a curly expression
call assert_equal({'1foo': 77}, #{1foo: 77})
+
+ " #{expr} is not a curly expression
+ let x = 'x'
+ call assert_equal(#{g: x}, #{g:x})
endfunc
" Dictionary identity
diff --git a/test/functional/ex_cmds/source_spec.lua b/test/functional/ex_cmds/source_spec.lua
index cd1f43f9fd..10ebefd8cd 100644
--- a/test/functional/ex_cmds/source_spec.lua
+++ b/test/functional/ex_cmds/source_spec.lua
@@ -104,7 +104,7 @@ describe(':source', function()
eq("0zBEEFCAFE", meths.exec('echo d', true))
exec('set cpoptions+=C')
- eq('Vim(let):E15: Invalid expression: #{', exc_exec('source'))
+ eq('Vim(let):E723: Missing end of Dictionary \'}\': ', exc_exec('source'))
end)
it('selection in current buffer', function()
@@ -138,7 +138,7 @@ describe(':source', function()
eq('Vim(echo):E117: Unknown function: s:C', exc_exec('echo D()'))
exec('set cpoptions+=C')
- eq('Vim(let):E15: Invalid expression: #{', exc_exec("'<,'>source"))
+ eq('Vim(let):E723: Missing end of Dictionary \'}\': ', exc_exec("'<,'>source"))
end)
it('does not break if current buffer is modified while sourced', function()