1 /* valatypeofexpression.c generated by valac, the Vala compiler
2 * generated from valatypeofexpression.vala, do not modify */
3
4 /* valatypeofexpression.vala
5 *
6 * Copyright (C) 2006-2010 Jürg Billeter
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 *
22 * Author:
23 * Jürg Billeter <j@bitron.ch>
24 */
25
26 #include "vala.h"
27 #include <glib.h>
28
29 #define _vala_code_node_unref0(var) ((var == NULL) ? NULL : (var = (vala_code_node_unref (var), NULL)))
30
31 struct _ValaTypeofExpressionPrivate {
32 ValaDataType* _data_type;
33 };
34
35 static gint ValaTypeofExpression_private_offset;
36 static gpointer vala_typeof_expression_parent_class = NULL;
37
38 static void vala_typeof_expression_real_accept (ValaCodeNode* base,
39 ValaCodeVisitor* visitor);
40 static void vala_typeof_expression_real_accept_children (ValaCodeNode* base,
41 ValaCodeVisitor* visitor);
42 static gboolean vala_typeof_expression_real_is_pure (ValaExpression* base);
43 static void vala_typeof_expression_real_replace_type (ValaCodeNode* base,
44 ValaDataType* old_type,
45 ValaDataType* new_type);
46 static gboolean vala_typeof_expression_real_check (ValaCodeNode* base,
47 ValaCodeContext* context);
48 static void vala_typeof_expression_real_emit (ValaCodeNode* base,
49 ValaCodeGenerator* codegen);
50 static void vala_typeof_expression_finalize (ValaCodeNode * obj);
51 static GType vala_typeof_expression_get_type_once (void);
52
53 static inline gpointer
vala_typeof_expression_get_instance_private(ValaTypeofExpression * self)54 vala_typeof_expression_get_instance_private (ValaTypeofExpression* self)
55 {
56 return G_STRUCT_MEMBER_P (self, ValaTypeofExpression_private_offset);
57 }
58
59 ValaDataType*
vala_typeof_expression_get_type_reference(ValaTypeofExpression * self)60 vala_typeof_expression_get_type_reference (ValaTypeofExpression* self)
61 {
62 ValaDataType* result;
63 ValaDataType* _tmp0_;
64 g_return_val_if_fail (self != NULL, NULL);
65 _tmp0_ = self->priv->_data_type;
66 result = _tmp0_;
67 return result;
68 }
69
70 static gpointer
_vala_code_node_ref0(gpointer self)71 _vala_code_node_ref0 (gpointer self)
72 {
73 return self ? vala_code_node_ref (self) : NULL;
74 }
75
76 void
vala_typeof_expression_set_type_reference(ValaTypeofExpression * self,ValaDataType * value)77 vala_typeof_expression_set_type_reference (ValaTypeofExpression* self,
78 ValaDataType* value)
79 {
80 ValaDataType* _tmp0_;
81 ValaDataType* _tmp1_;
82 g_return_if_fail (self != NULL);
83 _tmp0_ = _vala_code_node_ref0 (value);
84 _vala_code_node_unref0 (self->priv->_data_type);
85 self->priv->_data_type = _tmp0_;
86 _tmp1_ = self->priv->_data_type;
87 vala_code_node_set_parent_node ((ValaCodeNode*) _tmp1_, (ValaCodeNode*) self);
88 }
89
90 /**
91 * Creates a new typeof expression.
92 *
93 * @param type a data type
94 * @param source reference to source code
95 * @return newly created typeof expression
96 */
97 ValaTypeofExpression*
vala_typeof_expression_construct(GType object_type,ValaDataType * type,ValaSourceReference * source)98 vala_typeof_expression_construct (GType object_type,
99 ValaDataType* type,
100 ValaSourceReference* source)
101 {
102 ValaTypeofExpression* self = NULL;
103 g_return_val_if_fail (type != NULL, NULL);
104 self = (ValaTypeofExpression*) vala_expression_construct (object_type);
105 vala_typeof_expression_set_type_reference (self, type);
106 vala_code_node_set_source_reference ((ValaCodeNode*) self, source);
107 return self;
108 }
109
110 ValaTypeofExpression*
vala_typeof_expression_new(ValaDataType * type,ValaSourceReference * source)111 vala_typeof_expression_new (ValaDataType* type,
112 ValaSourceReference* source)
113 {
114 return vala_typeof_expression_construct (VALA_TYPE_TYPEOF_EXPRESSION, type, source);
115 }
116
117 static void
vala_typeof_expression_real_accept(ValaCodeNode * base,ValaCodeVisitor * visitor)118 vala_typeof_expression_real_accept (ValaCodeNode* base,
119 ValaCodeVisitor* visitor)
120 {
121 ValaTypeofExpression * self;
122 self = (ValaTypeofExpression*) base;
123 g_return_if_fail (visitor != NULL);
124 vala_code_visitor_visit_typeof_expression (visitor, self);
125 vala_code_visitor_visit_expression (visitor, (ValaExpression*) self);
126 }
127
128 static void
vala_typeof_expression_real_accept_children(ValaCodeNode * base,ValaCodeVisitor * visitor)129 vala_typeof_expression_real_accept_children (ValaCodeNode* base,
130 ValaCodeVisitor* visitor)
131 {
132 ValaTypeofExpression * self;
133 ValaDataType* _tmp0_;
134 ValaDataType* _tmp1_;
135 self = (ValaTypeofExpression*) base;
136 g_return_if_fail (visitor != NULL);
137 _tmp0_ = vala_typeof_expression_get_type_reference (self);
138 _tmp1_ = _tmp0_;
139 vala_code_node_accept ((ValaCodeNode*) _tmp1_, visitor);
140 }
141
142 static gboolean
vala_typeof_expression_real_is_pure(ValaExpression * base)143 vala_typeof_expression_real_is_pure (ValaExpression* base)
144 {
145 ValaTypeofExpression * self;
146 gboolean result = FALSE;
147 self = (ValaTypeofExpression*) base;
148 result = TRUE;
149 return result;
150 }
151
152 static void
vala_typeof_expression_real_replace_type(ValaCodeNode * base,ValaDataType * old_type,ValaDataType * new_type)153 vala_typeof_expression_real_replace_type (ValaCodeNode* base,
154 ValaDataType* old_type,
155 ValaDataType* new_type)
156 {
157 ValaTypeofExpression * self;
158 ValaDataType* _tmp0_;
159 ValaDataType* _tmp1_;
160 self = (ValaTypeofExpression*) base;
161 g_return_if_fail (old_type != NULL);
162 g_return_if_fail (new_type != NULL);
163 _tmp0_ = vala_typeof_expression_get_type_reference (self);
164 _tmp1_ = _tmp0_;
165 if (_tmp1_ == old_type) {
166 vala_typeof_expression_set_type_reference (self, new_type);
167 }
168 }
169
170 static gboolean
vala_typeof_expression_real_check(ValaCodeNode * base,ValaCodeContext * context)171 vala_typeof_expression_real_check (ValaCodeNode* base,
172 ValaCodeContext* context)
173 {
174 ValaTypeofExpression * self;
175 gboolean _tmp0_;
176 gboolean _tmp1_;
177 ValaDataType* _tmp4_;
178 ValaDataType* _tmp5_;
179 ValaSemanticAnalyzer* _tmp6_;
180 ValaSemanticAnalyzer* _tmp7_;
181 ValaDataType* _tmp8_;
182 gboolean _tmp9_ = FALSE;
183 ValaProfile _tmp10_;
184 ValaProfile _tmp11_;
185 gboolean _tmp17_ = FALSE;
186 ValaDataType* _tmp18_;
187 gboolean _tmp32_;
188 gboolean _tmp33_;
189 gboolean result = FALSE;
190 self = (ValaTypeofExpression*) base;
191 g_return_val_if_fail (context != NULL, FALSE);
192 _tmp0_ = vala_code_node_get_checked ((ValaCodeNode*) self);
193 _tmp1_ = _tmp0_;
194 if (_tmp1_) {
195 gboolean _tmp2_;
196 gboolean _tmp3_;
197 _tmp2_ = vala_code_node_get_error ((ValaCodeNode*) self);
198 _tmp3_ = _tmp2_;
199 result = !_tmp3_;
200 return result;
201 }
202 vala_code_node_set_checked ((ValaCodeNode*) self, TRUE);
203 _tmp4_ = vala_typeof_expression_get_type_reference (self);
204 _tmp5_ = _tmp4_;
205 vala_code_node_check ((ValaCodeNode*) _tmp5_, context);
206 _tmp6_ = vala_code_context_get_analyzer (context);
207 _tmp7_ = _tmp6_;
208 _tmp8_ = _tmp7_->type_type;
209 vala_expression_set_value_type ((ValaExpression*) self, _tmp8_);
210 _tmp10_ = vala_code_context_get_profile (context);
211 _tmp11_ = _tmp10_;
212 if (_tmp11_ == VALA_PROFILE_GOBJECT) {
213 ValaDataType* _tmp12_;
214 ValaDataType* _tmp13_;
215 _tmp12_ = vala_typeof_expression_get_type_reference (self);
216 _tmp13_ = _tmp12_;
217 _tmp9_ = vala_data_type_has_type_arguments (_tmp13_);
218 } else {
219 _tmp9_ = FALSE;
220 }
221 if (_tmp9_) {
222 ValaDataType* _tmp14_;
223 ValaSourceReference* _tmp15_;
224 ValaSourceReference* _tmp16_;
225 _tmp14_ = self->priv->_data_type;
226 _tmp15_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp14_);
227 _tmp16_ = _tmp15_;
228 vala_report_warning (_tmp16_, "Type argument list without effect");
229 }
230 _tmp18_ = self->priv->_data_type;
231 if (VALA_IS_ARRAY_TYPE (_tmp18_)) {
232 ValaDataType* _tmp19_;
233 ValaDataType* _tmp20_;
234 ValaDataType* _tmp21_;
235 ValaTypeSymbol* _tmp22_;
236 ValaTypeSymbol* _tmp23_;
237 ValaSemanticAnalyzer* _tmp24_;
238 ValaSemanticAnalyzer* _tmp25_;
239 ValaDataType* _tmp26_;
240 ValaTypeSymbol* _tmp27_;
241 ValaTypeSymbol* _tmp28_;
242 _tmp19_ = self->priv->_data_type;
243 _tmp20_ = vala_array_type_get_element_type (G_TYPE_CHECK_INSTANCE_CAST (_tmp19_, VALA_TYPE_ARRAY_TYPE, ValaArrayType));
244 _tmp21_ = _tmp20_;
245 _tmp22_ = vala_data_type_get_type_symbol (_tmp21_);
246 _tmp23_ = _tmp22_;
247 _tmp24_ = vala_code_context_get_analyzer (context);
248 _tmp25_ = _tmp24_;
249 _tmp26_ = _tmp25_->string_type;
250 _tmp27_ = vala_data_type_get_type_symbol (_tmp26_);
251 _tmp28_ = _tmp27_;
252 _tmp17_ = _tmp23_ != _tmp28_;
253 } else {
254 _tmp17_ = FALSE;
255 }
256 if (_tmp17_) {
257 ValaDataType* _tmp29_;
258 ValaSourceReference* _tmp30_;
259 ValaSourceReference* _tmp31_;
260 _tmp29_ = self->priv->_data_type;
261 _tmp30_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp29_);
262 _tmp31_ = _tmp30_;
263 vala_report_warning (_tmp31_, "Arrays do not have a `GLib.Type', with the exception of `string[]'");
264 }
265 _tmp32_ = vala_code_node_get_error ((ValaCodeNode*) self);
266 _tmp33_ = _tmp32_;
267 result = !_tmp33_;
268 return result;
269 }
270
271 static void
vala_typeof_expression_real_emit(ValaCodeNode * base,ValaCodeGenerator * codegen)272 vala_typeof_expression_real_emit (ValaCodeNode* base,
273 ValaCodeGenerator* codegen)
274 {
275 ValaTypeofExpression * self;
276 self = (ValaTypeofExpression*) base;
277 g_return_if_fail (codegen != NULL);
278 vala_code_visitor_visit_typeof_expression ((ValaCodeVisitor*) codegen, self);
279 vala_code_visitor_visit_expression ((ValaCodeVisitor*) codegen, (ValaExpression*) self);
280 }
281
282 static void
vala_typeof_expression_class_init(ValaTypeofExpressionClass * klass,gpointer klass_data)283 vala_typeof_expression_class_init (ValaTypeofExpressionClass * klass,
284 gpointer klass_data)
285 {
286 vala_typeof_expression_parent_class = g_type_class_peek_parent (klass);
287 ((ValaCodeNodeClass *) klass)->finalize = vala_typeof_expression_finalize;
288 g_type_class_adjust_private_offset (klass, &ValaTypeofExpression_private_offset);
289 ((ValaCodeNodeClass *) klass)->accept = (void (*) (ValaCodeNode*, ValaCodeVisitor*)) vala_typeof_expression_real_accept;
290 ((ValaCodeNodeClass *) klass)->accept_children = (void (*) (ValaCodeNode*, ValaCodeVisitor*)) vala_typeof_expression_real_accept_children;
291 ((ValaExpressionClass *) klass)->is_pure = (gboolean (*) (ValaExpression*)) vala_typeof_expression_real_is_pure;
292 ((ValaCodeNodeClass *) klass)->replace_type = (void (*) (ValaCodeNode*, ValaDataType*, ValaDataType*)) vala_typeof_expression_real_replace_type;
293 ((ValaCodeNodeClass *) klass)->check = (gboolean (*) (ValaCodeNode*, ValaCodeContext*)) vala_typeof_expression_real_check;
294 ((ValaCodeNodeClass *) klass)->emit = (void (*) (ValaCodeNode*, ValaCodeGenerator*)) vala_typeof_expression_real_emit;
295 }
296
297 static void
vala_typeof_expression_instance_init(ValaTypeofExpression * self,gpointer klass)298 vala_typeof_expression_instance_init (ValaTypeofExpression * self,
299 gpointer klass)
300 {
301 self->priv = vala_typeof_expression_get_instance_private (self);
302 }
303
304 static void
vala_typeof_expression_finalize(ValaCodeNode * obj)305 vala_typeof_expression_finalize (ValaCodeNode * obj)
306 {
307 ValaTypeofExpression * self;
308 self = G_TYPE_CHECK_INSTANCE_CAST (obj, VALA_TYPE_TYPEOF_EXPRESSION, ValaTypeofExpression);
309 _vala_code_node_unref0 (self->priv->_data_type);
310 VALA_CODE_NODE_CLASS (vala_typeof_expression_parent_class)->finalize (obj);
311 }
312
313 /**
314 * Represents a typeof expression in the source code.
315 */
316 static GType
vala_typeof_expression_get_type_once(void)317 vala_typeof_expression_get_type_once (void)
318 {
319 static const GTypeInfo g_define_type_info = { sizeof (ValaTypeofExpressionClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) vala_typeof_expression_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ValaTypeofExpression), 0, (GInstanceInitFunc) vala_typeof_expression_instance_init, NULL };
320 GType vala_typeof_expression_type_id;
321 vala_typeof_expression_type_id = g_type_register_static (VALA_TYPE_EXPRESSION, "ValaTypeofExpression", &g_define_type_info, 0);
322 ValaTypeofExpression_private_offset = g_type_add_instance_private (vala_typeof_expression_type_id, sizeof (ValaTypeofExpressionPrivate));
323 return vala_typeof_expression_type_id;
324 }
325
326 GType
vala_typeof_expression_get_type(void)327 vala_typeof_expression_get_type (void)
328 {
329 static volatile gsize vala_typeof_expression_type_id__volatile = 0;
330 if (g_once_init_enter (&vala_typeof_expression_type_id__volatile)) {
331 GType vala_typeof_expression_type_id;
332 vala_typeof_expression_type_id = vala_typeof_expression_get_type_once ();
333 g_once_init_leave (&vala_typeof_expression_type_id__volatile, vala_typeof_expression_type_id);
334 }
335 return vala_typeof_expression_type_id__volatile;
336 }
337
338