annotate src/vim9class.c @ 31639:62237ea155d9 v9.0.1152

patch 9.0.1152: class "implements" argument not implemented Commit: https://github.com/vim/vim/commit/94674f2223aafeaa4690f25e12f3ebe07814c5ba Author: Bram Moolenaar <Bram@vim.org> Date: Fri Jan 6 18:42:20 2023 +0000 patch 9.0.1152: class "implements" argument not implemented Problem: Class "implements" argument not implemented. Solution: Implement "implements" argument. Add basic checks for when a class implements an interface.
author Bram Moolenaar <Bram@vim.org>
date Fri, 06 Jan 2023 19:45:05 +0100
parents 5c1b7a87466e
children 88aa7f62cc78
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
31335
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2 *
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4 *
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
8 */
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
9
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
10 /*
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11 * vim9class.c: Vim9 script class support
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
12 */
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
13
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
14 #define USING_FLOAT_STUFF
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15 #include "vim.h"
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
16
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
17 #if defined(FEAT_EVAL) || defined(PROTO)
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
18
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
19 // When not generating protos this is included in proto.h
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
20 #ifdef PROTO
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
21 # include "vim9.h"
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
22 #endif
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
23
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
24 /*
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
25 * Parse a member declaration, both object and class member.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
26 * Returns OK or FAIL. When OK then "varname_end" is set to just after the
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
27 * variable name and "type_ret" is set to the decleared or detected type.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
28 * "init_expr" is set to the initialisation expression (allocated), if there is
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
29 * one. For an interface "init_expr" is NULL.
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
30 */
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
31 static int
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
32 parse_member(
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
33 exarg_T *eap,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
34 char_u *line,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
35 char_u *varname,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
36 int has_public, // TRUE if "public" seen before "varname"
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
37 char_u **varname_end,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
38 garray_T *type_list,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
39 type_T **type_ret,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
40 char_u **init_expr)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
41 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
42 *varname_end = to_name_end(varname, FALSE);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
43 if (*varname == '_' && has_public)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
44 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
45 semsg(_(e_public_member_name_cannot_start_with_underscore_str), line);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
46 return FAIL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
47 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
48
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
49 char_u *colon = skipwhite(*varname_end);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
50 char_u *type_arg = colon;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
51 type_T *type = NULL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
52 if (*colon == ':')
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
53 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
54 if (VIM_ISWHITE(**varname_end))
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
55 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
56 semsg(_(e_no_white_space_allowed_before_colon_str), varname);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
57 return FAIL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
58 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
59 if (!VIM_ISWHITE(colon[1]))
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
60 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
61 semsg(_(e_white_space_required_after_str_str), ":", varname);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
62 return FAIL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
63 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
64 type_arg = skipwhite(colon + 1);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
65 type = parse_type(&type_arg, type_list, TRUE);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
66 if (type == NULL)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
67 return FAIL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
68 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
69
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
70 char_u *expr_start = skipwhite(type_arg);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
71 char_u *expr_end = expr_start;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
72 if (type == NULL && *expr_start != '=')
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
73 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
74 emsg(_(e_type_or_initialization_required));
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
75 return FAIL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
76 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
77
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
78 if (*expr_start == '=')
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
79 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
80 if (!VIM_ISWHITE(expr_start[-1]) || !VIM_ISWHITE(expr_start[1]))
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
81 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
82 semsg(_(e_white_space_required_before_and_after_str_at_str),
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
83 "=", type_arg);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
84 return FAIL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
85 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
86 expr_start = skipwhite(expr_start + 1);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
87
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
88 expr_end = expr_start;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
89 evalarg_T evalarg;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
90 fill_evalarg_from_eap(&evalarg, eap, FALSE);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
91 skip_expr(&expr_end, NULL);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
92
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
93 if (type == NULL)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
94 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
95 // No type specified, use the type of the initializer.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
96 typval_T tv;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
97 tv.v_type = VAR_UNKNOWN;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
98 char_u *expr = expr_start;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
99 int res = eval0(expr, &tv, eap, &evalarg);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
100
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
101 if (res == OK)
31608
8e965e5a46c9 patch 9.0.1136: memory leak when getting class member type from expr
Bram Moolenaar <Bram@vim.org>
parents: 31592
diff changeset
102 {
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
103 type = typval2type(&tv, get_copyID(), type_list,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
104 TVTT_DO_MEMBER);
31608
8e965e5a46c9 patch 9.0.1136: memory leak when getting class member type from expr
Bram Moolenaar <Bram@vim.org>
parents: 31592
diff changeset
105 clear_tv(&tv);
8e965e5a46c9 patch 9.0.1136: memory leak when getting class member type from expr
Bram Moolenaar <Bram@vim.org>
parents: 31592
diff changeset
106 }
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
107 if (type == NULL)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
108 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
109 semsg(_(e_cannot_get_object_member_type_from_initializer_str),
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
110 expr_start);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
111 clear_evalarg(&evalarg, NULL);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
112 return FAIL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
113 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
114 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
115 clear_evalarg(&evalarg, NULL);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
116 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
117 if (!valid_declaration_type(type))
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
118 return FAIL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
119
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
120 *type_ret = type;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
121 if (expr_end > expr_start)
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
122 {
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
123 if (init_expr == NULL)
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
124 {
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
125 emsg(_(e_cannot_initialize_member_in_interface));
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
126 return FAIL;
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
127 }
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
128 *init_expr = vim_strnsave(expr_start, expr_end - expr_start);
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
129 }
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
130 return OK;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
131 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
132
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
133 /*
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
134 * Add a member to an object or a class.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
135 * Returns OK when successful, "init_expr" will be consumed then.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
136 * Returns FAIL otherwise, caller might need to free "init_expr".
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
137 */
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
138 static int
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
139 add_member(
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
140 garray_T *gap,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
141 char_u *varname,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
142 char_u *varname_end,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
143 int has_public,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
144 type_T *type,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
145 char_u *init_expr)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
146 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
147 if (ga_grow(gap, 1) == FAIL)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
148 return FAIL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
149 ocmember_T *m = ((ocmember_T *)gap->ga_data) + gap->ga_len;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
150 m->ocm_name = vim_strnsave(varname, varname_end - varname);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
151 m->ocm_access = has_public ? ACCESS_ALL
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
152 : *varname == '_' ? ACCESS_PRIVATE : ACCESS_READ;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
153 m->ocm_type = type;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
154 if (init_expr != NULL)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
155 m->ocm_init = init_expr;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
156 ++gap->ga_len;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
157 return OK;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
158 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
159
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
160 /*
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
161 * Move the class or object members found while parsing a class into the class.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
162 * "gap" contains the found members.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
163 * "members" will be set to the newly allocated array of members and
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
164 * "member_count" set to the number of members.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
165 * Returns OK or FAIL.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
166 */
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
167 static int
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
168 add_members_to_class(
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
169 garray_T *gap,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
170 ocmember_T **members,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
171 int *member_count)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
172 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
173 *member_count = gap->ga_len;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
174 *members = gap->ga_len == 0 ? NULL : ALLOC_MULT(ocmember_T, gap->ga_len);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
175 if (gap->ga_len > 0 && *members == NULL)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
176 return FAIL;
31487
df58407c97f3 patch 9.0.1076: ASAN complains about NULL argument
Bram Moolenaar <Bram@vim.org>
parents: 31483
diff changeset
177 if (gap->ga_len > 0)
df58407c97f3 patch 9.0.1076: ASAN complains about NULL argument
Bram Moolenaar <Bram@vim.org>
parents: 31483
diff changeset
178 mch_memmove(*members, gap->ga_data, sizeof(ocmember_T) * gap->ga_len);
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
179 VIM_CLEAR(gap->ga_data);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
180 return OK;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
181 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
182
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
183 /*
31335
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
184 * Handle ":class" and ":abstract class" up to ":endclass".
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
185 * Handle ":interface" up to ":endinterface".
31335
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
186 */
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
187 void
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
188 ex_class(exarg_T *eap)
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
189 {
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
190 int is_class = eap->cmdidx == CMD_class; // FALSE for :interface
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
191
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
192 if (!current_script_is_vim9()
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
193 || (cmdmod.cmod_flags & CMOD_LEGACY)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
194 || !getline_equal(eap->getline, eap->cookie, getsourceline))
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
195 {
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
196 if (is_class)
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
197 emsg(_(e_class_can_only_be_defined_in_vim9_script));
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
198 else
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
199 emsg(_(e_interface_can_only_be_defined_in_vim9_script));
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
200 return;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
201 }
31335
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
202
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
203 char_u *arg = eap->arg;
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
204 int is_abstract = eap->cmdidx == CMD_abstract;
31335
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
205 if (is_abstract)
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
206 {
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
207 if (STRNCMP(arg, "class", 5) != 0 || !VIM_ISWHITE(arg[5]))
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
208 {
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
209 semsg(_(e_invalid_argument_str), arg);
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
210 return;
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
211 }
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
212 arg = skipwhite(arg + 5);
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
213 }
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
214
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
215 if (!ASCII_ISUPPER(*arg))
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
216 {
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
217 if (is_class)
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
218 semsg(_(e_class_name_must_start_with_uppercase_letter_str), arg);
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
219 else
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
220 semsg(_(e_interface_name_must_start_with_uppercase_letter_str),
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
221 arg);
31335
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
222 return;
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
223 }
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
224 char_u *name_end = find_name_end(arg, NULL, NULL, FNE_CHECK_START);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
225 if (!IS_WHITE_OR_NUL(*name_end))
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
226 {
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
227 semsg(_(e_white_space_required_after_name_str), arg);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
228 return;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
229 }
31639
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
230 char_u *name_start = arg;
31335
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
231
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
232 // TODO:
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
233 // generics: <Tkey, Tentry>
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
234 // handle "is_export" if it is set
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
235
31639
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
236 // Names for "implements SomeInterface"
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
237 garray_T ga_impl;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
238 ga_init2(&ga_impl, sizeof(char_u *), 5);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
239
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
240 arg = skipwhite(name_end);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
241 while (*arg != NUL && *arg != '#' && *arg != '\n')
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
242 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
243 // TODO:
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
244 // extends SomeClass
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
245 // specifies SomeInterface
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
246 if (STRNCMP(arg, "implements", 10) == 0 && IS_WHITE_OR_NUL(arg[10]))
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
247 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
248 arg = skipwhite(arg + 10);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
249 char_u *impl_end = find_name_end(arg, NULL, NULL, FNE_CHECK_START);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
250 if (!IS_WHITE_OR_NUL(*impl_end))
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
251 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
252 semsg(_(e_white_space_required_after_name_str), arg);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
253 goto early_ret;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
254 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
255 char_u *iname = vim_strnsave(arg, impl_end - arg);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
256 if (iname == NULL)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
257 goto early_ret;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
258 if (ga_add_string(&ga_impl, iname) == FAIL)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
259 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
260 vim_free(iname);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
261 goto early_ret;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
262 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
263 arg = skipwhite(impl_end);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
264 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
265 else
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
266 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
267 semsg(_(e_trailing_characters_str), arg);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
268 early_ret:
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
269 ga_clear_strings(&ga_impl);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
270 return;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
271 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
272 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
273
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
274 garray_T type_list; // list of pointers to allocated types
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
275 ga_init2(&type_list, sizeof(type_T *), 10);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
276
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
277 // Growarray with class members declared in the class.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
278 garray_T classmembers;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
279 ga_init2(&classmembers, sizeof(ocmember_T), 10);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
280
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
281 // Growarray with functions declared in the class.
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
282 garray_T classfunctions;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
283 ga_init2(&classfunctions, sizeof(ufunc_T *), 10);
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
284
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
285 // Growarray with object members declared in the class.
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
286 garray_T objmembers;
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
287 ga_init2(&objmembers, sizeof(ocmember_T), 10);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
288
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
289 // Growarray with object methods declared in the class.
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
290 garray_T objmethods;
31416
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
291 ga_init2(&objmethods, sizeof(ufunc_T *), 10);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
292
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
293 /*
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
294 * Go over the body of the class/interface until "endclass" or
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
295 * "endinterface" is found.
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
296 */
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
297 char_u *theline = NULL;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
298 int success = FALSE;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
299 for (;;)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
300 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
301 vim_free(theline);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
302 theline = eap->getline(':', eap->cookie, 0, GETLINE_CONCAT_ALL);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
303 if (theline == NULL)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
304 break;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
305 char_u *line = skipwhite(theline);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
306
31501
560ba934725f patch 9.0.1083: empty and comment lines in a class cause an error
Bram Moolenaar <Bram@vim.org>
parents: 31487
diff changeset
307 // Skip empty and comment lines.
560ba934725f patch 9.0.1083: empty and comment lines in a class cause an error
Bram Moolenaar <Bram@vim.org>
parents: 31487
diff changeset
308 if (*line == NUL)
560ba934725f patch 9.0.1083: empty and comment lines in a class cause an error
Bram Moolenaar <Bram@vim.org>
parents: 31487
diff changeset
309 continue;
560ba934725f patch 9.0.1083: empty and comment lines in a class cause an error
Bram Moolenaar <Bram@vim.org>
parents: 31487
diff changeset
310 if (*line == '#')
560ba934725f patch 9.0.1083: empty and comment lines in a class cause an error
Bram Moolenaar <Bram@vim.org>
parents: 31487
diff changeset
311 {
560ba934725f patch 9.0.1083: empty and comment lines in a class cause an error
Bram Moolenaar <Bram@vim.org>
parents: 31487
diff changeset
312 if (vim9_bad_comment(line))
560ba934725f patch 9.0.1083: empty and comment lines in a class cause an error
Bram Moolenaar <Bram@vim.org>
parents: 31487
diff changeset
313 break;
560ba934725f patch 9.0.1083: empty and comment lines in a class cause an error
Bram Moolenaar <Bram@vim.org>
parents: 31487
diff changeset
314 continue;
560ba934725f patch 9.0.1083: empty and comment lines in a class cause an error
Bram Moolenaar <Bram@vim.org>
parents: 31487
diff changeset
315 }
560ba934725f patch 9.0.1083: empty and comment lines in a class cause an error
Bram Moolenaar <Bram@vim.org>
parents: 31487
diff changeset
316
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
317 char_u *p = line;
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
318 char *end_name = is_class ? "endclass" : "endinterface";
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
319 if (checkforcmd(&p, end_name, is_class ? 4 : 5))
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
320 {
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
321 if (STRNCMP(line, end_name, is_class ? 8 : 12) != 0)
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
322 semsg(_(e_command_cannot_be_shortened_str), line);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
323 else if (*p == '|' || !ends_excmd2(line, p))
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
324 semsg(_(e_trailing_characters_str), p);
31408
c82cb53474ee patch 9.0.1037: lalloc(0) error for a class without members
Bram Moolenaar <Bram@vim.org>
parents: 31404
diff changeset
325 else
c82cb53474ee patch 9.0.1037: lalloc(0) error for a class without members
Bram Moolenaar <Bram@vim.org>
parents: 31404
diff changeset
326 success = TRUE;
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
327 break;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
328 }
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
329 char *wrong_name = is_class ? "endinterface" : "endclass";
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
330 if (checkforcmd(&p, wrong_name, is_class ? 5 : 4))
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
331 {
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
332 semsg(_(e_invalid_command_str), line);
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
333 break;
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
334 }
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
335
31455
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
336 int has_public = FALSE;
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
337 if (checkforcmd(&p, "public", 3))
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
338 {
31455
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
339 if (STRNCMP(line, "public", 6) != 0)
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
340 {
31455
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
341 semsg(_(e_command_cannot_be_shortened_str), line);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
342 break;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
343 }
31455
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
344 has_public = TRUE;
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
345 p = skipwhite(line + 6);
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
346
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
347 if (STRNCMP(p, "this", 4) != 0 && STRNCMP(p, "static", 6) != 0)
31455
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
348 {
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
349 emsg(_(e_public_must_be_followed_by_this_or_static));
31455
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
350 break;
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
351 }
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
352 }
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
353
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
354 int has_static = FALSE;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
355 char_u *ps = p;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
356 if (checkforcmd(&p, "static", 4))
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
357 {
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
358 if (STRNCMP(ps, "static", 6) != 0)
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
359 {
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
360 semsg(_(e_command_cannot_be_shortened_str), ps);
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
361 break;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
362 }
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
363 has_static = TRUE;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
364 p = skipwhite(ps + 6);
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
365 }
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
366
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
367 // object members (public, read access, private):
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
368 // "this._varname"
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
369 // "this.varname"
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
370 // "public this.varname"
31455
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
371 if (STRNCMP(p, "this", 4) == 0)
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
372 {
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
373 if (p[4] != '.' || !eval_isnamec1(p[5]))
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
374 {
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
375 semsg(_(e_invalid_object_member_declaration_str), p);
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
376 break;
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
377 }
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
378 char_u *varname = p + 5;
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
379 char_u *varname_end = NULL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
380 type_T *type = NULL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
381 char_u *init_expr = NULL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
382 if (parse_member(eap, line, varname, has_public,
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
383 &varname_end, &type_list, &type,
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
384 is_class ? &init_expr: NULL) == FAIL)
31455
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
385 break;
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
386 if (add_member(&objmembers, varname, varname_end,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
387 has_public, type, init_expr) == FAIL)
31443
9ae3720f9bd9 patch 9.0.1054: object member can't get type from initializer
Bram Moolenaar <Bram@vim.org>
parents: 31441
diff changeset
388 {
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
389 vim_free(init_expr);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
390 break;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
391 }
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
392 }
31443
9ae3720f9bd9 patch 9.0.1054: object member can't get type from initializer
Bram Moolenaar <Bram@vim.org>
parents: 31441
diff changeset
393
31416
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
394 // constructors:
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
395 // def new()
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
396 // enddef
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
397 // def newOther()
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
398 // enddef
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
399 // object methods and class functions:
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
400 // def SomeMethod()
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
401 // enddef
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
402 // static def ClassFunction()
31416
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
403 // enddef
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
404 // TODO:
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
405 // def <Tval> someMethod()
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
406 // enddef
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
407 else if (checkforcmd(&p, "def", 3))
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
408 {
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
409 exarg_T ea;
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
410 garray_T lines_to_free;
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
411
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
412 // TODO: error for "public static def Func()"?
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
413
31416
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
414 CLEAR_FIELD(ea);
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
415 ea.cmd = line;
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
416 ea.arg = p;
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
417 ea.cmdidx = CMD_def;
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
418 ea.getline = eap->getline;
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
419 ea.cookie = eap->cookie;
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
420
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
421 ga_init2(&lines_to_free, sizeof(char_u *), 50);
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
422 ufunc_T *uf = define_function(&ea, NULL, &lines_to_free,
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
423 is_class ? CF_CLASS : CF_INTERFACE);
31416
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
424 ga_clear_strings(&lines_to_free);
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
425
31590
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
426 if (uf != NULL)
31416
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
427 {
31590
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
428 int is_new = STRNCMP(uf->uf_name, "new", 3) == 0;
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
429 garray_T *fgap = has_static || is_new
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
430 ? &classfunctions : &objmethods;
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
431 if (ga_grow(fgap, 1) == OK)
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
432 {
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
433 if (is_new)
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
434 uf->uf_flags |= FC_NEW;
31424
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
435
31590
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
436 ((ufunc_T **)fgap->ga_data)[fgap->ga_len] = uf;
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
437 ++fgap->ga_len;
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
438 }
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
439 }
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
440 }
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
441
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
442 // class members
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
443 else if (has_static)
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
444 {
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
445 // class members (public, read access, private):
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
446 // "static _varname"
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
447 // "static varname"
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
448 // "public static varname"
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
449 char_u *varname = p;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
450 char_u *varname_end = NULL;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
451 type_T *type = NULL;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
452 char_u *init_expr = NULL;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
453 if (parse_member(eap, line, varname, has_public,
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
454 &varname_end, &type_list, &type,
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
455 is_class ? &init_expr : NULL) == FAIL)
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
456 break;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
457 if (add_member(&classmembers, varname, varname_end,
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
458 has_public, type, init_expr) == FAIL)
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
459 {
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
460 vim_free(init_expr);
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
461 break;
31416
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
462 }
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
463 }
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
464
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
465 else
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
466 {
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
467 if (is_class)
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
468 semsg(_(e_not_valid_command_in_class_str), line);
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
469 else
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
470 semsg(_(e_not_valid_command_in_interface_str), line);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
471 break;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
472 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
473 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
474 vim_free(theline);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
475
31639
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
476 // Check a few things before defining the class.
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
477 if (success && ga_impl.ga_len > 0)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
478 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
479 // Check all "implements" entries are valid and correct.
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
480 for (int i = 0; i < ga_impl.ga_len && success; ++i)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
481 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
482 char_u *impl = ((char_u **)ga_impl.ga_data)[i];
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
483 typval_T tv;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
484 tv.v_type = VAR_UNKNOWN;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
485 if (eval_variable(impl, 0, 0, &tv, NULL,
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
486 EVAL_VAR_VERBOSE + EVAL_VAR_IMPORT) == FAIL)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
487 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
488 semsg(_(e_interface_name_not_found_str), impl);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
489 success = FALSE;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
490 break;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
491 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
492
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
493 if (tv.v_type != VAR_CLASS
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
494 || tv.vval.v_class == NULL
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
495 || (tv.vval.v_class->class_flags & CLASS_INTERFACE) == 0)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
496 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
497 semsg(_(e_not_valid_interface_str), impl);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
498 success = FALSE;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
499 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
500
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
501 // check the members of the interface match the members of the class
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
502 class_T *ifcl = tv.vval.v_class;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
503 for (int loop = 1; loop <= 2 && success; ++loop)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
504 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
505 // loop == 1: check class members
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
506 // loop == 2: check object members
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
507 int if_count = loop == 1 ? ifcl->class_class_member_count
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
508 : ifcl->class_obj_member_count;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
509 if (if_count == 0)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
510 continue;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
511 ocmember_T *if_ms = loop == 1 ? ifcl->class_class_members
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
512 : ifcl->class_obj_members;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
513 ocmember_T *cl_ms = (ocmember_T *)(loop == 1
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
514 ? classmembers.ga_data
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
515 : objmembers.ga_data);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
516 int cl_count = loop == 1 ? classmembers.ga_len
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
517 : objmembers.ga_len;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
518 for (int if_i = 0; if_i < if_count; ++if_i)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
519 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
520 int cl_i;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
521 for (cl_i = 0; cl_i < cl_count; ++cl_i)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
522 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
523 ocmember_T *m = &cl_ms[cl_i];
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
524 if (STRCMP(if_ms[if_i].ocm_name, m->ocm_name) == 0)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
525 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
526 // TODO: check type
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
527 break;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
528 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
529 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
530 if (cl_i == cl_count)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
531 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
532 semsg(_(e_member_str_of_interface_str_not_implemented),
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
533 if_ms[if_i].ocm_name, impl);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
534 success = FALSE;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
535 break;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
536 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
537 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
538 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
539
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
540 // check the functions/methods of the interface match the
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
541 // functions/methods of the class
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
542 for (int loop = 1; loop <= 2 && success; ++loop)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
543 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
544 // loop == 1: check class functions
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
545 // loop == 2: check object methods
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
546 int if_count = loop == 1 ? ifcl->class_class_function_count
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
547 : ifcl->class_obj_method_count;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
548 if (if_count == 0)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
549 continue;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
550 ufunc_T **if_fp = loop == 1 ? ifcl->class_class_functions
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
551 : ifcl->class_obj_methods;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
552 ufunc_T **cl_fp = (ufunc_T **)(loop == 1
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
553 ? classfunctions.ga_data
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
554 : objmethods.ga_data);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
555 int cl_count = loop == 1 ? classfunctions.ga_len
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
556 : objmethods.ga_len;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
557 for (int if_i = 0; if_i < if_count; ++if_i)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
558 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
559 char_u *if_name = if_fp[if_i]->uf_name;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
560 int cl_i;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
561 for (cl_i = 0; cl_i < cl_count; ++cl_i)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
562 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
563 char_u *cl_name = cl_fp[cl_i]->uf_name;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
564 if (STRCMP(if_name, cl_name) == 0)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
565 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
566 // TODO: check return and argument types
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
567 break;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
568 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
569 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
570 if (cl_i == cl_count)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
571 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
572 semsg(_(e_function_str_of_interface_str_not_implemented),
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
573 if_name, impl);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
574 success = FALSE;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
575 break;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
576 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
577 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
578 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
579
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
580 clear_tv(&tv);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
581 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
582 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
583
31447
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
584 class_T *cl = NULL;
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
585 if (success)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
586 {
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
587 // "endclass" encountered without failures: Create the class.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
588
31447
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
589 cl = ALLOC_CLEAR_ONE(class_T);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
590 if (cl == NULL)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
591 goto cleanup;
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
592 if (!is_class)
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
593 cl->class_flags = CLASS_INTERFACE;
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
594
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
595 cl->class_refcount = 1;
31639
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
596 cl->class_name = vim_strnsave(name_start, name_end - name_start);
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
597 if (cl->class_name == NULL)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
598 goto cleanup;
31335
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
599
31639
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
600 if (ga_impl.ga_len > 0)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
601 {
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
602 // Move the "implements" names into the class.
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
603 cl->class_interface_count = ga_impl.ga_len;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
604 cl->class_interfaces = ALLOC_MULT(char_u *, ga_impl.ga_len);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
605 if (cl->class_interfaces == NULL)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
606 goto cleanup;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
607 for (int i = 0; i < ga_impl.ga_len; ++i)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
608 cl->class_interfaces[i] = ((char_u **)ga_impl.ga_data)[i];
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
609 CLEAR_POINTER(ga_impl.ga_data);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
610 ga_impl.ga_len = 0;
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
611 }
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
612
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
613 // Add class and object members to "cl".
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
614 if (add_members_to_class(&classmembers,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
615 &cl->class_class_members,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
616 &cl->class_class_member_count) == FAIL
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
617 || add_members_to_class(&objmembers,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
618 &cl->class_obj_members,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
619 &cl->class_obj_member_count) == FAIL)
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
620 goto cleanup;
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
621
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
622 if (is_class && cl->class_class_member_count > 0)
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
623 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
624 // Allocate a typval for each class member and initialize it.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
625 cl->class_members_tv = ALLOC_CLEAR_MULT(typval_T,
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
626 cl->class_class_member_count);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
627 if (cl->class_members_tv != NULL)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
628 for (int i = 0; i < cl->class_class_member_count; ++i)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
629 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
630 ocmember_T *m = &cl->class_class_members[i];
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
631 typval_T *tv = &cl->class_members_tv[i];
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
632 if (m->ocm_init != NULL)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
633 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
634 typval_T *etv = eval_expr(m->ocm_init, eap);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
635 if (etv != NULL)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
636 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
637 *tv = *etv;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
638 vim_free(etv);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
639 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
640 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
641 else
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
642 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
643 // TODO: proper default value
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
644 tv->v_type = m->ocm_type->tt_type;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
645 tv->vval.v_string = NULL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
646 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
647 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
648 }
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
649
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
650 int have_new = FALSE;
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
651 for (int i = 0; i < classfunctions.ga_len; ++i)
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
652 if (STRCMP(((ufunc_T **)classfunctions.ga_data)[i]->uf_name,
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
653 "new") == 0)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
654 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
655 have_new = TRUE;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
656 break;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
657 }
31639
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
658 if (is_class && !have_new)
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
659 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
660 // No new() method was defined, add the default constructor.
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
661 garray_T fga;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
662 ga_init2(&fga, 1, 1000);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
663 ga_concat(&fga, (char_u *)"new(");
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
664 for (int i = 0; i < cl->class_obj_member_count; ++i)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
665 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
666 if (i > 0)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
667 ga_concat(&fga, (char_u *)", ");
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
668 ga_concat(&fga, (char_u *)"this.");
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
669 ocmember_T *m = cl->class_obj_members + i;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
670 ga_concat(&fga, (char_u *)m->ocm_name);
31441
e572ff386670 patch 9.0.1053: default constructor arguments are not optional
Bram Moolenaar <Bram@vim.org>
parents: 31424
diff changeset
671 ga_concat(&fga, (char_u *)" = v:none");
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
672 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
673 ga_concat(&fga, (char_u *)")\nenddef\n");
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
674 ga_append(&fga, NUL);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
675
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
676 exarg_T fea;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
677 CLEAR_FIELD(fea);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
678 fea.cmdidx = CMD_def;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
679 fea.cmd = fea.arg = fga.ga_data;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
680
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
681 garray_T lines_to_free;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
682 ga_init2(&lines_to_free, sizeof(char_u *), 50);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
683
31635
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
684 ufunc_T *nf = define_function(&fea, NULL, &lines_to_free,
5c1b7a87466e patch 9.0.1150: :interface is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31608
diff changeset
685 is_class ? CF_CLASS : CF_INTERFACE);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
686
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
687 ga_clear_strings(&lines_to_free);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
688 vim_free(fga.ga_data);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
689
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
690 if (nf != NULL && ga_grow(&classfunctions, 1) == OK)
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
691 {
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
692 ((ufunc_T **)classfunctions.ga_data)[classfunctions.ga_len] = nf;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
693 ++classfunctions.ga_len;
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
694
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
695 nf->uf_flags |= FC_NEW;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
696 nf->uf_ret_type = get_type_ptr(&type_list);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
697 if (nf->uf_ret_type != NULL)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
698 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
699 nf->uf_ret_type->tt_type = VAR_OBJECT;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
700 nf->uf_ret_type->tt_member = (type_T *)cl;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
701 nf->uf_ret_type->tt_argcount = 0;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
702 nf->uf_ret_type->tt_args = NULL;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
703 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
704 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
705 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
706
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
707 // loop 1: class functions, loop 2: object methods
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
708 for (int loop = 1; loop <= 2; ++loop)
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
709 {
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
710 garray_T *gap = loop == 1 ? &classfunctions : &objmethods;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
711 int *fcount = loop == 1 ? &cl->class_class_function_count
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
712 : &cl->class_obj_method_count;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
713 ufunc_T ***fup = loop == 1 ? &cl->class_class_functions
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
714 : &cl->class_obj_methods;
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
715
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
716 *fcount = gap->ga_len;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
717 if (gap->ga_len == 0)
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
718 {
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
719 *fup = NULL;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
720 continue;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
721 }
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
722 *fup = ALLOC_MULT(ufunc_T *, gap->ga_len);
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
723 if (*fup == NULL)
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
724 goto cleanup;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
725 mch_memmove(*fup, gap->ga_data, sizeof(ufunc_T *) * gap->ga_len);
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
726 vim_free(gap->ga_data);
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
727
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
728 // Set the class pointer on all the object methods.
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
729 for (int i = 0; i < gap->ga_len; ++i)
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
730 {
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
731 ufunc_T *fp = (*fup)[i];
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
732 fp->uf_class = cl;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
733 if (loop == 2)
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
734 fp->uf_flags |= FC_OBJECT;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
735 }
31416
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
736 }
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
737
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
738 cl->class_type.tt_type = VAR_CLASS;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
739 cl->class_type.tt_member = (type_T *)cl;
31416
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
740 cl->class_object_type.tt_type = VAR_OBJECT;
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
741 cl->class_object_type.tt_member = (type_T *)cl;
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
742 cl->class_type_list = type_list;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
743
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
744 // TODO:
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
745 // - Fill hashtab with object members and methods ?
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
746
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
747 // Add the class to the script-local variables.
31639
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
748 // TODO: handle other context, e.g. in a function
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
749 typval_T tv;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
750 tv.v_type = VAR_CLASS;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
751 tv.vval.v_class = cl;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
752 set_var_const(cl->class_name, current_sctx.sc_sid,
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
753 NULL, &tv, FALSE, ASSIGN_DECL, 0);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
754 return;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
755 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
756
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
757 cleanup:
31447
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
758 if (cl != NULL)
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
759 {
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
760 vim_free(cl->class_name);
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
761 vim_free(cl->class_class_functions);
31447
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
762 vim_free(cl->class_obj_members);
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
763 vim_free(cl->class_obj_methods);
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
764 vim_free(cl);
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
765 }
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
766
31639
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
767 ga_clear_strings(&ga_impl);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
768
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
769 for (int round = 1; round <= 2; ++round)
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
770 {
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
771 garray_T *gap = round == 1 ? &classmembers : &objmembers;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
772 if (gap->ga_len == 0 || gap->ga_data == NULL)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
773 continue;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
774
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
775 for (int i = 0; i < gap->ga_len; ++i)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
776 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
777 ocmember_T *m = ((ocmember_T *)gap->ga_data) + i;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
778 vim_free(m->ocm_name);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
779 vim_free(m->ocm_init);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
780 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
781 ga_clear(gap);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
782 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
783
31416
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
784 for (int i = 0; i < objmethods.ga_len; ++i)
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
785 {
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
786 ufunc_T *uf = ((ufunc_T **)objmethods.ga_data)[i];
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
787 func_clear_free(uf, FALSE);
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
788 }
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
789 ga_clear(&objmethods);
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
790
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
791 for (int i = 0; i < classfunctions.ga_len; ++i)
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
792 {
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
793 ufunc_T *uf = ((ufunc_T **)classfunctions.ga_data)[i];
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
794 func_clear_free(uf, FALSE);
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
795 }
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
796 ga_clear(&classfunctions);
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
797
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
798 clear_type_list(&type_list);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
799 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
800
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
801 /*
31517
cd5247f4da06 patch 9.0.1091: assignment to non-existing member causes a crash
Bram Moolenaar <Bram@vim.org>
parents: 31501
diff changeset
802 * Find member "name" in class "cl", set "member_idx" to the member index and
cd5247f4da06 patch 9.0.1091: assignment to non-existing member causes a crash
Bram Moolenaar <Bram@vim.org>
parents: 31501
diff changeset
803 * return its type.
cd5247f4da06 patch 9.0.1091: assignment to non-existing member causes a crash
Bram Moolenaar <Bram@vim.org>
parents: 31501
diff changeset
804 * When not found "member_idx" is set to -1 and t_any is returned.
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
805 */
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
806 type_T *
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
807 class_member_type(
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
808 class_T *cl,
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
809 char_u *name,
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
810 char_u *name_end,
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
811 int *member_idx)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
812 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
813 *member_idx = -1; // not found (yet)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
814 size_t len = name_end - name;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
815
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
816 for (int i = 0; i < cl->class_obj_member_count; ++i)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
817 {
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
818 ocmember_T *m = cl->class_obj_members + i;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
819 if (STRNCMP(m->ocm_name, name, len) == 0 && m->ocm_name[len] == NUL)
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
820 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
821 *member_idx = i;
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
822 return m->ocm_type;
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
823 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
824 }
31517
cd5247f4da06 patch 9.0.1091: assignment to non-existing member causes a crash
Bram Moolenaar <Bram@vim.org>
parents: 31501
diff changeset
825
cd5247f4da06 patch 9.0.1091: assignment to non-existing member causes a crash
Bram Moolenaar <Bram@vim.org>
parents: 31501
diff changeset
826 semsg(_(e_unknown_variable_str), name);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
827 return &t_any;
31335
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
828 }
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
829
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
830 /*
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
831 * Handle ":enum" up to ":endenum".
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
832 */
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
833 void
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
834 ex_enum(exarg_T *eap UNUSED)
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
835 {
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
836 // TODO
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
837 }
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
838
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
839 /*
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
840 * Handle ":type".
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
841 */
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
842 void
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
843 ex_type(exarg_T *eap UNUSED)
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
844 {
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
845 // TODO
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
846 }
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
847
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
848 /*
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
849 * Evaluate what comes after a class:
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
850 * - class member: SomeClass.varname
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
851 * - class function: SomeClass.SomeMethod()
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
852 * - class constructor: SomeClass.new()
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
853 * - object member: someObject.varname
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
854 * - object method: someObject.SomeMethod()
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
855 *
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
856 * "*arg" points to the '.'.
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
857 * "*arg" is advanced to after the member name or method call.
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
858 *
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
859 * Returns FAIL or OK.
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
860 */
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
861 int
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
862 class_object_index(
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
863 char_u **arg,
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
864 typval_T *rettv,
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
865 evalarg_T *evalarg,
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
866 int verbose UNUSED) // give error messages
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
867 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
868 // int evaluate = evalarg != NULL
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
869 // && (evalarg->eval_flags & EVAL_EVALUATE);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
870
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
871 if (VIM_ISWHITE((*arg)[1]))
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
872 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
873 semsg(_(e_no_white_space_allowed_after_str_str), ".", *arg);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
874 return FAIL;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
875 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
876
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
877 ++*arg;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
878 char_u *name = *arg;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
879 char_u *name_end = find_name_end(name, NULL, NULL, FNE_CHECK_START);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
880 if (name_end == name)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
881 return FAIL;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
882 size_t len = name_end - name;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
883
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
884 class_T *cl = rettv->v_type == VAR_CLASS ? rettv->vval.v_class
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
885 : rettv->vval.v_object->obj_class;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
886 if (*name_end == '(')
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
887 {
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
888 int on_class = rettv->v_type == VAR_CLASS;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
889 int count = on_class ? cl->class_class_function_count
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
890 : cl->class_obj_method_count;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
891 for (int i = 0; i < count; ++i)
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
892 {
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
893 ufunc_T *fp = on_class ? cl->class_class_functions[i]
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
894 : cl->class_obj_methods[i];
31418
462508d04341 patch 9.0.1042: ASAN gives false alarm about array access.
Bram Moolenaar <Bram@vim.org>
parents: 31416
diff changeset
895 // Use a separate pointer to avoid that ASAN complains about
462508d04341 patch 9.0.1042: ASAN gives false alarm about array access.
Bram Moolenaar <Bram@vim.org>
parents: 31416
diff changeset
896 // uf_name[] only being 4 characters.
462508d04341 patch 9.0.1042: ASAN gives false alarm about array access.
Bram Moolenaar <Bram@vim.org>
parents: 31416
diff changeset
897 char_u *ufname = (char_u *)fp->uf_name;
462508d04341 patch 9.0.1042: ASAN gives false alarm about array access.
Bram Moolenaar <Bram@vim.org>
parents: 31416
diff changeset
898 if (STRNCMP(name, ufname, len) == 0 && ufname[len] == NUL)
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
899 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
900 typval_T argvars[MAX_FUNC_ARGS + 1];
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
901 int argcount = 0;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
902
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
903 char_u *argp = name_end;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
904 int ret = get_func_arguments(&argp, evalarg, 0,
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
905 argvars, &argcount);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
906 if (ret == FAIL)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
907 return FAIL;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
908
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
909 funcexe_T funcexe;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
910 CLEAR_FIELD(funcexe);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
911 funcexe.fe_evaluate = TRUE;
31416
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
912 if (rettv->v_type == VAR_OBJECT)
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
913 {
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
914 funcexe.fe_object = rettv->vval.v_object;
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
915 ++funcexe.fe_object->obj_refcount;
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
916 }
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
917
31404
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
918 // Clear the class or object after calling the function, in
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
919 // case the refcount is one.
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
920 typval_T tv_tofree = *rettv;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
921 rettv->v_type = VAR_UNKNOWN;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
922
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
923 // Call the user function. Result goes into rettv;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
924 int error = call_user_func_check(fp, argcount, argvars,
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
925 rettv, &funcexe, NULL);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
926
31404
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
927 // Clear the previous rettv and the arguments.
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
928 clear_tv(&tv_tofree);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
929 for (int idx = 0; idx < argcount; ++idx)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
930 clear_tv(&argvars[idx]);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
931
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
932 if (error != FCERR_NONE)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
933 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
934 user_func_error(error, printable_func_name(fp),
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
935 funcexe.fe_found_var);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
936 return FAIL;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
937 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
938 *arg = argp;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
939 return OK;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
940 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
941 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
942
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
943 semsg(_(e_method_not_found_on_class_str_str), cl->class_name, name);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
944 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
945
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
946 else if (rettv->v_type == VAR_OBJECT)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
947 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
948 for (int i = 0; i < cl->class_obj_member_count; ++i)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
949 {
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
950 ocmember_T *m = &cl->class_obj_members[i];
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
951 if (STRNCMP(name, m->ocm_name, len) == 0 && m->ocm_name[len] == NUL)
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
952 {
31455
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
953 if (*name == '_')
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
954 {
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
955 semsg(_(e_cannot_access_private_member_str), m->ocm_name);
31455
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
956 return FAIL;
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
957 }
5ef28f5ff357 patch 9.0.1060: private and public object members are not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31447
diff changeset
958
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
959 // The object only contains a pointer to the class, the member
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
960 // values array follows right after that.
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
961 object_T *obj = rettv->vval.v_object;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
962 typval_T *tv = (typval_T *)(obj + 1) + i;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
963 copy_tv(tv, rettv);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
964 object_unref(obj);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
965
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
966 *arg = name_end;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
967 return OK;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
968 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
969 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
970
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
971 semsg(_(e_member_not_found_on_object_str_str), cl->class_name, name);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
972 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
973
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
974 else if (rettv->v_type == VAR_CLASS)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
975 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
976 // class member
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
977 for (int i = 0; i < cl->class_class_member_count; ++i)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
978 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
979 ocmember_T *m = &cl->class_class_members[i];
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
980 if (STRNCMP(name, m->ocm_name, len) == 0 && m->ocm_name[len] == NUL)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
981 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
982 if (*name == '_')
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
983 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
984 semsg(_(e_cannot_access_private_member_str), m->ocm_name);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
985 return FAIL;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
986 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
987
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
988 typval_T *tv = &cl->class_members_tv[i];
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
989 copy_tv(tv, rettv);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
990 class_unref(cl);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
991
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
992 *arg = name_end;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
993 return OK;
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
994 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
995 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
996
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
997 semsg(_(e_member_not_found_on_class_str_str), cl->class_name, name);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
998 }
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
999
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1000 return FAIL;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1001 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1002
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1003 /*
31424
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1004 * If "arg" points to a class or object method, return it.
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1005 * Otherwise return NULL.
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1006 */
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1007 ufunc_T *
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1008 find_class_func(char_u **arg)
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1009 {
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1010 char_u *name = *arg;
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1011 char_u *name_end = find_name_end(name, NULL, NULL, FNE_CHECK_START);
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1012 if (name_end == name || *name_end != '.')
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1013 return NULL;
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1014
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1015 size_t len = name_end - name;
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1016 typval_T tv;
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1017 tv.v_type = VAR_UNKNOWN;
31592
65a2bae18b27 patch 9.0.1128: build failure
Bram Moolenaar <Bram@vim.org>
parents: 31590
diff changeset
1018 if (eval_variable(name, (int)len,
65a2bae18b27 patch 9.0.1128: build failure
Bram Moolenaar <Bram@vim.org>
parents: 31590
diff changeset
1019 0, &tv, NULL, EVAL_VAR_NOAUTOLOAD) == FAIL)
31424
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1020 return NULL;
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1021 if (tv.v_type != VAR_CLASS && tv.v_type != VAR_OBJECT)
31447
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
1022 goto fail_after_eval;
31424
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1023
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1024 class_T *cl = tv.v_type == VAR_CLASS ? tv.vval.v_class
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1025 : tv.vval.v_object->obj_class;
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1026 if (cl == NULL)
31447
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
1027 goto fail_after_eval;
31424
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1028 char_u *fname = name_end + 1;
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1029 char_u *fname_end = find_name_end(fname, NULL, NULL, FNE_CHECK_START);
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1030 if (fname_end == fname)
31447
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
1031 goto fail_after_eval;
31424
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1032 len = fname_end - fname;
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1033
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1034 int count = tv.v_type == VAR_CLASS ? cl->class_class_function_count
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1035 : cl->class_obj_method_count;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1036 ufunc_T **funcs = tv.v_type == VAR_CLASS ? cl->class_class_functions
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1037 : cl->class_obj_methods;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1038 for (int i = 0; i < count; ++i)
31424
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1039 {
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1040 ufunc_T *fp = funcs[i];
31424
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1041 // Use a separate pointer to avoid that ASAN complains about
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1042 // uf_name[] only being 4 characters.
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1043 char_u *ufname = (char_u *)fp->uf_name;
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1044 if (STRNCMP(fname, ufname, len) == 0 && ufname[len] == NUL)
31447
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
1045 {
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
1046 clear_tv(&tv);
31424
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1047 return fp;
31447
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
1048 }
31424
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1049 }
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1050
31447
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
1051 fail_after_eval:
8cb31f7ac9e2 patch 9.0.1056: leaking memory when disassembling an object method
Bram Moolenaar <Bram@vim.org>
parents: 31443
diff changeset
1052 clear_tv(&tv);
31424
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1053 return NULL;
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1054 }
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1055
e31fc75f6aff patch 9.0.1045: in a class object members cannot be initialized
Bram Moolenaar <Bram@vim.org>
parents: 31418
diff changeset
1056 /*
31590
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1057 * If "name[len]" is a class member in cctx->ctx_ufunc->uf_class return the
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1058 * index in class.class_class_members[].
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1059 * If "cl_ret" is not NULL set it to the class.
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1060 * Otherwise return -1;
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1061 */
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1062 int
31590
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1063 class_member_index(char_u *name, size_t len, class_T **cl_ret, cctx_T *cctx)
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1064 {
31590
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1065 if (cctx == NULL || cctx->ctx_ufunc == NULL
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1066 || cctx->ctx_ufunc->uf_class == NULL)
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1067 return -1;
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1068 class_T *cl = cctx->ctx_ufunc->uf_class;
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1069
31590
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1070 for (int i = 0; i < cl->class_class_member_count; ++i)
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1071 {
31590
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1072 ocmember_T *m = &cl->class_class_members[i];
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1073 if (STRNCMP(name, m->ocm_name, len) == 0 && m->ocm_name[len] == NUL)
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1074 {
31590
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1075 if (cl_ret != NULL)
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1076 *cl_ret = cl;
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1077 return i;
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1078 }
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1079 }
31590
aee868b9229a patch 9.0.1127: no error if function argument shadows class member
Bram Moolenaar <Bram@vim.org>
parents: 31586
diff changeset
1080 return -1;
31582
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1081 }
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1082
8bbc932fbd09 patch 9.0.1123: class function not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31517
diff changeset
1083 /*
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1084 * Make a copy of an object.
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1085 */
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1086 void
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1087 copy_object(typval_T *from, typval_T *to)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1088 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1089 *to = *from;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1090 if (to->vval.v_object != NULL)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1091 ++to->vval.v_object->obj_refcount;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1092 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1093
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1094 /*
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1095 * Free an object.
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1096 */
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1097 static void
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1098 object_clear(object_T *obj)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1099 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1100 class_T *cl = obj->obj_class;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1101
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1102 // the member values are just after the object structure
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1103 typval_T *tv = (typval_T *)(obj + 1);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1104 for (int i = 0; i < cl->class_obj_member_count; ++i)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1105 clear_tv(tv + i);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1106
31404
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1107 // Remove from the list headed by "first_object".
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1108 object_cleared(obj);
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1109
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1110 vim_free(obj);
31404
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1111 class_unref(cl);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1112 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1113
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1114 /*
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1115 * Unreference an object.
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1116 */
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1117 void
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1118 object_unref(object_T *obj)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1119 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1120 if (obj != NULL && --obj->obj_refcount <= 0)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1121 object_clear(obj);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1122 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1123
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1124 /*
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1125 * Make a copy of a class.
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1126 */
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1127 void
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1128 copy_class(typval_T *from, typval_T *to)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1129 {
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1130 *to = *from;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1131 if (to->vval.v_class != NULL)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1132 ++to->vval.v_class->class_refcount;
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1133 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1134
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1135 /*
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1136 * Unreference a class. Free it when the reference count goes down to zero.
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1137 */
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1138 void
31404
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1139 class_unref(class_T *cl)
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1140 {
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1141 if (cl != NULL && --cl->class_refcount <= 0 && cl->class_name != NULL)
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1142 {
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1143 // Freeing what the class contains may recursively come back here.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1144 // Clear "class_name" first, if it is NULL the class does not need to
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1145 // be freed.
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1146 VIM_CLEAR(cl->class_name);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1147
31639
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
1148 for (int i = 0; i < cl->class_interface_count; ++i)
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
1149 vim_free(((char_u **)cl->class_interfaces)[i]);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
1150 vim_free(cl->class_interfaces);
62237ea155d9 patch 9.0.1152: class "implements" argument not implemented
Bram Moolenaar <Bram@vim.org>
parents: 31635
diff changeset
1151
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1152 for (int i = 0; i < cl->class_class_member_count; ++i)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1153 {
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1154 ocmember_T *m = &cl->class_class_members[i];
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1155 vim_free(m->ocm_name);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1156 vim_free(m->ocm_init);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1157 if (cl->class_members_tv != NULL)
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1158 clear_tv(&cl->class_members_tv[i]);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1159 }
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1160 vim_free(cl->class_class_members);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1161 vim_free(cl->class_members_tv);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1162
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1163 for (int i = 0; i < cl->class_obj_member_count; ++i)
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1164 {
31483
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1165 ocmember_T *m = &cl->class_obj_members[i];
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1166 vim_free(m->ocm_name);
1bebc2093e6b patch 9.0.1074: class members are not supported yet
Bram Moolenaar <Bram@vim.org>
parents: 31455
diff changeset
1167 vim_free(m->ocm_init);
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1168 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1169 vim_free(cl->class_obj_members);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1170
31586
f36f920bad1a patch 9.0.1125: memory leak when using class functions
Bram Moolenaar <Bram@vim.org>
parents: 31582
diff changeset
1171 for (int i = 0; i < cl->class_class_function_count; ++i)
f36f920bad1a patch 9.0.1125: memory leak when using class functions
Bram Moolenaar <Bram@vim.org>
parents: 31582
diff changeset
1172 {
f36f920bad1a patch 9.0.1125: memory leak when using class functions
Bram Moolenaar <Bram@vim.org>
parents: 31582
diff changeset
1173 ufunc_T *uf = cl->class_class_functions[i];
f36f920bad1a patch 9.0.1125: memory leak when using class functions
Bram Moolenaar <Bram@vim.org>
parents: 31582
diff changeset
1174 func_clear_free(uf, FALSE);
f36f920bad1a patch 9.0.1125: memory leak when using class functions
Bram Moolenaar <Bram@vim.org>
parents: 31582
diff changeset
1175 }
f36f920bad1a patch 9.0.1125: memory leak when using class functions
Bram Moolenaar <Bram@vim.org>
parents: 31582
diff changeset
1176 vim_free(cl->class_class_functions);
f36f920bad1a patch 9.0.1125: memory leak when using class functions
Bram Moolenaar <Bram@vim.org>
parents: 31582
diff changeset
1177
31416
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
1178 for (int i = 0; i < cl->class_obj_method_count; ++i)
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
1179 {
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
1180 ufunc_T *uf = cl->class_obj_methods[i];
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
1181 func_clear_free(uf, FALSE);
f088f1d97eee patch 9.0.1041: cannot define a method in a class
Bram Moolenaar <Bram@vim.org>
parents: 31408
diff changeset
1182 }
31396
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1183 vim_free(cl->class_obj_methods);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1184
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1185 clear_type_list(&cl->class_type_list);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1186
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1187 vim_free(cl);
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1188 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1189 }
307f68a41b03 patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 31335
diff changeset
1190
31404
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1191 static object_T *first_object = NULL;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1192
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1193 /*
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1194 * Call this function when an object has been created. It will be added to the
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1195 * list headed by "first_object".
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1196 */
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1197 void
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1198 object_created(object_T *obj)
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1199 {
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1200 if (first_object != NULL)
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1201 {
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1202 obj->obj_next_used = first_object;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1203 first_object->obj_prev_used = obj;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1204 }
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1205 first_object = obj;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1206 }
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1207
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1208 /*
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1209 * Call this function when an object has been cleared and is about to be freed.
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1210 * It is removed from the list headed by "first_object".
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1211 */
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1212 void
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1213 object_cleared(object_T *obj)
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1214 {
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1215 if (obj->obj_next_used != NULL)
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1216 obj->obj_next_used->obj_prev_used = obj->obj_prev_used;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1217 if (obj->obj_prev_used != NULL)
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1218 obj->obj_prev_used->obj_next_used = obj->obj_next_used;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1219 else if (first_object == obj)
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1220 first_object = obj->obj_next_used;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1221 }
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1222
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1223 /*
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1224 * Go through the list of all objects and free items without "copyID".
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1225 */
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1226 int
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1227 object_free_nonref(int copyID)
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1228 {
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1229 int did_free = FALSE;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1230 object_T *next_obj;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1231
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1232 for (object_T *obj = first_object; obj != NULL; obj = next_obj)
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1233 {
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1234 next_obj = obj->obj_next_used;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1235 if ((obj->obj_copyID & COPYID_MASK) != (copyID & COPYID_MASK))
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1236 {
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1237 // Free the object and items it contains.
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1238 object_clear(obj);
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1239 did_free = TRUE;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1240 }
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1241 }
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1242
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1243 return did_free;
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1244 }
60b1d266548d patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents: 31396
diff changeset
1245
31335
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1246
5acc0d2cf4f7 patch 9.0.1001: classes are not documented or implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1247 #endif // FEAT_EVAL