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