diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2023-10-27 19:35:26 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-10-27 19:35:26 +0200 |
commit | ec3cebbd2b6b7583d2f683f5e66345163ec122aa (patch) | |
tree | 66f0c9b69e88fa4a0d35ae738f687b5679bc56e0 /src/eval.c | |
parent | 4bca4897a12dfb91b3b27e3083fd5f370bd857d1 (diff) |
patch 9.0.2076: Vim9: No support for type aliasesv9.0.2076
Problem: Vim9: No support for type aliases
Solution: Implement :type command
A type definition is giving a name to a type specification. This also known
type alias.
:type ListOfStrings = list<string>
The type alias can be used wherever a built-in type can be used. The type
alias name must start with an upper case character.
closes: #13407
Signed-off-by: Christian Brabandt <cb@256bit.org>
Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Diffstat (limited to 'src/eval.c')
-rw-r--r-- | src/eval.c | 20 |
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: |