mirror of
https://github.com/vim/vim.git
synced 2025-09-27 04:14:06 -04:00
patch 9.1.0329: String interpolation fails for Dict type
Problem: String interpolation fails for Dict type Solution: Support Dict data type properly, also support :put =Dict (without having to convert it to string() first) (Yegappan Lakshmanan) fixes: #14529 closes: #14541 Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
0d87e3c711
commit
f01493c550
@@ -1,4 +1,4 @@
|
|||||||
*change.txt* For Vim version 9.1. Last change: 2023 Dec 19
|
*change.txt* For Vim version 9.1. Last change: 2024 Apr 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -1345,8 +1345,8 @@ expression (like with the "/" command).
|
|||||||
The expression must evaluate to a String. A Number is always automatically
|
The expression must evaluate to a String. A Number is always automatically
|
||||||
converted to a String. For the "p" and ":put" command, if the result is a
|
converted to a String. For the "p" and ":put" command, if the result is a
|
||||||
Float it's converted into a String. If the result is a List each element is
|
Float it's converted into a String. If the result is a List each element is
|
||||||
turned into a String and used as a line. A Dictionary or FuncRef results in
|
turned into a String and used as a line. A Dictionary is converted into a
|
||||||
an error message (use string() to convert).
|
String. A FuncRef results in an error message (use string() to convert).
|
||||||
|
|
||||||
If the "= register is used for the "p" command, the String is split up at <NL>
|
If the "= register is used for the "p" command, the String is split up at <NL>
|
||||||
characters. If the String ends in a <NL>, it is regarded as a linewise
|
characters. If the String ends in a <NL>, it is regarded as a linewise
|
||||||
|
@@ -575,7 +575,8 @@ skip_expr_concatenate(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert "tv" to a string.
|
* Convert "tv" to a string.
|
||||||
* When "convert" is TRUE convert a List into a sequence of lines.
|
* When "convert" is TRUE convert a List into a sequence of lines and a Dict
|
||||||
|
* into a textual representation of the Dict.
|
||||||
* Returns an allocated string (NULL when out of memory).
|
* Returns an allocated string (NULL when out of memory).
|
||||||
*/
|
*/
|
||||||
char_u *
|
char_u *
|
||||||
@@ -596,6 +597,8 @@ typval2string(typval_T *tv, int convert)
|
|||||||
ga_append(&ga, NUL);
|
ga_append(&ga, NUL);
|
||||||
retval = (char_u *)ga.ga_data;
|
retval = (char_u *)ga.ga_data;
|
||||||
}
|
}
|
||||||
|
else if (convert && tv->v_type == VAR_DICT)
|
||||||
|
retval = dict2string(tv, get_copyID(), FALSE);
|
||||||
else
|
else
|
||||||
retval = vim_strsave(tv_get_string(tv));
|
retval = vim_strsave(tv_get_string(tv));
|
||||||
return retval;
|
return retval;
|
||||||
|
@@ -1962,8 +1962,8 @@ func Test_edit_ctrl_r_failed()
|
|||||||
|
|
||||||
let buf = RunVimInTerminal('', #{rows: 6, cols: 60})
|
let buf = RunVimInTerminal('', #{rows: 6, cols: 60})
|
||||||
|
|
||||||
" trying to insert a dictionary produces an error
|
" trying to insert a blob produces an error
|
||||||
call term_sendkeys(buf, "i\<C-R>={}\<CR>")
|
call term_sendkeys(buf, "i\<C-R>=0z\<CR>")
|
||||||
|
|
||||||
" ending Insert mode should put the cursor back on the ':'
|
" ending Insert mode should put the cursor back on the ':'
|
||||||
call term_sendkeys(buf, ":\<Esc>")
|
call term_sendkeys(buf, ":\<Esc>")
|
||||||
|
@@ -950,6 +950,10 @@ func Test_string_interp()
|
|||||||
endif
|
endif
|
||||||
call assert_equal(0, tmp)
|
call assert_equal(0, tmp)
|
||||||
|
|
||||||
|
#" Dict interpolation
|
||||||
|
VAR d = {'a': 10, 'b': [1, 2]}
|
||||||
|
call assert_equal("{'a': 10, 'b': [1, 2]}", $'{d}')
|
||||||
|
|
||||||
#" Stray closing brace.
|
#" Stray closing brace.
|
||||||
call assert_fails('echo $"moo}"', 'E1278:')
|
call assert_fails('echo $"moo}"', 'E1278:')
|
||||||
#" Undefined variable in expansion.
|
#" Undefined variable in expansion.
|
||||||
|
@@ -689,6 +689,13 @@ END
|
|||||||
END
|
END
|
||||||
call assert_equal(['let a = {abc}', 'let b = X', 'let c = {'], code)
|
call assert_equal(['let a = {abc}', 'let b = X', 'let c = {'], code)
|
||||||
|
|
||||||
|
" Evaluate a dictionary
|
||||||
|
let d1 = #{a: 10, b: 'ss', c: {}}
|
||||||
|
let code =<< eval trim END
|
||||||
|
let d2 = {d1}
|
||||||
|
END
|
||||||
|
call assert_equal(["let d2 = {'a': 10, 'b': 'ss', 'c': {}}"], code)
|
||||||
|
|
||||||
let code = 'xxx'
|
let code = 'xxx'
|
||||||
let code =<< eval trim END
|
let code =<< eval trim END
|
||||||
let n = {5 +
|
let n = {5 +
|
||||||
|
@@ -319,4 +319,13 @@ func Test_put_visual_replace_fold_marker()
|
|||||||
call assert_equal(lines, getline(1, '$'))
|
call assert_equal(lines, getline(1, '$'))
|
||||||
|
|
||||||
bwipe!
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_put_dict()
|
||||||
|
new
|
||||||
|
let d = #{a: #{b: 'abc'}, c: [1, 2], d: 0z10}
|
||||||
|
put! =d
|
||||||
|
call assert_equal(["{'a': {'b': 'abc'}, 'c': [1, 2], 'd': 0z10}", ''],
|
||||||
|
\ getline(1, '$'))
|
||||||
|
bw!
|
||||||
endfunc
|
endfunc
|
||||||
|
@@ -2984,6 +2984,16 @@ def Test_heredoc_expr()
|
|||||||
CODE
|
CODE
|
||||||
v9.CheckDefAndScriptSuccess(lines)
|
v9.CheckDefAndScriptSuccess(lines)
|
||||||
|
|
||||||
|
# Evaluate a dictionary
|
||||||
|
lines =<< trim CODE
|
||||||
|
var d1 = {'a': 10, 'b': [1, 2]}
|
||||||
|
var code =<< trim eval END
|
||||||
|
var d2 = {d1}
|
||||||
|
END
|
||||||
|
assert_equal(["var d2 = {'a': 10, 'b': [1, 2]}"], code)
|
||||||
|
CODE
|
||||||
|
v9.CheckDefAndScriptSuccess(lines)
|
||||||
|
|
||||||
lines =<< trim CODE
|
lines =<< trim CODE
|
||||||
var code =<< eval trim END
|
var code =<< eval trim END
|
||||||
var s = "{$SOME_ENV_VAR}"
|
var s = "{$SOME_ENV_VAR}"
|
||||||
|
@@ -704,6 +704,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 */
|
||||||
|
/**/
|
||||||
|
329,
|
||||||
/**/
|
/**/
|
||||||
328,
|
328,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -1653,6 +1653,7 @@ do_2string(typval_T *tv, int is_2string_any, int tolerant)
|
|||||||
case VAR_BOOL:
|
case VAR_BOOL:
|
||||||
case VAR_NUMBER:
|
case VAR_NUMBER:
|
||||||
case VAR_FLOAT:
|
case VAR_FLOAT:
|
||||||
|
case VAR_DICT:
|
||||||
case VAR_BLOB: break;
|
case VAR_BLOB: break;
|
||||||
|
|
||||||
case VAR_LIST:
|
case VAR_LIST:
|
||||||
|
@@ -222,6 +222,7 @@ may_generate_2STRING(int offset, int tolerant, cctx_T *cctx)
|
|||||||
|
|
||||||
// conversion possible when tolerant
|
// conversion possible when tolerant
|
||||||
case VAR_LIST:
|
case VAR_LIST:
|
||||||
|
case VAR_DICT:
|
||||||
if (tolerant)
|
if (tolerant)
|
||||||
{
|
{
|
||||||
isntype = ISN_2STRING_ANY;
|
isntype = ISN_2STRING_ANY;
|
||||||
@@ -234,7 +235,6 @@ may_generate_2STRING(int offset, int tolerant, cctx_T *cctx)
|
|||||||
case VAR_BLOB:
|
case VAR_BLOB:
|
||||||
case VAR_FUNC:
|
case VAR_FUNC:
|
||||||
case VAR_PARTIAL:
|
case VAR_PARTIAL:
|
||||||
case VAR_DICT:
|
|
||||||
case VAR_JOB:
|
case VAR_JOB:
|
||||||
case VAR_CHANNEL:
|
case VAR_CHANNEL:
|
||||||
case VAR_INSTR:
|
case VAR_INSTR:
|
||||||
|
Reference in New Issue
Block a user