summaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/eval.c b/src/eval.c
index e888fecc8a..ce981223fd 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -1883,6 +1883,14 @@ set_var_lval(
if (eval_variable(lp->ll_name, (int)STRLEN(lp->ll_name),
lp->ll_sid, &tv, &di, EVAL_VAR_VERBOSE) == OK)
{
+ if (di != NULL && di->di_tv.v_type == VAR_TYPEALIAS)
+ {
+ semsg(_(e_using_typealias_as_variable),
+ di->di_tv.vval.v_typealias->ta_name);
+ clear_tv(&tv);
+ return;
+ }
+
if ((di == NULL
|| (!var_check_ro(di->di_flags, lp->ll_name, FALSE)
&& !tv_check_lock(&di->di_tv, lp->ll_name, FALSE)))
@@ -2013,6 +2021,7 @@ tv_op(typval_T *tv1, typval_T *tv2, char_u *op)
case VAR_INSTR:
case VAR_CLASS:
case VAR_OBJECT:
+ case VAR_TYPEALIAS:
break;
case VAR_BLOB:
@@ -5004,6 +5013,7 @@ check_can_index(typval_T *rettv, int evaluate, int verbose)
case VAR_INSTR:
case VAR_CLASS:
case VAR_OBJECT:
+ case VAR_TYPEALIAS:
if (verbose)
emsg(_(e_cannot_index_special_variable));
return FAIL;
@@ -5109,6 +5119,7 @@ eval_index_inner(
case VAR_INSTR:
case VAR_CLASS:
case VAR_OBJECT:
+ case VAR_TYPEALIAS:
break; // not evaluating, skipping over subscript
case VAR_NUMBER:
@@ -6046,6 +6057,7 @@ set_ref_in_item(
case VAR_FLOAT:
case VAR_STRING:
case VAR_BLOB:
+ case VAR_TYPEALIAS:
case VAR_INSTR:
// Types that do not contain any other item
break;
@@ -6329,6 +6341,13 @@ echo_string_core(
*tofree = NULL;
r = (char_u *)get_var_special_name(tv->vval.v_number);
break;
+
+ case VAR_TYPEALIAS:
+ *tofree = vim_strsave(tv->vval.v_typealias->ta_name);
+ r = *tofree;
+ if (r == NULL)
+ r = (char_u *)"";
+ break;
}
if (--recurse == 0)
@@ -7201,6 +7220,7 @@ item_copy(
case VAR_INSTR:
case VAR_CLASS:
case VAR_OBJECT:
+ case VAR_TYPEALIAS:
copy_tv(from, to);
break;
case VAR_LIST: