mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 03:18:16 +00:00
Merge pull request #20961 from zeertzjq/vim-8.2.3055
vim-patch:8.2.3055,9.0.0355
This commit is contained in:
@@ -66,6 +66,8 @@ static char *e_nowhitespace
|
|||||||
static char *e_write2 = N_("E80: Error while writing: %s");
|
static char *e_write2 = N_("E80: Error while writing: %s");
|
||||||
static char *e_string_list_or_blob_required = N_("E1098: String, List or Blob required");
|
static char *e_string_list_or_blob_required = N_("E1098: String, List or Blob required");
|
||||||
static char e_expression_too_recursive_str[] = N_("E1169: Expression too recursive: %s");
|
static char e_expression_too_recursive_str[] = N_("E1169: Expression too recursive: %s");
|
||||||
|
static char e_dot_can_only_be_used_on_dictionary_str[]
|
||||||
|
= N_("E1203: Dot can only be used on a dictionary: %s");
|
||||||
|
|
||||||
static char * const namespace_char = "abglstvw";
|
static char * const namespace_char = "abglstvw";
|
||||||
|
|
||||||
@@ -1313,13 +1315,26 @@ char *get_lval(char *const name, typval_T *const rettv, lval_T *const lp, const
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loop until no more [idx] or .key is following.
|
|
||||||
lp->ll_tv = &v->di_tv;
|
lp->ll_tv = &v->di_tv;
|
||||||
|
|
||||||
|
if (tv_is_luafunc(lp->ll_tv)) {
|
||||||
|
// For v:lua just return a pointer to the "." after the "v:lua".
|
||||||
|
// If the caller is trans_function_name() it will check for a Lua function name.
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop until no more [idx] or .key is following.
|
||||||
typval_T var1;
|
typval_T var1;
|
||||||
var1.v_type = VAR_UNKNOWN;
|
var1.v_type = VAR_UNKNOWN;
|
||||||
typval_T var2;
|
typval_T var2;
|
||||||
var2.v_type = VAR_UNKNOWN;
|
var2.v_type = VAR_UNKNOWN;
|
||||||
while (*p == '[' || (*p == '.' && lp->ll_tv->v_type == VAR_DICT)) {
|
while (*p == '[' || (*p == '.' && p[1] != '=' && p[1] != '.')) {
|
||||||
|
if (*p == '.' && lp->ll_tv->v_type != VAR_DICT) {
|
||||||
|
if (!quiet) {
|
||||||
|
semsg(_(e_dot_can_only_be_used_on_dictionary_str), name);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
if (!(lp->ll_tv->v_type == VAR_LIST && lp->ll_tv->vval.v_list != NULL)
|
if (!(lp->ll_tv->v_type == VAR_LIST && lp->ll_tv->vval.v_list != NULL)
|
||||||
&& !(lp->ll_tv->v_type == VAR_DICT && lp->ll_tv->vval.v_dict != NULL)
|
&& !(lp->ll_tv->v_type == VAR_DICT && lp->ll_tv->vval.v_dict != NULL)
|
||||||
&& !(lp->ll_tv->v_type == VAR_BLOB && lp->ll_tv->vval.v_blob != NULL)) {
|
&& !(lp->ll_tv->v_type == VAR_BLOB && lp->ll_tv->vval.v_blob != NULL)) {
|
||||||
|
@@ -1453,9 +1453,10 @@ bool var_wrong_func_name(const char *const name, const bool new_var)
|
|||||||
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
|
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
|
||||||
{
|
{
|
||||||
// Allow for w: b: s: and t:.
|
// Allow for w: b: s: and t:.
|
||||||
|
// Allow autoload variable.
|
||||||
if (!(vim_strchr("wbst", name[0]) != NULL && name[1] == ':')
|
if (!(vim_strchr("wbst", name[0]) != NULL && name[1] == ':')
|
||||||
&& !ASCII_ISUPPER((name[0] != NUL && name[1] == ':')
|
&& !ASCII_ISUPPER((name[0] != NUL && name[1] == ':') ? name[2] : name[0])
|
||||||
? name[2] : name[0])) {
|
&& vim_strchr(name, '#') == NULL) {
|
||||||
semsg(_("E704: Funcref variable name must start with a capital: %s"), name);
|
semsg(_("E704: Funcref variable name must start with a capital: %s"), name);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,10 @@ func Test_let()
|
|||||||
let Test104#numvar = function('tr')
|
let Test104#numvar = function('tr')
|
||||||
call assert_equal("function('tr')", string(Test104#numvar))
|
call assert_equal("function('tr')", string(Test104#numvar))
|
||||||
|
|
||||||
|
let foo#tr = function('tr')
|
||||||
|
call assert_equal("function('tr')", string(foo#tr))
|
||||||
|
unlet foo#tr
|
||||||
|
|
||||||
let a = 1
|
let a = 1
|
||||||
let b = 2
|
let b = 2
|
||||||
|
|
||||||
@@ -276,7 +280,7 @@ func Test_let_errors()
|
|||||||
let s = "var"
|
let s = "var"
|
||||||
let var = 1
|
let var = 1
|
||||||
call assert_fails('let var += [1,2]', 'E734:')
|
call assert_fails('let var += [1,2]', 'E734:')
|
||||||
call assert_fails('let {s}.1 = 2', 'E18:')
|
call assert_fails('let {s}.1 = 2', 'E1203:')
|
||||||
call assert_fails('let a[1] = 5', 'E121:')
|
call assert_fails('let a[1] = 5', 'E121:')
|
||||||
let l = [[1,2]]
|
let l = [[1,2]]
|
||||||
call assert_fails('let l[:][0] = [5]', 'E708:')
|
call assert_fails('let l[:][0] = [5]', 'E708:')
|
||||||
|
@@ -294,6 +294,9 @@ func Test_dict_assign()
|
|||||||
let d.1 = 1
|
let d.1 = 1
|
||||||
let d._ = 2
|
let d._ = 2
|
||||||
call assert_equal({'1': 1, '_': 2}, d)
|
call assert_equal({'1': 1, '_': 2}, d)
|
||||||
|
|
||||||
|
let n = 0
|
||||||
|
call assert_fails('let n.key = 3', 'E1203: Dot can only be used on a dictionary: n.key = 3')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" Function in script-local List or Dict
|
" Function in script-local List or Dict
|
||||||
|
Reference in New Issue
Block a user