Mercurial > vim
annotate src/vim9class.c @ 33401:bb99820510ef v9.0.1959
patch 9.0.1959: Vim9: methods parameters and types are covariant
Commit: https://github.com/vim/vim/commit/f3b68d4759a040ed0c4844c279ea3c779b3863ff
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Fri Sep 29 22:50:02 2023 +0200
patch 9.0.1959: Vim9: methods parameters and types are covariant
Problem: Vim9: methods parameters and types are covariant
Solution: Support contra-variant type check for object method arguments
(similar to Dart).
closes: #12965
closes: #13221
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Fri, 29 Sep 2023 23:00:04 +0200 |
parents | 577ef266309d |
children | 97ceabebaeaf |
rev | line source |
---|---|
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2 * |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
3 * VIM - Vi IMproved by Bram Moolenaar |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
4 * |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
5 * Do ":help uganda" in Vim to read copying and usage conditions. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
6 * Do ":help credits" in Vim to see a list of people who contributed. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
7 * See README.txt for an overview of the Vim source code. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
8 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
9 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
10 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
11 * vim9class.c: Vim9 script class support |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
12 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
13 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
14 #define USING_FLOAT_STUFF |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
15 #include "vim.h" |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
16 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
17 #if defined(FEAT_EVAL) || defined(PROTO) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
18 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
19 // When not generating protos this is included in proto.h |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
20 #ifdef PROTO |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
21 # include "vim9.h" |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
22 #endif |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
23 |
33160
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
24 static class_T *first_class = NULL; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
25 static class_T *next_nonref_class = NULL; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
26 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
27 /* |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
28 * Call this function when a class has been created. It will be added to the |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
29 * list headed by "first_class". |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
30 */ |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
31 static void |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
32 class_created(class_T *cl) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
33 { |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
34 if (first_class != NULL) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
35 { |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
36 cl->class_next_used = first_class; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
37 first_class->class_prev_used = cl; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
38 } |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
39 first_class = cl; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
40 } |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
41 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
42 /* |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
43 * Call this function when a class has been cleared and is about to be freed. |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
44 * It is removed from the list headed by "first_class". |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
45 */ |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
46 static void |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
47 class_cleared(class_T *cl) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
48 { |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
49 if (cl->class_next_used != NULL) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
50 cl->class_next_used->class_prev_used = cl->class_prev_used; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
51 if (cl->class_prev_used != NULL) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
52 cl->class_prev_used->class_next_used = cl->class_next_used; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
53 else if (first_class == cl) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
54 first_class = cl->class_next_used; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
55 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
56 // update the next class to check if needed |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
57 if (cl == next_nonref_class) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
58 next_nonref_class = cl->class_next_used; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
59 } |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
60 |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
61 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
62 * Parse a member declaration, both object and class member. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
63 * Returns OK or FAIL. When OK then "varname_end" is set to just after the |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
64 * variable name and "type_ret" is set to the declared or detected type. |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
65 * "init_expr" is set to the initialisation expression (allocated), if there is |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
66 * one. For an interface "init_expr" is NULL. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
67 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
68 static int |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
69 parse_member( |
33088
667a17904f64
patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents:
33070
diff
changeset
|
70 exarg_T *eap, |
667a17904f64
patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents:
33070
diff
changeset
|
71 char_u *line, |
667a17904f64
patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents:
33070
diff
changeset
|
72 char_u *varname, |
33109
2b5cc29b0a0e
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents:
33106
diff
changeset
|
73 int has_public, // TRUE if "public" seen before "varname" |
33088
667a17904f64
patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents:
33070
diff
changeset
|
74 char_u **varname_end, |
33109
2b5cc29b0a0e
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents:
33106
diff
changeset
|
75 garray_T *type_list, |
33088
667a17904f64
patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents:
33070
diff
changeset
|
76 type_T **type_ret, |
667a17904f64
patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents:
33070
diff
changeset
|
77 char_u **init_expr) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
78 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
79 *varname_end = to_name_end(varname, FALSE); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
80 if (*varname == '_' && has_public) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
81 { |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
82 semsg(_(e_public_variable_name_cannot_start_with_underscore_str), line); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
83 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
84 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
85 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
86 char_u *colon = skipwhite(*varname_end); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
87 char_u *type_arg = colon; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
88 type_T *type = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
89 if (*colon == ':') |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
90 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
91 if (VIM_ISWHITE(**varname_end)) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
92 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
93 semsg(_(e_no_white_space_allowed_before_colon_str), varname); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
94 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
95 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
96 if (!VIM_ISWHITE(colon[1])) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
97 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
98 semsg(_(e_white_space_required_after_str_str), ":", varname); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
99 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
100 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
101 type_arg = skipwhite(colon + 1); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
102 type = parse_type(&type_arg, type_list, TRUE); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
103 if (type == NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
104 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
105 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
106 |
32960
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
107 char_u *init_arg = skipwhite(type_arg); |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
108 if (type == NULL && *init_arg != '=') |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
109 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
110 emsg(_(e_type_or_initialization_required)); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
111 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
112 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
113 |
32960
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
114 if (init_expr == NULL && *init_arg == '=') |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
115 { |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
116 emsg(_(e_cannot_initialize_variable_in_interface)); |
32960
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
117 return FAIL; |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
118 } |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
119 |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
120 if (*init_arg == '=') |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
121 { |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
122 evalarg_T evalarg; |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
123 char_u *expr_start, *expr_end; |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
124 |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
125 if (!VIM_ISWHITE(init_arg[-1]) || !VIM_ISWHITE(init_arg[1])) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
126 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
127 semsg(_(e_white_space_required_before_and_after_str_at_str), |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
128 "=", type_arg); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
129 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
130 } |
32960
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
131 init_arg = skipwhite(init_arg + 1); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
132 |
32960
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
133 fill_evalarg_from_eap(&evalarg, eap, FALSE); |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
134 (void)skip_expr_concatenate(&init_arg, &expr_start, &expr_end, &evalarg); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
135 |
33006
29b2193466e0
patch 9.0.1795: Indentation issues
Christian Brabandt <cb@256bit.org>
parents:
32972
diff
changeset
|
136 // No type specified for the member. Set it to "any" and the correct |
29b2193466e0
patch 9.0.1795: Indentation issues
Christian Brabandt <cb@256bit.org>
parents:
32972
diff
changeset
|
137 // type will be set when the object is instantiated. |
32960
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
138 if (type == NULL) |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
139 type = &t_any; |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
140 |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
141 *init_expr = vim_strnsave(expr_start, expr_end - expr_start); |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
142 // Free the memory pointed by expr_start. |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
143 clear_evalarg(&evalarg, NULL); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
144 } |
32960
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
145 else if (!valid_declaration_type(type)) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
146 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
147 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
148 *type_ret = type; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
149 return OK; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
150 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
151 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
152 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
153 * Add a member to an object or a class. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
154 * Returns OK when successful, "init_expr" will be consumed then. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
155 * Returns FAIL otherwise, caller might need to free "init_expr". |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
156 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
157 static int |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
158 add_member( |
33109
2b5cc29b0a0e
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents:
33106
diff
changeset
|
159 garray_T *gap, |
2b5cc29b0a0e
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents:
33106
diff
changeset
|
160 char_u *varname, |
2b5cc29b0a0e
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents:
33106
diff
changeset
|
161 char_u *varname_end, |
2b5cc29b0a0e
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents:
33106
diff
changeset
|
162 int has_public, |
2b5cc29b0a0e
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents:
33106
diff
changeset
|
163 type_T *type, |
2b5cc29b0a0e
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents:
33106
diff
changeset
|
164 char_u *init_expr) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
165 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
166 if (ga_grow(gap, 1) == FAIL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
167 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
168 ocmember_T *m = ((ocmember_T *)gap->ga_data) + gap->ga_len; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
169 m->ocm_name = vim_strnsave(varname, varname_end - varname); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
170 m->ocm_access = has_public ? VIM_ACCESS_ALL |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
171 : *varname == '_' ? VIM_ACCESS_PRIVATE : VIM_ACCESS_READ; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
172 m->ocm_type = type; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
173 if (init_expr != NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
174 m->ocm_init = init_expr; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
175 ++gap->ga_len; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
176 return OK; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
177 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
178 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
179 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
180 * Move the class or object members found while parsing a class into the class. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
181 * "gap" contains the found members. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
182 * "parent_members" points to the members in the parent class (if any) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
183 * "parent_count" is the number of members in the parent class |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
184 * "members" will be set to the newly allocated array of members and |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
185 * "member_count" set to the number of members. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
186 * Returns OK or FAIL. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
187 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
188 static int |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
189 add_members_to_class( |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
190 garray_T *gap, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
191 ocmember_T *parent_members, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
192 int parent_count, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
193 ocmember_T **members, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
194 int *member_count) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
195 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
196 *member_count = parent_count + gap->ga_len; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
197 *members = *member_count == 0 ? NULL |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
198 : ALLOC_MULT(ocmember_T, *member_count); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
199 if (*member_count > 0 && *members == NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
200 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
201 for (int i = 0; i < parent_count; ++i) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
202 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
203 // parent members need to be copied |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
204 ocmember_T *m = *members + i; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
205 *m = parent_members[i]; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
206 m->ocm_name = vim_strsave(m->ocm_name); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
207 if (m->ocm_init != NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
208 m->ocm_init = vim_strsave(m->ocm_init); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
209 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
210 if (gap->ga_len > 0) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
211 // new members are moved |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
212 mch_memmove(*members + parent_count, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
213 gap->ga_data, sizeof(ocmember_T) * gap->ga_len); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
214 VIM_CLEAR(gap->ga_data); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
215 return OK; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
216 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
217 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
218 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
219 * Convert a member index "idx" of interface "itf" to the member index of class |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
220 * "cl" implementing that interface. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
221 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
222 int |
33387
577ef266309d
patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents:
33385
diff
changeset
|
223 object_index_from_itf_index(class_T *itf, int is_method, int idx, class_T *cl) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
224 { |
33173
9efd99a717c1
patch 9.0.1867: Vim9: access to interface statics possible
Christian Brabandt <cb@256bit.org>
parents:
33160
diff
changeset
|
225 if (idx >= (is_method ? itf->class_obj_method_count |
33387
577ef266309d
patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents:
33385
diff
changeset
|
226 : itf->class_obj_member_count)) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
227 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
228 siemsg("index %d out of range for interface %s", idx, itf->class_name); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
229 return 0; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
230 } |
32772
0dc750a24875
patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32764
diff
changeset
|
231 |
0dc750a24875
patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32764
diff
changeset
|
232 // If "cl" is the interface or the class that is extended, then the method |
0dc750a24875
patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32764
diff
changeset
|
233 // index can be used directly and there is no need to search for the method |
0dc750a24875
patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32764
diff
changeset
|
234 // index in one of the child classes. |
0dc750a24875
patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32764
diff
changeset
|
235 if (cl == itf) |
0dc750a24875
patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32764
diff
changeset
|
236 return idx; |
0dc750a24875
patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32764
diff
changeset
|
237 |
33211
71a097aab64d
patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents:
33204
diff
changeset
|
238 itf2class_T *i2c = NULL; |
71a097aab64d
patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents:
33204
diff
changeset
|
239 int searching = TRUE; |
71a097aab64d
patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents:
33204
diff
changeset
|
240 int method_offset = 0; |
71a097aab64d
patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents:
33204
diff
changeset
|
241 |
33204
36aebbf8389f
patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents:
33201
diff
changeset
|
242 for (class_T *super = cl; super != NULL && searching; |
36aebbf8389f
patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents:
33201
diff
changeset
|
243 super = super->class_extends) |
33211
71a097aab64d
patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents:
33204
diff
changeset
|
244 { |
33204
36aebbf8389f
patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents:
33201
diff
changeset
|
245 for (i2c = itf->class_itf2class; i2c != NULL; i2c = i2c->i2c_next) |
33211
71a097aab64d
patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents:
33204
diff
changeset
|
246 { |
33204
36aebbf8389f
patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents:
33201
diff
changeset
|
247 if (i2c->i2c_class == super && i2c->i2c_is_method == is_method) |
36aebbf8389f
patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents:
33201
diff
changeset
|
248 { |
36aebbf8389f
patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents:
33201
diff
changeset
|
249 searching = FALSE; |
36aebbf8389f
patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents:
33201
diff
changeset
|
250 break; |
36aebbf8389f
patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents:
33201
diff
changeset
|
251 } |
33211
71a097aab64d
patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents:
33204
diff
changeset
|
252 } |
71a097aab64d
patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents:
33204
diff
changeset
|
253 if (searching && is_method) |
71a097aab64d
patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents:
33204
diff
changeset
|
254 // The parent class methods are stored after the current class |
71a097aab64d
patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents:
33204
diff
changeset
|
255 // methods. |
33387
577ef266309d
patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents:
33385
diff
changeset
|
256 method_offset += super->class_obj_method_count_child; |
33211
71a097aab64d
patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents:
33204
diff
changeset
|
257 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
258 if (i2c == NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
259 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
260 siemsg("class %s not found on interface %s", |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
261 cl->class_name, itf->class_name); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
262 return 0; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
263 } |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
264 |
33387
577ef266309d
patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents:
33385
diff
changeset
|
265 // A table follows the i2c for the class |
577ef266309d
patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents:
33385
diff
changeset
|
266 int *table = (int *)(i2c + 1); |
577ef266309d
patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents:
33385
diff
changeset
|
267 // "method_offset" is 0, if method is in the current class. If method |
577ef266309d
patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents:
33385
diff
changeset
|
268 // is in a parent class, then it is non-zero. |
577ef266309d
patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents:
33385
diff
changeset
|
269 return table[idx] + method_offset; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
270 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
271 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
272 /* |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
273 * Check whether a class named "extends_name" is present. If the class is |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
274 * valid, then "extends_clp" is set with the class pointer. |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
275 * Returns TRUE if the class name "extends_names" is a valid class. |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
276 */ |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
277 static int |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
278 validate_extends_class( |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
279 char_u *extends_name, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
280 class_T **extends_clp, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
281 int is_class) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
282 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
283 typval_T tv; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
284 int success = FALSE; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
285 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
286 tv.v_type = VAR_UNKNOWN; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
287 if (eval_variable_import(extends_name, &tv) == FAIL) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
288 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
289 semsg(_(e_class_name_not_found_str), extends_name); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
290 return success; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
291 } |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
292 |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
293 if (tv.v_type != VAR_CLASS || tv.vval.v_class == NULL |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
294 || (is_class |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
295 && (tv.vval.v_class->class_flags & CLASS_INTERFACE) != 0) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
296 || (!is_class |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
297 && (tv.vval.v_class->class_flags & CLASS_INTERFACE) == 0)) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
298 // a interface cannot extend a class and a class cannot extend an |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
299 // interface. |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
300 semsg(_(e_cannot_extend_str), extends_name); |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
301 else |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
302 { |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
303 class_T *extends_cl = tv.vval.v_class; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
304 ++extends_cl->class_refcount; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
305 *extends_clp = extends_cl; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
306 success = TRUE; |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
307 } |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
308 clear_tv(&tv); |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
309 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
310 return success; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
311 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
312 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
313 /* |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
314 * Check method names in the parent class lineage to make sure the access is |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
315 * the same for overridden methods. |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
316 */ |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
317 static int |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
318 validate_extends_methods( |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
319 garray_T *objmethods_gap, |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
320 class_T *extends_cl) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
321 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
322 class_T *super = extends_cl; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
323 int method_count = objmethods_gap->ga_len; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
324 ufunc_T **cl_fp = (ufunc_T **)(objmethods_gap->ga_data); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
325 |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
326 while (super != NULL) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
327 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
328 int extends_method_count = super->class_obj_method_count_child; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
329 if (extends_method_count == 0) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
330 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
331 super = super->class_extends; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
332 continue; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
333 } |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
334 |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
335 ufunc_T **extends_methods = super->class_obj_methods; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
336 |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
337 for (int i = 0; i < extends_method_count; i++) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
338 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
339 char_u *pstr = extends_methods[i]->uf_name; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
340 int extends_private = (*pstr == '_'); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
341 if (extends_private) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
342 pstr++; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
343 |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
344 // When comparing the method names, ignore the access type (public |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
345 // and private methods are considered the same). |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
346 for (int j = 0; j < method_count; j++) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
347 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
348 char_u *qstr = cl_fp[j]->uf_name; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
349 int priv_method = (*qstr == '_'); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
350 if (priv_method) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
351 qstr++; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
352 if (STRCMP(pstr, qstr) == 0 && priv_method != extends_private) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
353 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
354 // Method access is different between the super class and |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
355 // the subclass |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
356 semsg(_(e_method_str_of_class_str_has_different_access), |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
357 cl_fp[j]->uf_name, super->class_name); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
358 return FALSE; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
359 } |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
360 } |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
361 } |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
362 super = super->class_extends; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
363 } |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
364 |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
365 return TRUE; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
366 } |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
367 |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
368 /* |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
369 * Check whether a object member variable in "objmembers_gap" is a duplicate of |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
370 * a member in any of the extended parent class lineage. Returns TRUE if there |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
371 * are no duplicates. |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
372 */ |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
373 static int |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
374 extends_check_dup_members( |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
375 garray_T *objmembers_gap, |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
376 class_T *extends_cl) |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
377 { |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
378 int member_count = objmembers_gap->ga_len; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
379 if (member_count == 0) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
380 return TRUE; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
381 |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
382 ocmember_T *members = (ocmember_T *)(objmembers_gap->ga_data); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
383 |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
384 // Validate each member variable |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
385 for (int c_i = 0; c_i < member_count; c_i++) |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
386 { |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
387 class_T *p_cl = extends_cl; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
388 ocmember_T *c_m = members + c_i; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
389 char_u *pstr = (*c_m->ocm_name == '_') |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
390 ? c_m->ocm_name + 1 : c_m->ocm_name; |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
391 |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
392 // Check in all the parent classes in the lineage |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
393 while (p_cl != NULL) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
394 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
395 int p_member_count = p_cl->class_obj_member_count; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
396 if (p_member_count == 0) |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
397 { |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
398 p_cl = p_cl->class_extends; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
399 continue; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
400 } |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
401 ocmember_T *p_members = p_cl->class_obj_members; |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
402 |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
403 // Compare against all the members in the parent class |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
404 for (int p_i = 0; p_i < p_member_count; p_i++) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
405 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
406 ocmember_T *p_m = p_members + p_i; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
407 char_u *qstr = (*p_m->ocm_name == '_') |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
408 ? p_m->ocm_name + 1 : p_m->ocm_name; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
409 if (STRCMP(pstr, qstr) == 0) |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
410 { |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
411 semsg(_(e_duplicate_variable_str), c_m->ocm_name); |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
412 return FALSE; |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
413 } |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
414 } |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
415 |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
416 p_cl = p_cl->class_extends; |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
417 } |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
418 } |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
419 |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
420 return TRUE; |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
421 } |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
422 |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
423 /* |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
424 * Compare the variable type of interface variables in "objmembers_gap" against |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
425 * the variable in any of the extended super interface lineage. Used to |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
426 * compare the variable types when extending interfaces. Returns TRUE if the |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
427 * variable types are the same. |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
428 */ |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
429 static int |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
430 extends_check_intf_var_type( |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
431 garray_T *objmembers_gap, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
432 class_T *extends_cl) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
433 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
434 int member_count = objmembers_gap->ga_len; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
435 if (member_count == 0) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
436 return TRUE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
437 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
438 ocmember_T *members = (ocmember_T *)(objmembers_gap->ga_data); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
439 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
440 // Validate each member variable |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
441 for (int c_i = 0; c_i < member_count; c_i++) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
442 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
443 class_T *p_cl = extends_cl; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
444 ocmember_T *c_m = members + c_i; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
445 int var_found = FALSE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
446 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
447 // Check in all the parent classes in the lineage |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
448 while (p_cl != NULL && !var_found) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
449 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
450 int p_member_count = p_cl->class_obj_member_count; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
451 if (p_member_count == 0) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
452 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
453 p_cl = p_cl->class_extends; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
454 continue; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
455 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
456 ocmember_T *p_members = p_cl->class_obj_members; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
457 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
458 // Compare against all the members in the parent class |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
459 for (int p_i = 0; p_i < p_member_count; p_i++) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
460 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
461 where_T where = WHERE_INIT; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
462 ocmember_T *p_m = p_members + p_i; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
463 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
464 if (STRCMP(p_m->ocm_name, c_m->ocm_name) != 0) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
465 continue; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
466 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
467 // Ensure the type is matching. |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
468 where.wt_func_name = (char *)c_m->ocm_name; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
469 where.wt_kind = WT_MEMBER; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
470 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
471 if (check_type(p_m->ocm_type, c_m->ocm_type, TRUE, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
472 where) == FAIL) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
473 return FALSE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
474 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
475 var_found = TRUE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
476 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
477 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
478 p_cl = p_cl->class_extends; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
479 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
480 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
481 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
482 return TRUE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
483 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
484 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
485 /* |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
486 * When extending an abstract class, check whether all the abstract methods in |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
487 * the parent class are implemented. Returns TRUE if all the methods are |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
488 * implemented. |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
489 */ |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
490 static int |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
491 validate_abstract_class_methods( |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
492 garray_T *classmethods_gap, |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
493 garray_T *objmethods_gap, |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
494 class_T *extends_cl) |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
495 { |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
496 for (int loop = 1; loop <= 2; ++loop) |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
497 { |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
498 // loop == 1: check class methods |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
499 // loop == 2: check object methods |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
500 int extends_method_count = loop == 1 |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
501 ? extends_cl->class_class_function_count |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
502 : extends_cl->class_obj_method_count; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
503 if (extends_method_count == 0) |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
504 continue; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
505 |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
506 ufunc_T **extends_methods = loop == 1 |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
507 ? extends_cl->class_class_functions |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
508 : extends_cl->class_obj_methods; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
509 |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
510 int method_count = loop == 1 ? classmethods_gap->ga_len |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
511 : objmethods_gap->ga_len; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
512 ufunc_T **cl_fp = (ufunc_T **)(loop == 1 |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
513 ? classmethods_gap->ga_data |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
514 : objmethods_gap->ga_data); |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
515 |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
516 for (int i = 0; i < extends_method_count; i++) |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
517 { |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
518 ufunc_T *uf = extends_methods[i]; |
33297
6340c608ca54
patch 9.0.1914: Vim9: few issues when accessing object members
Christian Brabandt <cb@256bit.org>
parents:
33291
diff
changeset
|
519 if (!IS_ABSTRACT_METHOD(uf)) |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
520 continue; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
521 |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
522 int method_found = FALSE; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
523 |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
524 for (int j = 0; j < method_count; j++) |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
525 { |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
526 if (STRCMP(uf->uf_name, cl_fp[j]->uf_name) == 0) |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
527 { |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
528 method_found = TRUE; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
529 break; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
530 } |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
531 } |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
532 |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
533 if (!method_found) |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
534 { |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
535 semsg(_(e_abstract_method_str_not_found), uf->uf_name); |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
536 return FALSE; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
537 } |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
538 } |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
539 } |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
540 |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
541 return TRUE; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
542 } |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
543 |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
544 /* |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
545 * Returns TRUE if the interface variable "if_var" is present in the list of |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
546 * variables in "cl_mt" or in the parent lineage of one of the extended classes |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
547 * in "extends_cl". For a class variable, 'is_class_var' is TRUE. |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
548 */ |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
549 static int |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
550 intf_variable_present( |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
551 char_u *intf_class_name, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
552 ocmember_T *if_var, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
553 int is_class_var, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
554 ocmember_T *cl_mt, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
555 int cl_member_count, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
556 class_T *extends_cl) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
557 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
558 int variable_present = FALSE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
559 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
560 for (int cl_i = 0; cl_i < cl_member_count; ++cl_i) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
561 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
562 ocmember_T *m = &cl_mt[cl_i]; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
563 where_T where = WHERE_INIT; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
564 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
565 if (STRCMP(if_var->ocm_name, m->ocm_name) != 0) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
566 continue; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
567 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
568 // Ensure the access type is same |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
569 if (if_var->ocm_access != m->ocm_access) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
570 { |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
571 semsg(_(e_variable_str_of_interface_str_has_different_access), |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
572 if_var->ocm_name, intf_class_name); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
573 return FALSE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
574 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
575 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
576 // Ensure the type is matching. |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
577 if (m->ocm_type == &t_any) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
578 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
579 // variable type is not specified. Use the variable type in the |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
580 // interface. |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
581 m->ocm_type = if_var->ocm_type; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
582 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
583 else |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
584 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
585 where.wt_func_name = (char *)m->ocm_name; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
586 where.wt_kind = WT_MEMBER; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
587 if (check_type(if_var->ocm_type, m->ocm_type, TRUE, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
588 where) == FAIL) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
589 return FALSE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
590 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
591 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
592 variable_present = TRUE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
593 break; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
594 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
595 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
596 if (!variable_present && extends_cl != NULL) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
597 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
598 int ext_cl_count = is_class_var |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
599 ? extends_cl->class_class_member_count |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
600 : extends_cl->class_obj_member_count; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
601 ocmember_T *ext_cl_mt = is_class_var |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
602 ? extends_cl->class_class_members |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
603 : extends_cl->class_obj_members; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
604 return intf_variable_present(intf_class_name, if_var, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
605 is_class_var, ext_cl_mt, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
606 ext_cl_count, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
607 extends_cl->class_extends); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
608 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
609 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
610 return variable_present; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
611 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
612 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
613 /* |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
614 * Check the variables of the interface class "ifcl" match the class variables |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
615 * ("classmembers_gap") and object variables ("objmembers_gap") of a class. |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
616 * Returns TRUE if the class and object variables names are valid. |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
617 */ |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
618 static int |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
619 validate_interface_variables( |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
620 char_u *intf_class_name, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
621 class_T *ifcl, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
622 garray_T *classmembers_gap, |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
623 garray_T *objmembers_gap, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
624 class_T *extends_cl) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
625 { |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
626 for (int loop = 1; loop <= 2; ++loop) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
627 { |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
628 // loop == 1: check class variables |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
629 // loop == 2: check object variables |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
630 int is_class_var = (loop == 1); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
631 int if_count = is_class_var ? ifcl->class_class_member_count |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
632 : ifcl->class_obj_member_count; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
633 if (if_count == 0) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
634 continue; |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
635 ocmember_T *if_ms = is_class_var ? ifcl->class_class_members |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
636 : ifcl->class_obj_members; |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
637 ocmember_T *cl_ms = (ocmember_T *)(is_class_var |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
638 ? classmembers_gap->ga_data |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
639 : objmembers_gap->ga_data); |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
640 int cl_count = is_class_var ? classmembers_gap->ga_len |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
641 : objmembers_gap->ga_len; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
642 for (int if_i = 0; if_i < if_count; ++if_i) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
643 { |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
644 if (!intf_variable_present(intf_class_name, &if_ms[if_i], |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
645 is_class_var, cl_ms, cl_count, extends_cl)) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
646 { |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
647 semsg(_(e_variable_str_of_interface_str_not_implemented), |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
648 if_ms[if_i].ocm_name, intf_class_name); |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
649 return FALSE; |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
650 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
651 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
652 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
653 |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
654 return TRUE; |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
655 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
656 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
657 /* |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
658 * Returns TRUE if the method signature of "if_method" and "cl_method" matches. |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
659 */ |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
660 static int |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
661 intf_method_type_matches(ufunc_T *if_method, ufunc_T *cl_method) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
662 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
663 where_T where = WHERE_INIT; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
664 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
665 // Ensure the type is matching. |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
666 where.wt_func_name = (char *)if_method->uf_name; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
667 where.wt_kind = WT_METHOD; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
668 if (check_type(if_method->uf_func_type, cl_method->uf_func_type, TRUE, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
669 where) == FAIL) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
670 return FALSE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
671 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
672 return TRUE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
673 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
674 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
675 /* |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
676 * Returns TRUE if the interface method "if_ufunc" is present in the list of |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
677 * methods in "cl_fp" or in the parent lineage of one of the extended classes |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
678 * in "extends_cl". For a class method, 'is_class_method' is TRUE. |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
679 */ |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
680 static int |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
681 intf_method_present( |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
682 ufunc_T *if_ufunc, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
683 int is_class_method, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
684 ufunc_T **cl_fp, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
685 int cl_count, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
686 class_T *extends_cl) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
687 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
688 int method_present = FALSE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
689 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
690 for (int cl_i = 0; cl_i < cl_count; ++cl_i) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
691 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
692 char_u *cl_name = cl_fp[cl_i]->uf_name; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
693 if (STRCMP(if_ufunc->uf_name, cl_name) == 0) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
694 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
695 // Ensure the type is matching. |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
696 if (!intf_method_type_matches(if_ufunc, cl_fp[cl_i])) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
697 return FALSE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
698 method_present = TRUE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
699 break; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
700 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
701 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
702 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
703 if (!method_present && extends_cl != NULL) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
704 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
705 ufunc_T **ext_cl_fp = (ufunc_T **)(is_class_method |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
706 ? extends_cl->class_class_functions |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
707 : extends_cl->class_obj_methods); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
708 int ext_cl_count = is_class_method |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
709 ? extends_cl->class_class_function_count |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
710 : extends_cl->class_obj_method_count; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
711 return intf_method_present(if_ufunc, is_class_method, ext_cl_fp, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
712 ext_cl_count, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
713 extends_cl->class_extends); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
714 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
715 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
716 return method_present; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
717 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
718 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
719 /* |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
720 * Validate that a new class implements all the class/instance methods in the |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
721 * interface "ifcl". The new class methods are in "classfunctions_gap" and the |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
722 * new object methods are in "objmemthods_gap". Also validates the method |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
723 * types. |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
724 * Returns TRUE if all the interface class/object methods are implemented in |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
725 * the new class. |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
726 */ |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
727 static int |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
728 validate_interface_methods( |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
729 char_u *intf_class_name, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
730 class_T *ifcl, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
731 garray_T *classfunctions_gap, |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
732 garray_T *objmethods_gap, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
733 class_T *extends_cl) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
734 { |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
735 for (int loop = 1; loop <= 2; ++loop) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
736 { |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
737 // loop == 1: check class methods |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
738 // loop == 2: check object methods |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
739 int is_class_method = (loop == 1); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
740 int if_count = is_class_method ? ifcl->class_class_function_count |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
741 : ifcl->class_obj_method_count; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
742 if (if_count == 0) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
743 continue; |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
744 ufunc_T **if_fp = is_class_method ? ifcl->class_class_functions |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
745 : ifcl->class_obj_methods; |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
746 ufunc_T **cl_fp = (ufunc_T **)(is_class_method |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
747 ? classfunctions_gap->ga_data |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
748 : objmethods_gap->ga_data); |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
749 int cl_count = is_class_method ? classfunctions_gap->ga_len |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
750 : objmethods_gap->ga_len; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
751 for (int if_i = 0; if_i < if_count; ++if_i) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
752 { |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
753 char_u *if_name = if_fp[if_i]->uf_name; |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
754 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
755 if (!intf_method_present(if_fp[if_i], is_class_method, cl_fp, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
756 cl_count, extends_cl)) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
757 { |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
758 semsg(_(e_method_str_of_interface_str_not_implemented), |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
759 if_name, intf_class_name); |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
760 return FALSE; |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
761 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
762 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
763 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
764 |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
765 return TRUE; |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
766 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
767 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
768 /* |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
769 * Validate all the "implements" classes when creating a new class. The |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
770 * classes are returned in "intf_classes". The class functions, class members, |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
771 * object methods and object members in the new class are in |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
772 * "classfunctions_gap", "classmembers_gap", "objmethods_gap", and |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
773 * "objmembers_gap" respectively. |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
774 */ |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
775 static int |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
776 validate_implements_classes( |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
777 garray_T *impl_gap, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
778 class_T **intf_classes, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
779 garray_T *classfunctions_gap, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
780 garray_T *classmembers_gap, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
781 garray_T *objmethods_gap, |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
782 garray_T *objmembers_gap, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
783 class_T *extends_cl) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
784 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
785 int success = TRUE; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
786 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
787 for (int i = 0; i < impl_gap->ga_len && success; ++i) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
788 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
789 char_u *impl = ((char_u **)impl_gap->ga_data)[i]; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
790 typval_T tv; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
791 tv.v_type = VAR_UNKNOWN; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
792 if (eval_variable_import(impl, &tv) == FAIL) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
793 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
794 semsg(_(e_interface_name_not_found_str), impl); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
795 success = FALSE; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
796 break; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
797 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
798 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
799 if (tv.v_type != VAR_CLASS |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
800 || tv.vval.v_class == NULL |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
801 || (tv.vval.v_class->class_flags & CLASS_INTERFACE) == 0) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
802 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
803 semsg(_(e_not_valid_interface_str), impl); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
804 success = FALSE; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
805 clear_tv(&tv); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
806 break; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
807 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
808 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
809 class_T *ifcl = tv.vval.v_class; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
810 intf_classes[i] = ifcl; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
811 ++ifcl->class_refcount; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
812 |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
813 // check the variables of the interface match the members of the class |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
814 success = validate_interface_variables(impl, ifcl, classmembers_gap, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
815 objmembers_gap, extends_cl); |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
816 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
817 // check the functions/methods of the interface match the |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
818 // functions/methods of the class |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
819 if (success) |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
820 success = validate_interface_methods(impl, ifcl, |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
821 classfunctions_gap, objmethods_gap, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
822 extends_cl); |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
823 clear_tv(&tv); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
824 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
825 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
826 return success; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
827 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
828 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
829 /* |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
830 * Check no function argument name is used as a class member. |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
831 * (Object members are always accessed with "this." prefix, so no need |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
832 * to check them.) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
833 */ |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
834 static int |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
835 check_func_arg_names( |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
836 garray_T *classfunctions_gap, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
837 garray_T *objmethods_gap, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
838 garray_T *classmembers_gap) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
839 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
840 // loop 1: class functions, loop 2: object methods |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
841 for (int loop = 1; loop <= 2; ++loop) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
842 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
843 garray_T *gap = loop == 1 ? classfunctions_gap : objmethods_gap; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
844 |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
845 for (int fi = 0; fi < gap->ga_len; ++fi) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
846 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
847 ufunc_T *uf = ((ufunc_T **)gap->ga_data)[fi]; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
848 |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
849 for (int i = 0; i < uf->uf_args.ga_len; ++i) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
850 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
851 char_u *aname = ((char_u **)uf->uf_args.ga_data)[i]; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
852 garray_T *mgap = classmembers_gap; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
853 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
854 // Check all the class member names |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
855 for (int mi = 0; mi < mgap->ga_len; ++mi) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
856 { |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
857 char_u *mname = |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
858 ((ocmember_T *)mgap->ga_data + mi)->ocm_name; |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
859 if (STRCMP(aname, mname) == 0) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
860 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
861 if (uf->uf_script_ctx.sc_sid > 0) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
862 SOURCING_LNUM = uf->uf_script_ctx.sc_lnum; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
863 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
864 semsg(_(e_argument_already_declared_in_class_str), |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
865 aname); |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
866 |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
867 return FALSE; |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
868 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
869 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
870 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
871 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
872 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
873 |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
874 return TRUE; |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
875 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
876 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
877 /* |
33381
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
878 * Returns TRUE if 'varname' is a reserved keyword name |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
879 */ |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
880 static int |
33381
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
881 is_reserved_varname(char_u *varname, char_u *varname_end) |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
882 { |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
883 int reserved = FALSE; |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
884 char_u save_varname_end = *varname_end; |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
885 *varname_end = NUL; |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
886 |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
887 reserved = check_reserved_name(varname, FALSE) == FAIL; |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
888 |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
889 *varname_end = save_varname_end; |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
890 |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
891 return reserved; |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
892 } |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
893 |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
894 /* |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
895 * Returns TRUE if the variable "varname" is already defined either as a class |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
896 * variable or as an object variable. |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
897 */ |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
898 static int |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
899 is_duplicate_variable( |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
900 garray_T *class_members, |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
901 garray_T *obj_members, |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
902 char_u *varname, |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
903 char_u *varname_end) |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
904 { |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
905 char_u *name = vim_strnsave(varname, varname_end - varname); |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
906 char_u *pstr = (*name == '_') ? name + 1 : name; |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
907 int dup = FALSE; |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
908 |
33381
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
909 for (int loop = 1; loop <= 2; loop++) |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
910 { |
33381
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
911 // loop == 1: class variables, loop == 2: object variables |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
912 garray_T *vgap = (loop == 1) ? class_members : obj_members; |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
913 for (int i = 0; i < vgap->ga_len; ++i) |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
914 { |
33381
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
915 ocmember_T *m = ((ocmember_T *)vgap->ga_data) + i; |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
916 char_u *qstr = *m->ocm_name == '_' ? m->ocm_name + 1 |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
917 : m->ocm_name; |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
918 if (STRCMP(pstr, qstr) == 0) |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
919 { |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
920 semsg(_(e_duplicate_variable_str), name); |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
921 dup = TRUE; |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
922 break; |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
923 } |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
924 } |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
925 } |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
926 |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
927 vim_free(name); |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
928 return dup; |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
929 } |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
930 |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
931 /* |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
932 * Returns TRUE if the method "name" is already defined. |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
933 */ |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
934 static int |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
935 is_duplicate_method( |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
936 garray_T *classmethods_gap, |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
937 garray_T *objmethods_gap, |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
938 char_u *name) |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
939 { |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
940 char_u *pstr = (*name == '_') ? name + 1 : name; |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
941 |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
942 // loop 1: class methods, loop 2: object methods |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
943 for (int loop = 1; loop <= 2; loop++) |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
944 { |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
945 garray_T *fgap = (loop == 1) ? classmethods_gap : objmethods_gap; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
946 for (int i = 0; i < fgap->ga_len; ++i) |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
947 { |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
948 char_u *n = ((ufunc_T **)fgap->ga_data)[i]->uf_name; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
949 char_u *qstr = *n == '_' ? n + 1 : n; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
950 if (STRCMP(pstr, qstr) == 0) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
951 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
952 semsg(_(e_duplicate_function_str), name); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
953 return TRUE; |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
954 } |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
955 } |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
956 } |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
957 |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
958 return FALSE; |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
959 } |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
960 |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
961 /* |
33068
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
962 * Returns TRUE if the constructor is valid. |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
963 */ |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
964 static int |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
965 is_valid_constructor(ufunc_T *uf, int is_abstract, int has_static) |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
966 { |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
967 // Constructors are not allowed in abstract classes. |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
968 if (is_abstract) |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
969 { |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
970 emsg(_(e_cannot_define_new_method_in_abstract_class)); |
33068
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
971 return FALSE; |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
972 } |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
973 // A constructor is always static, no need to define it so. |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
974 if (has_static) |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
975 { |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
976 emsg(_(e_cannot_define_new_method_as_static)); |
33068
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
977 return FALSE; |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
978 } |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
979 // A return type should not be specified for the new() |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
980 // constructor method. |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
981 if (uf->uf_ret_type->tt_type != VAR_VOID) |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
982 { |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
983 emsg(_(e_cannot_use_a_return_type_with_new_method)); |
33068
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
984 return FALSE; |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
985 } |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
986 return TRUE; |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
987 } |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
988 |
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
989 /* |
32854
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
990 * Update the interface class lookup table for the member index on the |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
991 * interface to the member index in the class implementing the interface. |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
992 * And a lookup table for the object method index on the interface |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
993 * to the object method index in the class implementing the interface. |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
994 * This is also used for updating the lookup table for the extended class |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
995 * hierarchy. |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
996 */ |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
997 static int |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
998 update_member_method_lookup_table( |
33109
2b5cc29b0a0e
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents:
33106
diff
changeset
|
999 class_T *ifcl, |
2b5cc29b0a0e
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents:
33106
diff
changeset
|
1000 class_T *cl, |
33088
667a17904f64
patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents:
33070
diff
changeset
|
1001 garray_T *objmethods, |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1002 int pobj_method_offset) |
32854
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1003 { |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1004 if (ifcl == NULL) |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1005 return OK; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1006 |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1007 // Table for members. |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1008 itf2class_T *if2cl = alloc_clear(sizeof(itf2class_T) |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1009 + ifcl->class_obj_member_count * sizeof(int)); |
32854
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1010 if (if2cl == NULL) |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1011 return FAIL; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1012 if2cl->i2c_next = ifcl->class_itf2class; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1013 ifcl->class_itf2class = if2cl; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1014 if2cl->i2c_class = cl; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1015 if2cl->i2c_is_method = FALSE; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1016 |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1017 for (int if_i = 0; if_i < ifcl->class_obj_member_count; ++if_i) |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1018 for (int cl_i = 0; cl_i < cl->class_obj_member_count; ++cl_i) |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1019 { |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1020 if (STRCMP(ifcl->class_obj_members[if_i].ocm_name, |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1021 cl->class_obj_members[cl_i].ocm_name) == 0) |
32854
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1022 { |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1023 int *table = (int *)(if2cl + 1); |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1024 table[if_i] = cl_i; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1025 break; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1026 } |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1027 } |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1028 |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1029 // Table for methods. |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1030 if2cl = alloc_clear(sizeof(itf2class_T) |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1031 + ifcl->class_obj_method_count * sizeof(int)); |
32854
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1032 if (if2cl == NULL) |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1033 return FAIL; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1034 if2cl->i2c_next = ifcl->class_itf2class; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1035 ifcl->class_itf2class = if2cl; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1036 if2cl->i2c_class = cl; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1037 if2cl->i2c_is_method = TRUE; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1038 |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1039 for (int if_i = 0; if_i < ifcl->class_obj_method_count; ++if_i) |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1040 { |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1041 int done = FALSE; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1042 for (int cl_i = 0; cl_i < objmethods->ga_len; ++cl_i) |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1043 { |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1044 if (STRCMP(ifcl->class_obj_methods[if_i]->uf_name, |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1045 ((ufunc_T **)objmethods->ga_data)[cl_i]->uf_name) == 0) |
32854
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1046 { |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1047 int *table = (int *)(if2cl + 1); |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1048 table[if_i] = cl_i; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1049 done = TRUE; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1050 break; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1051 } |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1052 } |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1053 |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1054 // extended class object method is not overridden by the child class. |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1055 // Keep the method declared in one of the parent classes in the |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1056 // lineage. |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1057 if (!done) |
32854
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1058 { |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1059 // If "ifcl" is not the immediate parent of "cl", then search in |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1060 // the intermediate parent classes. |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1061 if (cl->class_extends != ifcl) |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1062 { |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1063 class_T *parent = cl->class_extends; |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1064 int method_offset = objmethods->ga_len; |
32854
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1065 |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1066 while (!done && parent != NULL && parent != ifcl) |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1067 { |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1068 |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1069 for (int cl_i = 0; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1070 cl_i < parent->class_obj_method_count_child; ++cl_i) |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1071 { |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1072 if (STRCMP(ifcl->class_obj_methods[if_i]->uf_name, |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1073 parent->class_obj_methods[cl_i]->uf_name) |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1074 == 0) |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1075 { |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1076 int *table = (int *)(if2cl + 1); |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1077 table[if_i] = method_offset + cl_i; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1078 done = TRUE; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1079 break; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1080 } |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1081 } |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1082 method_offset += parent->class_obj_method_count_child; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1083 parent = parent->class_extends; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1084 } |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1085 } |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1086 |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1087 if (!done) |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1088 { |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1089 int *table = (int *)(if2cl + 1); |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1090 table[if_i] = pobj_method_offset + if_i; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1091 } |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1092 } |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1093 } |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1094 |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1095 return OK; |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1096 } |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1097 |
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1098 /* |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1099 * Update the member and object method lookup tables for a new class in the |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1100 * interface class. |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1101 * For each interface add a lookup table for the member index on the interface |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1102 * to the member index in the new class. And a lookup table for the object |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1103 * method index on the interface to the object method index in the new class. |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1104 */ |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1105 static int |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1106 add_lookup_tables(class_T *cl, class_T *extends_cl, garray_T *objmethods_gap) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1107 { |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1108 // update the lookup table for all the implemented interfaces |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1109 for (int i = 0; i < cl->class_interface_count; ++i) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1110 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1111 class_T *ifcl = cl->class_interfaces_cl[i]; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1112 |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1113 // update the lookup table for this interface and all its super |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1114 // interfaces. |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1115 while (ifcl != NULL) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1116 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1117 if (update_member_method_lookup_table(ifcl, cl, objmethods_gap, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1118 0) == FAIL) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1119 return FAIL; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1120 ifcl = ifcl->class_extends; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1121 } |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1122 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1123 |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1124 // Update the lookup table for the extended class, if any |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1125 if (extends_cl != NULL) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1126 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1127 class_T *pclass = extends_cl; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1128 int pobj_method_offset = objmethods_gap->ga_len; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1129 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1130 // Update the entire lineage of extended classes. |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1131 while (pclass != NULL) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1132 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1133 if (update_member_method_lookup_table(pclass, cl, |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1134 objmethods_gap, pobj_method_offset) == FAIL) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1135 return FAIL; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1136 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1137 pobj_method_offset += pclass->class_obj_method_count_child; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1138 pclass = pclass->class_extends; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1139 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1140 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1141 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1142 return OK; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1143 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1144 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1145 /* |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1146 * Add class members to a new class. Allocate a typval for each class member |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1147 * and initialize it. |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1148 */ |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1149 static void |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1150 add_class_members(class_T *cl, exarg_T *eap) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1151 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1152 // Allocate a typval for each class member and initialize it. |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1153 cl->class_members_tv = ALLOC_CLEAR_MULT(typval_T, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1154 cl->class_class_member_count); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1155 if (cl->class_members_tv == NULL) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1156 return; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1157 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1158 for (int i = 0; i < cl->class_class_member_count; ++i) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1159 { |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1160 ocmember_T *m = &cl->class_class_members[i]; |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1161 typval_T *tv = &cl->class_members_tv[i]; |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1162 if (m->ocm_init != NULL) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1163 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1164 typval_T *etv = eval_expr(m->ocm_init, eap); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1165 if (etv != NULL) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1166 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1167 *tv = *etv; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1168 vim_free(etv); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1169 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1170 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1171 else |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1172 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1173 // TODO: proper default value |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1174 tv->v_type = m->ocm_type->tt_type; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1175 tv->vval.v_string = NULL; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1176 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1177 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1178 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1179 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1180 /* |
32903
54c01bb98b8e
patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents:
32896
diff
changeset
|
1181 * Add a default constructor method (new()) to the class "cl". |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1182 */ |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1183 static void |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1184 add_default_constructor( |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1185 class_T *cl, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1186 garray_T *classfunctions_gap, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1187 garray_T *type_list_gap) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1188 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1189 garray_T fga; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1190 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1191 ga_init2(&fga, 1, 1000); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1192 ga_concat(&fga, (char_u *)"new("); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1193 for (int i = 0; i < cl->class_obj_member_count; ++i) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1194 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1195 if (i > 0) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1196 ga_concat(&fga, (char_u *)", "); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1197 ga_concat(&fga, (char_u *)"this."); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1198 ocmember_T *m = cl->class_obj_members + i; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1199 ga_concat(&fga, (char_u *)m->ocm_name); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1200 ga_concat(&fga, (char_u *)" = v:none"); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1201 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1202 ga_concat(&fga, (char_u *)")\nenddef\n"); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1203 ga_append(&fga, NUL); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1204 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1205 exarg_T fea; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1206 CLEAR_FIELD(fea); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1207 fea.cmdidx = CMD_def; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1208 fea.cmd = fea.arg = fga.ga_data; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1209 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1210 garray_T lines_to_free; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1211 ga_init2(&lines_to_free, sizeof(char_u *), 50); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1212 |
33326
4e531adb3fac
patch 9.0.1928: Vim9: constructor type checking bug
Christian Brabandt <cb@256bit.org>
parents:
33297
diff
changeset
|
1213 ufunc_T *nf = define_function(&fea, NULL, &lines_to_free, CF_CLASS, |
4e531adb3fac
patch 9.0.1928: Vim9: constructor type checking bug
Christian Brabandt <cb@256bit.org>
parents:
33297
diff
changeset
|
1214 cl->class_obj_members, cl->class_obj_member_count); |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1215 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1216 ga_clear_strings(&lines_to_free); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1217 vim_free(fga.ga_data); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1218 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1219 if (nf != NULL && ga_grow(classfunctions_gap, 1) == OK) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1220 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1221 ((ufunc_T **)classfunctions_gap->ga_data)[classfunctions_gap->ga_len] |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1222 = nf; |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1223 ++classfunctions_gap->ga_len; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1224 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1225 nf->uf_flags |= FC_NEW; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1226 nf->uf_ret_type = get_type_ptr(type_list_gap); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1227 if (nf->uf_ret_type != NULL) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1228 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1229 nf->uf_ret_type->tt_type = VAR_OBJECT; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1230 nf->uf_ret_type->tt_class = cl; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1231 nf->uf_ret_type->tt_argcount = 0; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1232 nf->uf_ret_type->tt_args = NULL; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1233 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1234 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1235 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1236 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1237 /* |
33268
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1238 * Add the class methods and object methods to the new class "cl". |
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1239 * When extending a class "extends_cl", add the instance methods from the |
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1240 * parent class also. |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1241 */ |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1242 static int |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1243 add_classfuncs_objmethods( |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1244 class_T *cl, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1245 class_T *extends_cl, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1246 garray_T *classfunctions_gap, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1247 garray_T *objmethods_gap) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1248 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1249 // loop 1: class functions, loop 2: object methods |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1250 for (int loop = 1; loop <= 2; ++loop) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1251 { |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1252 garray_T *gap = loop == 1 ? classfunctions_gap : objmethods_gap; |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1253 int *fcount = loop == 1 ? &cl->class_class_function_count |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1254 : &cl->class_obj_method_count; |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1255 ufunc_T ***fup = loop == 1 ? &cl->class_class_functions |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1256 : &cl->class_obj_methods; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1257 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1258 int parent_count = 0; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1259 if (extends_cl != NULL) |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1260 // Include object methods from the parent. |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1261 // Don't include the parent class methods. |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1262 parent_count = loop == 1 |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1263 ? 0 |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1264 : extends_cl->class_obj_method_count; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1265 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1266 *fcount = parent_count + gap->ga_len; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1267 if (*fcount == 0) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1268 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1269 *fup = NULL; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1270 continue; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1271 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1272 *fup = ALLOC_MULT(ufunc_T *, *fcount); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1273 if (*fup == NULL) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1274 return FAIL; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1275 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1276 if (gap->ga_len != 0) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1277 mch_memmove(*fup, gap->ga_data, sizeof(ufunc_T *) * gap->ga_len); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1278 vim_free(gap->ga_data); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1279 if (loop == 1) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1280 cl->class_class_function_count_child = gap->ga_len; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1281 else |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1282 cl->class_obj_method_count_child = gap->ga_len; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1283 |
33268
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1284 if (loop == 2) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1285 { |
33268
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1286 // Copy instance methods from the parent. |
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1287 |
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1288 for (int i = 0; i < parent_count; ++i) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1289 { |
33268
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1290 // Can't use the same parent function, because "uf_class" is |
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1291 // different and compilation will have a different result. |
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1292 // Put them after the functions in the current class, object |
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1293 // methods may be overruled, then "super.Method()" is used to |
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1294 // find a method from the parent. |
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1295 ufunc_T *pf = (extends_cl->class_obj_methods)[i]; |
e231b9af0f44
patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents:
33260
diff
changeset
|
1296 (*fup)[gap->ga_len + i] = copy_function(pf); |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1297 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1298 // If the child class overrides a function from the parent |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1299 // the signature must be equal. |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1300 char_u *pname = pf->uf_name; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1301 for (int ci = 0; ci < gap->ga_len; ++ci) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1302 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1303 ufunc_T *cf = (*fup)[ci]; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1304 char_u *cname = cf->uf_name; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1305 if (STRCMP(pname, cname) == 0) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1306 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1307 where_T where = WHERE_INIT; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1308 where.wt_func_name = (char *)pname; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1309 where.wt_kind = WT_METHOD; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1310 (void)check_type(pf->uf_func_type, cf->uf_func_type, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1311 TRUE, where); |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1312 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1313 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1314 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1315 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1316 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1317 // Set the class pointer on all the functions and object methods. |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1318 for (int i = 0; i < *fcount; ++i) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1319 { |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1320 ufunc_T *fp = (*fup)[i]; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1321 fp->uf_class = cl; |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1322 if (i < gap->ga_len) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1323 fp->uf_defclass = cl; |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1324 if (loop == 2) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1325 fp->uf_flags |= FC_OBJECT; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1326 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1327 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1328 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1329 return OK; |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1330 } |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1331 |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1332 /* |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1333 * Handle ":class" and ":abstract class" up to ":endclass". |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1334 * Handle ":interface" up to ":endinterface". |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1335 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1336 void |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1337 ex_class(exarg_T *eap) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1338 { |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1339 int is_class = eap->cmdidx == CMD_class; // FALSE for :interface |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1340 long start_lnum = SOURCING_LNUM; |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1341 char_u *arg = eap->arg; |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1342 int is_abstract = eap->cmdidx == CMD_abstract; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1343 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1344 if (is_abstract) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1345 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1346 if (STRNCMP(arg, "class", 5) != 0 || !VIM_ISWHITE(arg[5])) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1347 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1348 semsg(_(e_invalid_argument_str), arg); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1349 return; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1350 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1351 arg = skipwhite(arg + 5); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1352 is_class = TRUE; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1353 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1354 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1355 if (!current_script_is_vim9() |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1356 || (cmdmod.cmod_flags & CMOD_LEGACY) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1357 || !getline_equal(eap->getline, eap->cookie, getsourceline)) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1358 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1359 if (is_class) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1360 emsg(_(e_class_can_only_be_defined_in_vim9_script)); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1361 else |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1362 emsg(_(e_interface_can_only_be_defined_in_vim9_script)); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1363 return; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1364 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1365 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1366 if (!ASCII_ISUPPER(*arg)) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1367 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1368 if (is_class) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1369 semsg(_(e_class_name_must_start_with_uppercase_letter_str), arg); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1370 else |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1371 semsg(_(e_interface_name_must_start_with_uppercase_letter_str), |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1372 arg); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1373 return; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1374 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1375 char_u *name_end = find_name_end(arg, NULL, NULL, FNE_CHECK_START); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1376 if (!IS_WHITE_OR_NUL(*name_end)) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1377 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1378 semsg(_(e_white_space_required_after_name_str), arg); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1379 return; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1380 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1381 char_u *name_start = arg; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1382 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1383 // "export class" gets used when creating the class, don't use "is_export" |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1384 // for the items inside the class. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1385 int class_export = is_export; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1386 is_export = FALSE; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1387 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1388 // TODO: |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1389 // generics: <Tkey, Tentry> |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1390 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1391 // Name for "extends BaseClass" |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1392 char_u *extends = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1393 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1394 // Names for "implements SomeInterface" |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1395 garray_T ga_impl; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1396 ga_init2(&ga_impl, sizeof(char_u *), 5); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1397 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1398 arg = skipwhite(name_end); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1399 while (*arg != NUL && *arg != '#' && *arg != '\n') |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1400 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1401 // TODO: |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1402 // specifies SomeInterface |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1403 if (STRNCMP(arg, "extends", 7) == 0 && IS_WHITE_OR_NUL(arg[7])) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1404 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1405 if (extends != NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1406 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1407 emsg(_(e_duplicate_extends)); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1408 goto early_ret; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1409 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1410 arg = skipwhite(arg + 7); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1411 char_u *end = find_name_end(arg, NULL, NULL, FNE_CHECK_START); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1412 if (!IS_WHITE_OR_NUL(*end)) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1413 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1414 semsg(_(e_white_space_required_after_name_str), arg); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1415 goto early_ret; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1416 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1417 extends = vim_strnsave(arg, end - arg); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1418 if (extends == NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1419 goto early_ret; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1420 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1421 arg = skipwhite(end + 1); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1422 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1423 else if (STRNCMP(arg, "implements", 10) == 0 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1424 && IS_WHITE_OR_NUL(arg[10])) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1425 { |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1426 if (!is_class) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1427 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1428 emsg(_(e_interface_cannot_use_implements)); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1429 goto early_ret; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1430 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1431 |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1432 if (ga_impl.ga_len > 0) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1433 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1434 emsg(_(e_duplicate_implements)); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1435 goto early_ret; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1436 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1437 arg = skipwhite(arg + 10); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1438 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1439 for (;;) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1440 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1441 char_u *impl_end = find_name_end(arg, NULL, NULL, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1442 FNE_CHECK_START); |
33372
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1443 if ((!IS_WHITE_OR_NUL(*impl_end) && *impl_end != ',') |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1444 || (*impl_end == ',' |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1445 && !IS_WHITE_OR_NUL(*(impl_end + 1)))) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1446 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1447 semsg(_(e_white_space_required_after_name_str), arg); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1448 goto early_ret; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1449 } |
33372
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1450 if (impl_end - arg == 0) |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1451 { |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1452 emsg(_(e_missing_name_after_implements)); |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1453 goto early_ret; |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1454 } |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1455 |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1456 char_u *iname = vim_strnsave(arg, impl_end - arg); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1457 if (iname == NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1458 goto early_ret; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1459 for (int i = 0; i < ga_impl.ga_len; ++i) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1460 if (STRCMP(((char_u **)ga_impl.ga_data)[i], iname) == 0) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1461 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1462 semsg(_(e_duplicate_interface_after_implements_str), |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1463 iname); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1464 vim_free(iname); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1465 goto early_ret; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1466 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1467 if (ga_add_string(&ga_impl, iname) == FAIL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1468 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1469 vim_free(iname); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1470 goto early_ret; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1471 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1472 if (*impl_end != ',') |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1473 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1474 arg = skipwhite(impl_end); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1475 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1476 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1477 arg = skipwhite(impl_end + 1); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1478 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1479 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1480 else |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1481 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1482 semsg(_(e_trailing_characters_str), arg); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1483 early_ret: |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1484 vim_free(extends); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1485 ga_clear_strings(&ga_impl); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1486 return; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1487 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1488 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1489 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1490 garray_T type_list; // list of pointers to allocated types |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1491 ga_init2(&type_list, sizeof(type_T *), 10); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1492 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1493 // Growarray with class members declared in the class. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1494 garray_T classmembers; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1495 ga_init2(&classmembers, sizeof(ocmember_T), 10); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1496 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1497 // Growarray with functions declared in the class. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1498 garray_T classfunctions; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1499 ga_init2(&classfunctions, sizeof(ufunc_T *), 10); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1500 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1501 // Growarray with object members declared in the class. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1502 garray_T objmembers; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1503 ga_init2(&objmembers, sizeof(ocmember_T), 10); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1504 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1505 // Growarray with object methods declared in the class. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1506 garray_T objmethods; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1507 ga_init2(&objmethods, sizeof(ufunc_T *), 10); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1508 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1509 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1510 * Go over the body of the class/interface until "endclass" or |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1511 * "endinterface" is found. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1512 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1513 char_u *theline = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1514 int success = FALSE; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1515 for (;;) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1516 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1517 vim_free(theline); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1518 theline = eap->getline(':', eap->cookie, 0, GETLINE_CONCAT_ALL); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1519 if (theline == NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1520 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1521 char_u *line = skipwhite(theline); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1522 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1523 // Skip empty and comment lines. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1524 if (*line == NUL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1525 continue; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1526 if (*line == '#') |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1527 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1528 if (vim9_bad_comment(line)) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1529 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1530 continue; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1531 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1532 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1533 char_u *p = line; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1534 char *end_name = is_class ? "endclass" : "endinterface"; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1535 if (checkforcmd(&p, end_name, is_class ? 4 : 5)) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1536 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1537 if (STRNCMP(line, end_name, is_class ? 8 : 12) != 0) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1538 semsg(_(e_command_cannot_be_shortened_str), line); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1539 else if (*p == '|' || !ends_excmd2(line, p)) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1540 semsg(_(e_trailing_characters_str), p); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1541 else |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1542 success = TRUE; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1543 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1544 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1545 char *wrong_name = is_class ? "endinterface" : "endclass"; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1546 if (checkforcmd(&p, wrong_name, is_class ? 5 : 4)) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1547 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1548 semsg(_(e_invalid_command_str_expected_str), line, end_name); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1549 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1550 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1551 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1552 int has_public = FALSE; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1553 if (checkforcmd(&p, "public", 3)) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1554 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1555 if (STRNCMP(line, "public", 6) != 0) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1556 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1557 semsg(_(e_command_cannot_be_shortened_str), line); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1558 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1559 } |
33372
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1560 if (!is_class) |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1561 { |
33385
b5ad84fdc702
patch 9.0.1951: Vim9: hard to debug vim9_class errors from CI
Christian Brabandt <cb@256bit.org>
parents:
33381
diff
changeset
|
1562 emsg(_(e_public_variable_not_supported_in_interface)); |
33372
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1563 break; |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1564 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1565 has_public = TRUE; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1566 p = skipwhite(line + 6); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1567 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1568 if (STRNCMP(p, "this", 4) != 0 && STRNCMP(p, "static", 6) != 0) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1569 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1570 emsg(_(e_public_must_be_followed_by_this_or_static)); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1571 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1572 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1573 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1574 |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1575 int abstract_method = FALSE; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1576 char_u *pa = p; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1577 if (checkforcmd(&p, "abstract", 3)) |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1578 { |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1579 if (STRNCMP(pa, "abstract", 8) != 0) |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1580 { |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1581 semsg(_(e_command_cannot_be_shortened_str), pa); |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1582 break; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1583 } |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1584 |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1585 if (!is_class) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1586 // ignore "abstract" in an interface (as all the methods in an |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1587 // interface are abstract. |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1588 p = skipwhite(pa + 8); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1589 else |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1590 { |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1591 if (!is_abstract) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1592 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1593 semsg(_(e_abstract_method_in_concrete_class), pa); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1594 break; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1595 } |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1596 |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1597 abstract_method = TRUE; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1598 p = skipwhite(pa + 8); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1599 if (STRNCMP(p, "def", 3) != 0 && STRNCMP(p, "static", 6) != 0) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1600 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1601 emsg(_(e_abstract_must_be_followed_by_def_or_static)); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1602 break; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1603 } |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1604 } |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1605 } |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1606 |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1607 int has_static = FALSE; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1608 char_u *ps = p; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1609 if (checkforcmd(&p, "static", 4)) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1610 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1611 if (STRNCMP(ps, "static", 6) != 0) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1612 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1613 semsg(_(e_command_cannot_be_shortened_str), ps); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1614 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1615 } |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1616 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1617 if (!is_class) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1618 { |
33286
0c3553cfe22e
patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents:
33278
diff
changeset
|
1619 emsg(_(e_static_member_not_supported_in_interface)); |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1620 break; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1621 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1622 has_static = TRUE; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1623 p = skipwhite(ps + 6); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1624 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1625 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1626 // object members (public, read access, private): |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1627 // "this._varname" |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1628 // "this.varname" |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1629 // "public this.varname" |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1630 if (STRNCMP(p, "this", 4) == 0) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1631 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1632 if (p[4] != '.' || !eval_isnamec1(p[5])) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1633 { |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
1634 semsg(_(e_invalid_object_variable_declaration_str), p); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1635 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1636 } |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1637 if (has_static) |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1638 { |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1639 emsg(_(e_static_cannot_be_followed_by_this)); |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1640 break; |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1641 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1642 char_u *varname = p + 5; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1643 char_u *varname_end = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1644 type_T *type = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1645 char_u *init_expr = NULL; |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1646 |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1647 if (!is_class && *varname == '_') |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1648 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1649 // private variables are not supported in an interface |
33286
0c3553cfe22e
patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents:
33278
diff
changeset
|
1650 semsg(_(e_private_variable_not_supported_in_interface), |
0c3553cfe22e
patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents:
33278
diff
changeset
|
1651 varname); |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1652 break; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1653 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1654 |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1655 if (parse_member(eap, line, varname, has_public, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1656 &varname_end, &type_list, &type, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1657 is_class ? &init_expr: NULL) == FAIL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1658 break; |
33381
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1659 if (is_reserved_varname(varname, varname_end)) |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1660 { |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1661 vim_free(init_expr); |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1662 break; |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1663 } |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1664 if (is_duplicate_variable(&classmembers, &objmembers, varname, |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1665 varname_end)) |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1666 { |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1667 vim_free(init_expr); |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1668 break; |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1669 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1670 if (add_member(&objmembers, varname, varname_end, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1671 has_public, type, init_expr) == FAIL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1672 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1673 vim_free(init_expr); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1674 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1675 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1676 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1677 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1678 // constructors: |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1679 // def new() |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1680 // enddef |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1681 // def newOther() |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1682 // enddef |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1683 // object methods and class functions: |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1684 // def SomeMethod() |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1685 // enddef |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1686 // static def ClassFunction() |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1687 // enddef |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1688 // TODO: |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1689 // def <Tval> someMethod() |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1690 // enddef |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1691 else if (checkforcmd(&p, "def", 3)) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1692 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1693 exarg_T ea; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1694 garray_T lines_to_free; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1695 |
33372
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1696 if (has_public) |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1697 { |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1698 // "public" keyword is not supported when defining an object or |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1699 // class method |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1700 emsg(_(e_public_keyword_not_supported_for_method)); |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1701 break; |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1702 } |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1703 |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1704 if (*p == NUL) |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1705 { |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1706 // No method name following def |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1707 semsg(_(e_not_valid_command_in_class_str), line); |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1708 break; |
3e9a91624b40
patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents:
33343
diff
changeset
|
1709 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1710 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1711 CLEAR_FIELD(ea); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1712 ea.cmd = line; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1713 ea.arg = p; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1714 ea.cmdidx = CMD_def; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1715 ea.getline = eap->getline; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1716 ea.cookie = eap->cookie; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1717 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1718 ga_init2(&lines_to_free, sizeof(char_u *), 50); |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1719 int class_flags; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1720 if (is_class) |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1721 class_flags = abstract_method ? CF_ABSTRACT_METHOD : CF_CLASS; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1722 else |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1723 class_flags = CF_INTERFACE; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1724 ufunc_T *uf = define_function(&ea, NULL, &lines_to_free, |
33326
4e531adb3fac
patch 9.0.1928: Vim9: constructor type checking bug
Christian Brabandt <cb@256bit.org>
parents:
33297
diff
changeset
|
1725 class_flags, objmembers.ga_data, objmembers.ga_len); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1726 ga_clear_strings(&lines_to_free); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1727 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1728 if (uf != NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1729 { |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1730 char_u *name = uf->uf_name; |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
1731 int is_new = STRNCMP(name, "new", 3) == 0; |
33068
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
1732 |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1733 if (!is_class && *name == '_') |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1734 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1735 // private variables are not supported in an interface |
33286
0c3553cfe22e
patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents:
33278
diff
changeset
|
1736 semsg(_(e_private_method_not_supported_in_interface), |
0c3553cfe22e
patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents:
33278
diff
changeset
|
1737 name); |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1738 func_clear_free(uf, FALSE); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1739 break; |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1740 } |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1741 if (is_new && !is_valid_constructor(uf, is_abstract, |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1742 has_static)) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1743 { |
32854
5fd9fe58c791
patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents:
32812
diff
changeset
|
1744 func_clear_free(uf, FALSE); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1745 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1746 } |
33068
d42927c6e556
patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents:
33047
diff
changeset
|
1747 |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1748 // Check the name isn't used already. |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1749 if (is_duplicate_method(&classfunctions, &objmethods, name)) |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
1750 { |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
1751 success = FALSE; |
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
1752 func_clear_free(uf, FALSE); |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1753 break; |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
1754 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1755 |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1756 garray_T *fgap = has_static || is_new |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1757 ? &classfunctions : &objmethods; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1758 if (ga_grow(fgap, 1) == OK) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1759 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1760 if (is_new) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1761 uf->uf_flags |= FC_NEW; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1762 |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1763 if (abstract_method) |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1764 uf->uf_flags |= FC_ABSTRACT; |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1765 |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1766 ((ufunc_T **)fgap->ga_data)[fgap->ga_len] = uf; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1767 ++fgap->ga_len; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1768 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1769 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1770 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1771 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1772 // class members |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1773 else if (has_static) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1774 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1775 // class members (public, read access, private): |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1776 // "static _varname" |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1777 // "static varname" |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1778 // "public static varname" |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1779 char_u *varname = p; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1780 char_u *varname_end = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1781 type_T *type = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1782 char_u *init_expr = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1783 if (parse_member(eap, line, varname, has_public, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1784 &varname_end, &type_list, &type, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1785 is_class ? &init_expr : NULL) == FAIL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1786 break; |
33381
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1787 if (is_reserved_varname(varname, varname_end)) |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1788 { |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1789 vim_free(init_expr); |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1790 break; |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1791 } |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1792 if (is_duplicate_variable(&classmembers, &objmembers, varname, |
17301c641749
patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents:
33372
diff
changeset
|
1793 varname_end)) |
33047
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1794 { |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1795 vim_free(init_expr); |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1796 break; |
9ef43d02dd8f
patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents:
33025
diff
changeset
|
1797 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1798 if (add_member(&classmembers, varname, varname_end, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1799 has_public, type, init_expr) == FAIL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1800 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1801 vim_free(init_expr); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1802 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1803 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1804 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1805 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1806 else |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1807 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1808 if (is_class) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1809 semsg(_(e_not_valid_command_in_class_str), line); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1810 else |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1811 semsg(_(e_not_valid_command_in_interface_str), line); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1812 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1813 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1814 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1815 vim_free(theline); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1816 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1817 class_T *extends_cl = NULL; // class from "extends" argument |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1818 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1819 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1820 * Check a few things before defining the class. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1821 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1822 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1823 // Check the "extends" class is valid. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1824 if (success && extends != NULL) |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1825 success = validate_extends_class(extends, &extends_cl, is_class); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1826 VIM_CLEAR(extends); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1827 |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1828 // Check the new object methods to make sure their access (public or |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1829 // private) is the same as that in the extended class lineage. |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
1830 if (success && extends_cl != NULL) |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1831 success = validate_extends_methods(&objmethods, extends_cl); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1832 |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1833 // Check the new class and object variables are not duplicates of the |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1834 // variables in the extended class lineage. If an interface is extending |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1835 // another interface, then it can duplicate the member variables. |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1836 if (success && extends_cl != NULL) |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1837 { |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1838 if (is_class) |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1839 success = extends_check_dup_members(&objmembers, extends_cl); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1840 else |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1841 success = extends_check_intf_var_type(&objmembers, extends_cl); |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1842 } |
33070
8362975375a4
patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents:
33068
diff
changeset
|
1843 |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1844 // When extending an abstract class, make sure all the abstract methods in |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1845 // the parent class are implemented. If the current class is an abstract |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1846 // class, then there is no need for this check. |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1847 if (success && !is_abstract && extends_cl != NULL |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1848 && (extends_cl->class_flags & CLASS_ABSTRACT)) |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1849 success = validate_abstract_class_methods(&classfunctions, |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1850 &objmethods, extends_cl); |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1851 |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1852 class_T **intf_classes = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1853 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1854 // Check all "implements" entries are valid. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1855 if (success && ga_impl.ga_len > 0) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1856 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1857 intf_classes = ALLOC_CLEAR_MULT(class_T *, ga_impl.ga_len); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1858 |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1859 success = validate_implements_classes(&ga_impl, intf_classes, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1860 &classfunctions, &classmembers, |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1861 &objmethods, &objmembers, |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
1862 extends_cl); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1863 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1864 |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1865 // Check no function argument name is used as a class member. |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1866 if (success) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1867 success = check_func_arg_names(&classfunctions, &objmethods, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1868 &classmembers); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1869 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1870 class_T *cl = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1871 if (success) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1872 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1873 // "endclass" encountered without failures: Create the class. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1874 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1875 cl = ALLOC_CLEAR_ONE(class_T); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1876 if (cl == NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1877 goto cleanup; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1878 if (!is_class) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1879 cl->class_flags = CLASS_INTERFACE; |
33217
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1880 else if (is_abstract) |
499ba27ba0f6
patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents:
33211
diff
changeset
|
1881 cl->class_flags = CLASS_ABSTRACT; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1882 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1883 cl->class_refcount = 1; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1884 cl->class_name = vim_strnsave(name_start, name_end - name_start); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1885 if (cl->class_name == NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1886 goto cleanup; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1887 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1888 if (extends_cl != NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1889 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1890 cl->class_extends = extends_cl; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1891 extends_cl->class_flags |= CLASS_EXTENDED; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1892 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1893 |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1894 // Add class and object variables to "cl". |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1895 if (add_members_to_class(&classmembers, |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1896 NULL, |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
1897 0, |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1898 &cl->class_class_members, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1899 &cl->class_class_member_count) == FAIL |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1900 || add_members_to_class(&objmembers, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1901 extends_cl == NULL ? NULL |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1902 : extends_cl->class_obj_members, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1903 extends_cl == NULL ? 0 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1904 : extends_cl->class_obj_member_count, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1905 &cl->class_obj_members, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1906 &cl->class_obj_member_count) == FAIL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1907 goto cleanup; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1908 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1909 if (ga_impl.ga_len > 0) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1910 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1911 // Move the "implements" names into the class. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1912 cl->class_interface_count = ga_impl.ga_len; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1913 cl->class_interfaces = ALLOC_MULT(char_u *, ga_impl.ga_len); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1914 if (cl->class_interfaces == NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1915 goto cleanup; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1916 for (int i = 0; i < ga_impl.ga_len; ++i) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1917 cl->class_interfaces[i] = ((char_u **)ga_impl.ga_data)[i]; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1918 VIM_CLEAR(ga_impl.ga_data); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1919 ga_impl.ga_len = 0; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1920 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1921 cl->class_interfaces_cl = intf_classes; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1922 intf_classes = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1923 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1924 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1925 if (cl->class_interface_count > 0 || extends_cl != NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1926 { |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1927 // Add a method and member lookup table to each of the interface |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1928 // classes. |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1929 if (add_lookup_tables(cl, extends_cl, &objmethods) == FAIL) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1930 goto cleanup; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1931 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1932 |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1933 // Allocate a typval for each class member and initialize it. |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1934 if (is_class && cl->class_class_member_count > 0) |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1935 add_class_members(cl, eap); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1936 |
32903
54c01bb98b8e
patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents:
32896
diff
changeset
|
1937 int have_new = FALSE; |
54c01bb98b8e
patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents:
32896
diff
changeset
|
1938 ufunc_T *class_func = NULL; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1939 for (int i = 0; i < classfunctions.ga_len; ++i) |
32903
54c01bb98b8e
patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents:
32896
diff
changeset
|
1940 { |
54c01bb98b8e
patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents:
32896
diff
changeset
|
1941 class_func = ((ufunc_T **)classfunctions.ga_data)[i]; |
54c01bb98b8e
patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents:
32896
diff
changeset
|
1942 if (STRCMP(class_func->uf_name, "new") == 0) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1943 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1944 have_new = TRUE; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1945 break; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1946 } |
32903
54c01bb98b8e
patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents:
32896
diff
changeset
|
1947 } |
54c01bb98b8e
patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents:
32896
diff
changeset
|
1948 |
54c01bb98b8e
patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents:
32896
diff
changeset
|
1949 if (have_new) |
54c01bb98b8e
patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents:
32896
diff
changeset
|
1950 // The return type of new() is an object of class "cl" |
54c01bb98b8e
patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents:
32896
diff
changeset
|
1951 class_func->uf_ret_type->tt_class = cl; |
54c01bb98b8e
patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents:
32896
diff
changeset
|
1952 else if (is_class && !is_abstract && !have_new) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1953 // No new() method was defined, add the default constructor. |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1954 add_default_constructor(cl, &classfunctions, &type_list); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1955 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1956 // Move all the functions into the created class. |
32896
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1957 if (add_classfuncs_objmethods(cl, extends_cl, &classfunctions, |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1958 &objmethods) == FAIL) |
223765c87ea9
patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents:
32874
diff
changeset
|
1959 goto cleanup; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1960 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1961 cl->class_type.tt_type = VAR_CLASS; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1962 cl->class_type.tt_class = cl; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1963 cl->class_object_type.tt_type = VAR_OBJECT; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1964 cl->class_object_type.tt_class = cl; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1965 cl->class_type_list = type_list; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1966 |
33160
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
1967 class_created(cl); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
1968 |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1969 // TODO: |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1970 // - Fill hashtab with object members and methods ? |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1971 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1972 // Add the class to the script-local variables. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1973 // TODO: handle other context, e.g. in a function |
33119
bede81965821
patch 9.0.1842: Need more accurate profiling
Christian Brabandt <cb@256bit.org>
parents:
33109
diff
changeset
|
1974 // TODO: does uf_hash need to be cleared? |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1975 typval_T tv; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1976 tv.v_type = VAR_CLASS; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1977 tv.vval.v_class = cl; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1978 is_export = class_export; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1979 SOURCING_LNUM = start_lnum; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1980 set_var_const(cl->class_name, current_sctx.sc_sid, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1981 NULL, &tv, FALSE, 0, 0); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1982 return; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1983 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1984 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1985 cleanup: |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1986 if (cl != NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1987 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1988 vim_free(cl->class_name); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1989 vim_free(cl->class_class_functions); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1990 if (cl->class_interfaces != NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1991 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1992 for (int i = 0; i < cl->class_interface_count; ++i) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1993 vim_free(cl->class_interfaces[i]); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1994 vim_free(cl->class_interfaces); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1995 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1996 if (cl->class_interfaces_cl != NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1997 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1998 for (int i = 0; i < cl->class_interface_count; ++i) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
1999 class_unref(cl->class_interfaces_cl[i]); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2000 vim_free(cl->class_interfaces_cl); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2001 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2002 vim_free(cl->class_obj_members); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2003 vim_free(cl->class_obj_methods); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2004 vim_free(cl); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2005 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2006 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2007 vim_free(extends); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2008 class_unref(extends_cl); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2009 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2010 if (intf_classes != NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2011 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2012 for (int i = 0; i < ga_impl.ga_len; ++i) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2013 class_unref(intf_classes[i]); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2014 vim_free(intf_classes); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2015 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2016 ga_clear_strings(&ga_impl); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2017 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2018 for (int round = 1; round <= 2; ++round) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2019 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2020 garray_T *gap = round == 1 ? &classmembers : &objmembers; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2021 if (gap->ga_len == 0 || gap->ga_data == NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2022 continue; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2023 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2024 for (int i = 0; i < gap->ga_len; ++i) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2025 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2026 ocmember_T *m = ((ocmember_T *)gap->ga_data) + i; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2027 vim_free(m->ocm_name); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2028 vim_free(m->ocm_init); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2029 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2030 ga_clear(gap); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2031 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2032 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2033 for (int i = 0; i < objmethods.ga_len; ++i) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2034 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2035 ufunc_T *uf = ((ufunc_T **)objmethods.ga_data)[i]; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2036 func_clear_free(uf, FALSE); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2037 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2038 ga_clear(&objmethods); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2039 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2040 for (int i = 0; i < classfunctions.ga_len; ++i) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2041 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2042 ufunc_T *uf = ((ufunc_T **)classfunctions.ga_data)[i]; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2043 func_clear_free(uf, FALSE); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2044 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2045 ga_clear(&classfunctions); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2046 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2047 clear_type_list(&type_list); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2048 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2049 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2050 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2051 * Find member "name" in class "cl", set "member_idx" to the member index and |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2052 * return its type. |
33109
2b5cc29b0a0e
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents:
33106
diff
changeset
|
2053 * When "is_object" is TRUE, then look for object members. Otherwise look for |
2b5cc29b0a0e
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents:
33106
diff
changeset
|
2054 * class members. |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2055 * When not found "member_idx" is set to -1 and t_any is returned. |
33106
d994ba4bd9ca
patch 9.0.1837: Vim9: class_member_type() can be optimized
Christian Brabandt <cb@256bit.org>
parents:
33088
diff
changeset
|
2056 * Set *p_m ocmmember_T if not NULL |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2057 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2058 type_T * |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2059 class_member_type( |
33088
667a17904f64
patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents:
33070
diff
changeset
|
2060 class_T *cl, |
33109
2b5cc29b0a0e
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents:
33106
diff
changeset
|
2061 int is_object, |
33088
667a17904f64
patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents:
33070
diff
changeset
|
2062 char_u *name, |
667a17904f64
patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents:
33070
diff
changeset
|
2063 char_u *name_end, |
33286
0c3553cfe22e
patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents:
33278
diff
changeset
|
2064 int *member_idx) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2065 { |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2066 size_t len = name_end - name; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2067 ocmember_T *m; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2068 |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2069 *member_idx = -1; // not found (yet) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2070 |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2071 m = member_lookup(cl, is_object ? VAR_OBJECT : VAR_CLASS, name, len, |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2072 member_idx); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2073 if (m == NULL) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2074 { |
33286
0c3553cfe22e
patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents:
33278
diff
changeset
|
2075 member_not_found_msg(cl, is_object ? VAR_OBJECT : VAR_CLASS, name, |
0c3553cfe22e
patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents:
33278
diff
changeset
|
2076 len); |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2077 return &t_any; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2078 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2079 |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2080 return m->ocm_type; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2081 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2082 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2083 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2084 * Handle ":enum" up to ":endenum". |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2085 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2086 void |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2087 ex_enum(exarg_T *eap UNUSED) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2088 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2089 // TODO |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2090 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2091 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2092 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2093 * Handle ":type". |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2094 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2095 void |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2096 ex_type(exarg_T *eap UNUSED) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2097 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2098 // TODO |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2099 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2100 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2101 /* |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2102 * Returns OK if a member variable named "name" is present in the class "cl". |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2103 * Otherwise returns FAIL. If found, the member variable typval is set in |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2104 * "rettv". If "is_object" is TRUE, then the object member variable table is |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2105 * searched. Otherwise the class member variable table is searched. |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2106 */ |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2107 static int |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2108 get_member_tv( |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2109 class_T *cl, |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2110 int is_object, |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2111 char_u *name, |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2112 size_t namelen, |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2113 typval_T *rettv) |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2114 { |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2115 ocmember_T *m; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2116 int m_idx; |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2117 |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2118 m = member_lookup(cl, is_object ? VAR_OBJECT : VAR_CLASS, name, namelen, |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2119 &m_idx); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2120 if (m == NULL) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2121 return FAIL; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2122 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2123 if (*name == '_') |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2124 { |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
2125 semsg(_(e_cannot_access_private_variable_str), m->ocm_name); |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2126 return FAIL; |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2127 } |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2128 |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2129 // The object only contains a pointer to the class, the member |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2130 // values array follows right after that. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2131 object_T *obj = rettv->vval.v_object; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2132 if (is_object) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2133 { |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2134 typval_T *tv = (typval_T *)(obj + 1) + m_idx; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2135 copy_tv(tv, rettv); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2136 } |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2137 else |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2138 copy_tv(&cl->class_members_tv[m_idx], rettv); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2139 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2140 object_unref(obj); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2141 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2142 return OK; |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2143 } |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2144 |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2145 /* |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2146 * Evaluate what comes after a class: |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2147 * - class member: SomeClass.varname |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2148 * - class function: SomeClass.SomeMethod() |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2149 * - class constructor: SomeClass.new() |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2150 * - object member: someObject.varname |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2151 * - object method: someObject.SomeMethod() |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2152 * |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2153 * "*arg" points to the '.'. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2154 * "*arg" is advanced to after the member name or method call. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2155 * |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2156 * Returns FAIL or OK. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2157 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2158 int |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2159 class_object_index( |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2160 char_u **arg, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2161 typval_T *rettv, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2162 evalarg_T *evalarg, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2163 int verbose UNUSED) // give error messages |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2164 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2165 if (VIM_ISWHITE((*arg)[1])) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2166 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2167 semsg(_(e_no_white_space_allowed_after_str_str), ".", *arg); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2168 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2169 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2170 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2171 ++*arg; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2172 char_u *name = *arg; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2173 char_u *name_end = find_name_end(name, NULL, NULL, FNE_CHECK_START); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2174 if (name_end == name) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2175 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2176 size_t len = name_end - name; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2177 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2178 class_T *cl; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2179 if (rettv->v_type == VAR_CLASS) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2180 cl = rettv->vval.v_class; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2181 else // VAR_OBJECT |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2182 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2183 if (rettv->vval.v_object == NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2184 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2185 emsg(_(e_using_null_object)); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2186 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2187 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2188 cl = rettv->vval.v_object->obj_class; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2189 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2190 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2191 if (cl == NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2192 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2193 emsg(_(e_incomplete_type)); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2194 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2195 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2196 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2197 if (*name_end == '(') |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2198 { |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2199 ufunc_T *fp; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2200 |
33246
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2201 fp = method_lookup(cl, rettv->v_type, name, len, NULL); |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2202 if (fp == NULL) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2203 { |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2204 method_not_found_msg(cl, rettv->v_type, name, len); |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2205 return FAIL; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2206 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2207 |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2208 typval_T argvars[MAX_FUNC_ARGS + 1]; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2209 int argcount = 0; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2210 |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2211 if (*fp->uf_name == '_') |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2212 { |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2213 // Cannot access a private method outside of a class |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2214 semsg(_(e_cannot_access_private_method_str), name); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2215 return FAIL; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2216 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2217 |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2218 char_u *argp = name_end; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2219 int ret = get_func_arguments(&argp, evalarg, 0, |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2220 argvars, &argcount); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2221 if (ret == FAIL) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2222 return FAIL; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2223 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2224 funcexe_T funcexe; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2225 CLEAR_FIELD(funcexe); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2226 funcexe.fe_evaluate = TRUE; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2227 if (rettv->v_type == VAR_OBJECT) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2228 { |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2229 funcexe.fe_object = rettv->vval.v_object; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2230 ++funcexe.fe_object->obj_refcount; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2231 } |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2232 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2233 // Clear the class or object after calling the function, in |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2234 // case the refcount is one. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2235 typval_T tv_tofree = *rettv; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2236 rettv->v_type = VAR_UNKNOWN; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2237 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2238 // Call the user function. Result goes into rettv; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2239 int error = call_user_func_check(fp, argcount, argvars, |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2240 rettv, &funcexe, NULL); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2241 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2242 // Clear the previous rettv and the arguments. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2243 clear_tv(&tv_tofree); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2244 for (int idx = 0; idx < argcount; ++idx) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2245 clear_tv(&argvars[idx]); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2246 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2247 if (error != FCERR_NONE) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2248 { |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2249 user_func_error(error, printable_func_name(fp), |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2250 funcexe.fe_found_var); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2251 return FAIL; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2252 } |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2253 *arg = argp; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2254 return OK; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2255 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2256 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2257 else if (rettv->v_type == VAR_OBJECT) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2258 { |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2259 // Search in the object member variable table and the class member |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2260 // variable table. |
33225
52b121d4feb5
patch 9.0.1887: Vim9: class members are accessible via object
Christian Brabandt <cb@256bit.org>
parents:
33217
diff
changeset
|
2261 if (get_member_tv(cl, TRUE, name, len, rettv) == OK) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2262 { |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2263 *arg = name_end; |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2264 return OK; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2265 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2266 |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2267 member_not_found_msg(cl, VAR_OBJECT, name, len); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2268 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2269 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2270 else if (rettv->v_type == VAR_CLASS) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2271 { |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2272 int m_idx; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2273 |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2274 // class member |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2275 ocmember_T *m = class_member_lookup(cl, name, len, &m_idx); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2276 if (m == NULL) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2277 { |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2278 member_not_found_msg(cl, VAR_CLASS, name, len); |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2279 return FAIL; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2280 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2281 |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2282 if (*name == '_') |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2283 { |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
2284 semsg(_(e_cannot_access_private_variable_str), m->ocm_name); |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2285 return FAIL; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2286 } |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2287 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2288 typval_T *tv = &cl->class_members_tv[m_idx]; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2289 copy_tv(tv, rettv); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2290 class_unref(cl); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2291 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2292 *arg = name_end; |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2293 return OK; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2294 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2295 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2296 return FAIL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2297 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2298 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2299 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2300 * If "arg" points to a class or object method, return it. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2301 * Otherwise return NULL. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2302 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2303 ufunc_T * |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2304 find_class_func(char_u **arg) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2305 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2306 char_u *name = *arg; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2307 char_u *name_end = find_name_end(name, NULL, NULL, FNE_CHECK_START); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2308 if (name_end == name || *name_end != '.') |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2309 return NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2310 |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2311 ufunc_T *fp = NULL; |
33201
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2312 size_t len = name_end - name; |
36c13b964eb3
patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents:
33173
diff
changeset
|
2313 typval_T tv; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2314 tv.v_type = VAR_UNKNOWN; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2315 if (eval_variable(name, (int)len, |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2316 0, &tv, NULL, EVAL_VAR_NOAUTOLOAD) == FAIL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2317 return NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2318 if (tv.v_type != VAR_CLASS && tv.v_type != VAR_OBJECT) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2319 goto fail_after_eval; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2320 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2321 class_T *cl = tv.v_type == VAR_CLASS ? tv.vval.v_class |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2322 : tv.vval.v_object->obj_class; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2323 if (cl == NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2324 goto fail_after_eval; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2325 char_u *fname = name_end + 1; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2326 char_u *fname_end = find_name_end(fname, NULL, NULL, FNE_CHECK_START); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2327 if (fname_end == fname) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2328 goto fail_after_eval; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2329 len = fname_end - fname; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2330 |
33246
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2331 fp = method_lookup(cl, tv.v_type, fname, len, NULL); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2332 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2333 fail_after_eval: |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2334 clear_tv(&tv); |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2335 return fp; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2336 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2337 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2338 /* |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2339 * Returns the index of class variable "name" in the class "cl". |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2340 * Returns -1, if the variable is not found. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2341 * If "namelen" is zero, then it is assumed that "name" is NUL terminated. |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2342 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2343 int |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2344 class_member_idx(class_T *cl, char_u *name, size_t namelen) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2345 { |
33246
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2346 int idx; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2347 class_member_lookup(cl, name, namelen, &idx); |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2348 return idx; |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2349 } |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2350 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2351 /* |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2352 * Returns a pointer to the class member variable "name" in the class "cl". |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2353 * Returns NULL if the variable is not found. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2354 * The member variable index is set in "idx". |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2355 */ |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2356 ocmember_T * |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2357 class_member_lookup(class_T *cl, char_u *name, size_t namelen, int *idx) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2358 { |
33246
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2359 ocmember_T *ret_m = NULL; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2360 int ret_idx = -1; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2361 for (int i = 0; i < cl->class_class_member_count; ++i) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2362 { |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2363 ocmember_T *m = &cl->class_class_members[i]; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2364 if (namelen) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2365 { |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2366 if (STRNCMP(name, m->ocm_name, namelen) == 0 |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2367 && m->ocm_name[namelen] == NUL) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2368 { |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2369 ret_m = m; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2370 ret_idx = i; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2371 break; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2372 } |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2373 } |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2374 else if (STRCMP(name, m->ocm_name) == 0) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2375 { |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2376 ret_m = m; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2377 ret_idx = i; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2378 break; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2379 } |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2380 } |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2381 if (idx != NULL) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2382 *idx = ret_idx; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2383 return ret_m; |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2384 } |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2385 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2386 /* |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2387 * Returns the index of class method "name" in the class "cl". |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2388 * Returns -1, if the method is not found. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2389 */ |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2390 int |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2391 class_method_idx(class_T *cl, char_u *name, size_t namelen) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2392 { |
33246
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2393 int idx; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2394 class_method_lookup(cl, name, namelen, &idx); |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2395 return idx; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2396 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2397 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2398 /* |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2399 * Returns a pointer to the class method "name" in class "cl". |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2400 * Returns NULL if the method is not found. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2401 * The method index is set in "idx". |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2402 */ |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2403 ufunc_T * |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2404 class_method_lookup(class_T *cl, char_u *name, size_t namelen, int *idx) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2405 { |
33246
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2406 ufunc_T *ret_fp = NULL; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2407 int ret_idx = -1; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2408 for (int i = 0; i < cl->class_class_function_count; ++i) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2409 { |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2410 ufunc_T *fp = cl->class_class_functions[i]; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2411 char_u *ufname = (char_u *)fp->uf_name; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2412 if (STRNCMP(name, ufname, namelen) == 0 && ufname[namelen] == NUL) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2413 { |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2414 ret_fp = fp; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2415 ret_idx = i; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2416 break; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2417 } |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2418 } |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2419 if (idx != NULL) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2420 *idx = ret_idx; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2421 return ret_fp; |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2422 } |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2423 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2424 /* |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2425 * Returns the index of object member variable "name" in the class "cl". |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2426 * Returns -1, if the variable is not found. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2427 * If "namelen" is zero, then it is assumed that "name" is NUL terminated. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2428 */ |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2429 int |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2430 object_member_idx(class_T *cl, char_u *name, size_t namelen) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2431 { |
33246
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2432 int idx; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2433 object_member_lookup(cl, name, namelen, &idx); |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2434 return idx; |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2435 } |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2436 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2437 /* |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2438 * Returns a pointer to the object member variable "name" in the class "cl". |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2439 * Returns NULL if the variable is not found. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2440 * The object member variable index is set in "idx". |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2441 */ |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2442 ocmember_T * |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2443 object_member_lookup(class_T *cl, char_u *name, size_t namelen, int *idx) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2444 { |
33246
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2445 ocmember_T *ret_m = NULL; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2446 int ret_idx = -1; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2447 for (int i = 0; i < cl->class_obj_member_count; ++i) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2448 { |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2449 ocmember_T *m = &cl->class_obj_members[i]; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2450 if (namelen) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2451 { |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2452 if (STRNCMP(name, m->ocm_name, namelen) == 0 |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2453 && m->ocm_name[namelen] == NUL) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2454 { |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2455 ret_m = m; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2456 ret_idx = i; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2457 break; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2458 } |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2459 } |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2460 else if (STRCMP(name, m->ocm_name) == 0) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2461 { |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2462 ret_m = m; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2463 ret_idx = i; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2464 break; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2465 } |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2466 } |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2467 if (idx != NULL) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2468 *idx = ret_idx; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2469 return ret_m; |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2470 } |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2471 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2472 /* |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2473 * Returns the index of object method "name" in the class "cl". |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2474 * Returns -1, if the method is not found. |
33227
3672d3d13524
patch 9.0.1888: Vim9: Problem trying to invoke class method
Christian Brabandt <cb@256bit.org>
parents:
33225
diff
changeset
|
2475 */ |
3672d3d13524
patch 9.0.1888: Vim9: Problem trying to invoke class method
Christian Brabandt <cb@256bit.org>
parents:
33225
diff
changeset
|
2476 int |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2477 object_method_idx(class_T *cl, char_u *name, size_t namelen) |
33227
3672d3d13524
patch 9.0.1888: Vim9: Problem trying to invoke class method
Christian Brabandt <cb@256bit.org>
parents:
33225
diff
changeset
|
2478 { |
33246
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2479 int idx; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2480 object_method_lookup(cl, name, namelen, &idx); |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2481 return idx; |
33227
3672d3d13524
patch 9.0.1888: Vim9: Problem trying to invoke class method
Christian Brabandt <cb@256bit.org>
parents:
33225
diff
changeset
|
2482 } |
3672d3d13524
patch 9.0.1888: Vim9: Problem trying to invoke class method
Christian Brabandt <cb@256bit.org>
parents:
33225
diff
changeset
|
2483 |
3672d3d13524
patch 9.0.1888: Vim9: Problem trying to invoke class method
Christian Brabandt <cb@256bit.org>
parents:
33225
diff
changeset
|
2484 /* |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2485 * Returns a pointer to the object method "name" in class "cl". |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2486 * Returns NULL if the method is not found. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2487 * The object method index is set in "idx". |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2488 */ |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2489 ufunc_T * |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2490 object_method_lookup(class_T *cl, char_u *name, size_t namelen, int *idx) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2491 { |
33246
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2492 ufunc_T *ret_fp = NULL; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2493 int ret_idx = -1; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2494 for (int i = 0; i < cl->class_obj_method_count; ++i) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2495 { |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2496 ufunc_T *fp = cl->class_obj_methods[i]; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2497 // Use a separate pointer to avoid that ASAN complains about |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2498 // uf_name[] only being 4 characters. |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2499 char_u *ufname = (char_u *)fp->uf_name; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2500 if (STRNCMP(name, ufname, namelen) == 0 && ufname[namelen] == NUL) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2501 { |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2502 ret_fp = fp; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2503 ret_idx = i; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2504 break; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2505 } |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2506 } |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2507 if (idx != NULL) |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2508 *idx = ret_idx; |
877dddec681f
patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents:
33233
diff
changeset
|
2509 return ret_fp; |
33233
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2510 } |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2511 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2512 /* |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2513 * Lookup a class or object member variable by name. If v_type is VAR_CLASS, |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2514 * then lookup a class member variable and if it is VAR_OBJECT, then lookup a |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2515 * object member variable. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2516 * |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2517 * Returns a pointer to the member variable structure if variable is found. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2518 * Otherwise returns NULL. The member variable index is set in "*idx". |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2519 */ |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2520 ocmember_T * |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2521 member_lookup( |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2522 class_T *cl, |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2523 vartype_T v_type, |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2524 char_u *name, |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2525 size_t namelen, |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2526 int *idx) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2527 { |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2528 if (v_type == VAR_CLASS) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2529 return class_member_lookup(cl, name, namelen, idx); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2530 else |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2531 return object_member_lookup(cl, name, namelen, idx); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2532 } |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2533 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2534 /* |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2535 * Lookup a class or object method by name. If v_type is VAR_CLASS, then |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2536 * lookup a class method and if it is VAR_OBJECT, then lookup a object method. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2537 * |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2538 * Returns a pointer to the method structure if variable is found. |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2539 * Otherwise returns NULL. The method variable index is set in "*idx". |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2540 */ |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2541 ufunc_T * |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2542 method_lookup( |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2543 class_T *cl, |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2544 vartype_T v_type, |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2545 char_u *name, |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2546 size_t namelen, |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2547 int *idx) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2548 { |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2549 if (v_type == VAR_CLASS) |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2550 return class_method_lookup(cl, name, namelen, idx); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2551 else |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2552 return object_method_lookup(cl, name, namelen, idx); |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2553 } |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2554 |
108d890d887f
patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents:
33227
diff
changeset
|
2555 /* |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2556 * Return TRUE if current context "cctx_arg" is inside class "cl". |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2557 * Return FALSE if not. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2558 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2559 int |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2560 inside_class(cctx_T *cctx_arg, class_T *cl) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2561 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2562 for (cctx_T *cctx = cctx_arg; cctx != NULL; cctx = cctx->ctx_outer) |
33204
36aebbf8389f
patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents:
33201
diff
changeset
|
2563 if (cctx->ctx_ufunc != NULL |
33401
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2564 && class_instance_of(cctx->ctx_ufunc->uf_class, cl, TRUE)) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2565 return TRUE; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2566 return FALSE; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2567 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2568 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2569 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2570 * Make a copy of an object. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2571 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2572 void |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2573 copy_object(typval_T *from, typval_T *to) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2574 { |
32960
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
2575 if (from->vval.v_object == NULL) |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
2576 to->vval.v_object = NULL; |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
2577 else |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
2578 { |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
2579 to->vval.v_object = from->vval.v_object; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2580 ++to->vval.v_object->obj_refcount; |
32960
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
2581 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2582 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2583 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2584 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2585 * Free an object. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2586 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2587 static void |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2588 object_clear(object_T *obj) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2589 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2590 // Avoid a recursive call, it can happen if "obj" has a circular reference. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2591 obj->obj_refcount = INT_MAX; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2592 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2593 class_T *cl = obj->obj_class; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2594 |
32792
ba5a67216596
patch 9.0.1712: missing null check in object_clear()
Christian Brabandt <cb@256bit.org>
parents:
32772
diff
changeset
|
2595 if (!cl) |
33006
29b2193466e0
patch 9.0.1795: Indentation issues
Christian Brabandt <cb@256bit.org>
parents:
32972
diff
changeset
|
2596 return; |
32792
ba5a67216596
patch 9.0.1712: missing null check in object_clear()
Christian Brabandt <cb@256bit.org>
parents:
32772
diff
changeset
|
2597 |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2598 // the member values are just after the object structure |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2599 typval_T *tv = (typval_T *)(obj + 1); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2600 for (int i = 0; i < cl->class_obj_member_count; ++i) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2601 clear_tv(tv + i); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2602 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2603 // Remove from the list headed by "first_object". |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2604 object_cleared(obj); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2605 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2606 vim_free(obj); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2607 class_unref(cl); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2608 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2609 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2610 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2611 * Unreference an object. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2612 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2613 void |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2614 object_unref(object_T *obj) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2615 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2616 if (obj != NULL && --obj->obj_refcount <= 0) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2617 object_clear(obj); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2618 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2619 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2620 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2621 * Make a copy of a class. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2622 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2623 void |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2624 copy_class(typval_T *from, typval_T *to) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2625 { |
32960
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
2626 if (from->vval.v_class == NULL) |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
2627 to->vval.v_class = NULL; |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
2628 else |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
2629 { |
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
2630 to->vval.v_class = from->vval.v_class; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2631 ++to->vval.v_class->class_refcount; |
32960
d5c05e15cf81
patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents:
32903
diff
changeset
|
2632 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2633 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2634 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2635 /* |
33160
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2636 * Free the class "cl" and its contents. |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2637 */ |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2638 static void |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2639 class_free(class_T *cl) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2640 { |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2641 // Freeing what the class contains may recursively come back here. |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2642 // Clear "class_name" first, if it is NULL the class does not need to |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2643 // be freed. |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2644 VIM_CLEAR(cl->class_name); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2645 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2646 class_unref(cl->class_extends); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2647 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2648 for (int i = 0; i < cl->class_interface_count; ++i) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2649 { |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2650 vim_free(((char_u **)cl->class_interfaces)[i]); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2651 if (cl->class_interfaces_cl[i] != NULL) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2652 class_unref(cl->class_interfaces_cl[i]); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2653 } |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2654 vim_free(cl->class_interfaces); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2655 vim_free(cl->class_interfaces_cl); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2656 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2657 itf2class_T *next; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2658 for (itf2class_T *i2c = cl->class_itf2class; i2c != NULL; i2c = next) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2659 { |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2660 next = i2c->i2c_next; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2661 vim_free(i2c); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2662 } |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2663 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2664 for (int i = 0; i < cl->class_class_member_count; ++i) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2665 { |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2666 ocmember_T *m = &cl->class_class_members[i]; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2667 vim_free(m->ocm_name); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2668 vim_free(m->ocm_init); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2669 if (cl->class_members_tv != NULL) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2670 clear_tv(&cl->class_members_tv[i]); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2671 } |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2672 vim_free(cl->class_class_members); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2673 vim_free(cl->class_members_tv); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2674 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2675 for (int i = 0; i < cl->class_obj_member_count; ++i) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2676 { |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2677 ocmember_T *m = &cl->class_obj_members[i]; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2678 vim_free(m->ocm_name); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2679 vim_free(m->ocm_init); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2680 } |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2681 vim_free(cl->class_obj_members); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2682 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2683 for (int i = 0; i < cl->class_class_function_count; ++i) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2684 { |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2685 ufunc_T *uf = cl->class_class_functions[i]; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2686 func_clear_free(uf, FALSE); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2687 } |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2688 vim_free(cl->class_class_functions); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2689 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2690 for (int i = 0; i < cl->class_obj_method_count; ++i) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2691 { |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2692 ufunc_T *uf = cl->class_obj_methods[i]; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2693 func_clear_free(uf, FALSE); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2694 } |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2695 vim_free(cl->class_obj_methods); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2696 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2697 clear_type_list(&cl->class_type_list); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2698 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2699 class_cleared(cl); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2700 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2701 vim_free(cl); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2702 } |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2703 |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2704 /* |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2705 * Unreference a class. Free it when the reference count goes down to zero. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2706 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2707 void |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2708 class_unref(class_T *cl) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2709 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2710 if (cl != NULL && --cl->class_refcount <= 0 && cl->class_name != NULL) |
33160
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2711 class_free(cl); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2712 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2713 |
33160
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2714 /* |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2715 * Go through the list of all classes and free items without "copyID". |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2716 */ |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2717 int |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2718 class_free_nonref(int copyID) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2719 { |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2720 int did_free = FALSE; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2721 |
33160
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2722 for (class_T *cl = first_class; cl != NULL; cl = next_nonref_class) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2723 { |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2724 next_nonref_class = cl->class_next_used; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2725 if ((cl->class_copyID & COPYID_MASK) != (copyID & COPYID_MASK)) |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2726 { |
33160
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2727 // Free the class and items it contains. |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2728 class_free(cl); |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2729 did_free = TRUE; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2730 } |
33160
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2731 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2732 |
33160
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2733 next_nonref_class = NULL; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2734 return did_free; |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2735 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2736 |
33160
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2737 int |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2738 set_ref_in_classes(int copyID) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2739 { |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2740 for (class_T *cl = first_class; cl != NULL; cl = cl->class_next_used) |
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2741 set_ref_in_item_class(cl, copyID, NULL, NULL); |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2742 |
33160
4ecf54d709b3
patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents:
33119
diff
changeset
|
2743 return FALSE; |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2744 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2745 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2746 static object_T *first_object = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2747 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2748 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2749 * Call this function when an object has been created. It will be added to the |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2750 * list headed by "first_object". |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2751 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2752 void |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2753 object_created(object_T *obj) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2754 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2755 if (first_object != NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2756 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2757 obj->obj_next_used = first_object; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2758 first_object->obj_prev_used = obj; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2759 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2760 first_object = obj; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2761 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2762 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2763 static object_T *next_nonref_obj = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2764 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2765 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2766 * Call this function when an object has been cleared and is about to be freed. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2767 * It is removed from the list headed by "first_object". |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2768 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2769 void |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2770 object_cleared(object_T *obj) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2771 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2772 if (obj->obj_next_used != NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2773 obj->obj_next_used->obj_prev_used = obj->obj_prev_used; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2774 if (obj->obj_prev_used != NULL) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2775 obj->obj_prev_used->obj_next_used = obj->obj_next_used; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2776 else if (first_object == obj) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2777 first_object = obj->obj_next_used; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2778 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2779 // update the next object to check if needed |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2780 if (obj == next_nonref_obj) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2781 next_nonref_obj = obj->obj_next_used; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2782 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2783 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2784 /* |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2785 * Go through the list of all objects and free items without "copyID". |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2786 */ |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2787 int |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2788 object_free_nonref(int copyID) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2789 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2790 int did_free = FALSE; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2791 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2792 for (object_T *obj = first_object; obj != NULL; obj = next_nonref_obj) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2793 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2794 next_nonref_obj = obj->obj_next_used; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2795 if ((obj->obj_copyID & COPYID_MASK) != (copyID & COPYID_MASK)) |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2796 { |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2797 // Free the object and items it contains. |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2798 object_clear(obj); |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2799 did_free = TRUE; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2800 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2801 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2802 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2803 next_nonref_obj = NULL; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2804 return did_free; |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2805 } |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2806 |
32972
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2807 /* |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2808 * Echo a class or object method not found message. |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2809 */ |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2810 void |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2811 method_not_found_msg(class_T *cl, vartype_T v_type, char_u *name, size_t len) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2812 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2813 char_u *method_name = vim_strnsave(name, len); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2814 if ((v_type == VAR_OBJECT) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2815 && (class_method_idx(cl, name, len) >= 0)) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2816 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2817 // If this is a class method, then give a different error |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2818 if (*name == '_') |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2819 semsg(_(e_cannot_access_private_method_str), method_name); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2820 else |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
2821 semsg(_(e_class_method_str_accessible_only_using_class_str), |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2822 method_name, cl->class_name); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2823 } |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2824 else if ((v_type == VAR_CLASS) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2825 && (object_method_idx(cl, name, len) >= 0)) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2826 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2827 // If this is an object method, then give a different error |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2828 if (*name == '_') |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2829 semsg(_(e_cannot_access_private_method_str), method_name); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2830 else |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
2831 semsg(_(e_object_method_str_accessible_only_using_object_str), |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2832 method_name, cl->class_name); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2833 } |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2834 else |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2835 semsg(_(e_method_not_found_on_class_str_str), cl->class_name, |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2836 method_name); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2837 vim_free(method_name); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2838 } |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2839 |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2840 /* |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2841 * Echo a class or object member not found message. |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2842 */ |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2843 void |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2844 member_not_found_msg(class_T *cl, vartype_T v_type, char_u *name, size_t len) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2845 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2846 char_u *varname = len ? vim_strnsave(name, len) : vim_strsave(name); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2847 |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2848 if (v_type == VAR_OBJECT) |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2849 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2850 if (class_member_idx(cl, name, len) >= 0) |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
2851 semsg(_(e_class_variable_str_accessible_only_using_class_str), |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2852 varname, cl->class_name); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2853 else |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
2854 semsg(_(e_variable_not_found_on_object_str_str), cl->class_name, |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2855 varname); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2856 } |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2857 else |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2858 { |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2859 if (object_member_idx(cl, name, len) >= 0) |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
2860 semsg(_(e_object_variable_str_accessible_only_using_object_str), |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2861 varname, cl->class_name); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2862 else |
33343
41b50abddeea
patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents:
33326
diff
changeset
|
2863 semsg(_(e_class_variable_str_not_found_in_class_str), |
33260
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2864 varname, cl->class_name); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2865 } |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2866 vim_free(varname); |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2867 } |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2868 |
aba1fa2b7d1e
patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents:
33246
diff
changeset
|
2869 /* |
33006
29b2193466e0
patch 9.0.1795: Indentation issues
Christian Brabandt <cb@256bit.org>
parents:
32972
diff
changeset
|
2870 * Return TRUE when the class "cl", its base class or one of the implemented |
29b2193466e0
patch 9.0.1795: Indentation issues
Christian Brabandt <cb@256bit.org>
parents:
32972
diff
changeset
|
2871 * interfaces matches the class "other_cl". |
32972
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2872 */ |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2873 int |
33401
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2874 class_instance_of(class_T *cl, class_T *other_cl, int covariance_check) |
32972
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2875 { |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2876 if (cl == other_cl) |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2877 return TRUE; |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2878 |
33401
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2879 if (covariance_check) |
32972
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2880 { |
33401
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2881 // Recursively check the base classes. |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2882 for (; cl != NULL; cl = cl->class_extends) |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
2883 { |
33401
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2884 if (cl == other_cl) |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2885 return TRUE; |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2886 // Check the implemented interfaces and the super interfaces |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2887 for (int i = cl->class_interface_count - 1; i >= 0; --i) |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
2888 { |
33401
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2889 class_T *intf = cl->class_interfaces_cl[i]; |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2890 while (intf != NULL) |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2891 { |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2892 if (intf == other_cl) |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2893 return TRUE; |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2894 // check the super interfaces |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2895 intf = intf->class_extends; |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2896 } |
33278
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
2897 } |
b5ed566262d3
patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents:
33268
diff
changeset
|
2898 } |
32972
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2899 } |
33401
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2900 else |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2901 { |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2902 // contra-variance |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2903 for (; other_cl != NULL; other_cl = other_cl->class_extends) |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2904 if (cl == other_cl) |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2905 return TRUE; |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2906 } |
32972
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2907 |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2908 return FALSE; |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2909 } |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2910 |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2911 /* |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2912 * "instanceof(object, classinfo)" function |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2913 */ |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2914 void |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2915 f_instanceof(typval_T *argvars, typval_T *rettv) |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2916 { |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2917 typval_T *object_tv = &argvars[0]; |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2918 typval_T *classinfo_tv = &argvars[1]; |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2919 listitem_T *li; |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2920 |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2921 rettv->vval.v_number = VVAL_FALSE; |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2922 |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2923 if (check_for_object_arg(argvars, 0) == FAIL |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2924 || check_for_class_or_list_arg(argvars, 1) == FAIL) |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2925 return; |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2926 |
33291
4cb421ba3385
patch 9.0.1911: Vim9: segfault with null object and instanceof()
Christian Brabandt <cb@256bit.org>
parents:
33286
diff
changeset
|
2927 if (object_tv->vval.v_object == NULL) |
4cb421ba3385
patch 9.0.1911: Vim9: segfault with null object and instanceof()
Christian Brabandt <cb@256bit.org>
parents:
33286
diff
changeset
|
2928 return; |
4cb421ba3385
patch 9.0.1911: Vim9: segfault with null object and instanceof()
Christian Brabandt <cb@256bit.org>
parents:
33286
diff
changeset
|
2929 |
32972
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2930 if (classinfo_tv->v_type == VAR_LIST) |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2931 { |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2932 FOR_ALL_LIST_ITEMS(classinfo_tv->vval.v_list, li) |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2933 { |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2934 if (li->li_tv.v_type != VAR_CLASS) |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2935 { |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2936 emsg(_(e_class_required)); |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2937 return; |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2938 } |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2939 |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2940 if (class_instance_of(object_tv->vval.v_object->obj_class, |
33401
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2941 li->li_tv.vval.v_class, TRUE) == TRUE) |
32972
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2942 { |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2943 rettv->vval.v_number = VVAL_TRUE; |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2944 return; |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2945 } |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2946 } |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2947 } |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2948 else if (classinfo_tv->v_type == VAR_CLASS) |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2949 { |
33401
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2950 rettv->vval.v_number = class_instance_of( |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2951 object_tv->vval.v_object->obj_class, |
bb99820510ef
patch 9.0.1959: Vim9: methods parameters and types are covariant
Christian Brabandt <cb@256bit.org>
parents:
33387
diff
changeset
|
2952 classinfo_tv->vval.v_class, TRUE); |
32972
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2953 } |
e4851934751a
patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents:
32960
diff
changeset
|
2954 } |
32670
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2955 |
695b50472e85
Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents:
32669
diff
changeset
|
2956 #endif // FEAT_EVAL |