summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2023-01-07 12:08:41 +0000
committerBram Moolenaar <Bram@vim.org>2023-01-07 12:08:41 +0000
commiteca2c5fff6f6ccad0df8824c4b4354d3f410d225 (patch)
treef4c0f3d3e7d5b1fd756fb36234a455ab220efb8c
parent2c01131c2a9d5455de603f646ba8a2be59282faf (diff)
patch 9.0.1155: cannot use a class as a typev9.0.1155
Problem: Cannot use a class as a type. Solution: Accept a class and interface name as a type.
-rw-r--r--src/testdir/test_vim9_class.vim49
-rw-r--r--src/version.c2
-rw-r--r--src/vim9type.c24
3 files changed, 75 insertions, 0 deletions
diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim
index f8fb494c41..2f2f62ac88 100644
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -665,5 +665,54 @@ def Test_class_implements_interface()
v9.CheckScriptFailure(lines, 'E1349: Function "Methods" of interface "Some" not implemented')
enddef
+def Test_class_used_as_type()
+ var lines =<< trim END
+ vim9script
+
+ class Point
+ this.x = 0
+ this.y = 0
+ endclass
+
+ var p: Point
+ p = Point.new(2, 33)
+ assert_equal(2, p.x)
+ assert_equal(33, p.y)
+ END
+ v9.CheckScriptSuccess(lines)
+
+ lines =<< trim END
+ vim9script
+
+ interface HasX
+ this.x: number
+ endinterface
+
+ class Point implements HasX
+ this.x = 0
+ this.y = 0
+ endclass
+
+ var p: Point
+ p = Point.new(2, 33)
+ var hx = p
+ assert_equal(2, hx.x)
+ END
+ v9.CheckScriptSuccess(lines)
+
+ lines =<< trim END
+ vim9script
+
+ class Point
+ this.x = 0
+ this.y = 0
+ endclass
+
+ var p: Point
+ p = 'text'
+ END
+ v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected object but got string')
+enddef
+
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/version.c b/src/version.c
index 4352c83b21..57143ec9b8 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1155,
+/**/
1154,
/**/
1153,
diff --git a/src/vim9type.c b/src/vim9type.c
index c85c3f6c7d..1078861674 100644
--- a/src/vim9type.c
+++ b/src/vim9type.c
@@ -1272,6 +1272,30 @@ parse_type(char_u **arg, garray_T *type_gap, int give_error)
break;
}
+ // It can be a class or interface name.
+ typval_T tv;
+ tv.v_type = VAR_UNKNOWN;
+ if (eval_variable(*arg, len, 0, &tv, NULL,
+ EVAL_VAR_VERBOSE + EVAL_VAR_IMPORT) == OK)
+ {
+ if (tv.v_type == VAR_CLASS && tv.vval.v_class != NULL)
+ {
+ type_T *type = get_type_ptr(type_gap);
+ if (type != NULL)
+ {
+ // Although the name is that of a class or interface, the type
+ // uses will be an object.
+ type->tt_type = VAR_OBJECT;
+ type->tt_member = (type_T *)tv.vval.v_class;
+ clear_tv(&tv);
+ *arg += len;
+ return type;
+ }
+ }
+
+ clear_tv(&tv);
+ }
+
if (give_error)
semsg(_(e_type_not_recognized_str), *arg);
return NULL;