Bug 551738 - Associate classes with their structs
[gnome.gobject-introspection] / girepository / girnode.h
1 /* GObject introspection: Parsed GIR
2  *
3  * Copyright (C) 2005 Matthias Clasen
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 #ifndef __G_IR_NODE_H__
22 #define __G_IR_NODE_H__
23
24 #include <glib.h>
25
26 #include "girmodule.h"
27
28 G_BEGIN_DECLS
29
30 typedef struct _GIrNode GIrNode; 
31 typedef struct _GIrNodeFunction GIrNodeFunction;
32 typedef struct _GIrNodeParam GIrNodeParam;
33 typedef struct _GIrNodeType GIrNodeType;
34 typedef struct _GIrNodeInterface GIrNodeInterface;
35 typedef struct _GIrNodeSignal GIrNodeSignal;
36 typedef struct _GIrNodeProperty GIrNodeProperty;
37 typedef struct _GIrNodeVFunc GIrNodeVFunc;
38 typedef struct _GIrNodeField GIrNodeField;
39 typedef struct _GIrNodeValue GIrNodeValue;
40 typedef struct _GIrNodeEnum GIrNodeEnum;
41 typedef struct _GIrNodeBoxed GIrNodeBoxed;
42 typedef struct _GIrNodeStruct GIrNodeStruct;
43 typedef struct _GIrNodeConstant GIrNodeConstant;
44 typedef struct _GIrNodeErrorDomain GIrNodeErrorDomain;
45 typedef struct _GIrNodeXRef GIrNodeXRef;
46 typedef struct _GIrNodeUnion GIrNodeUnion;
47
48 typedef enum 
49 {
50   G_IR_NODE_INVALID      =  0,
51   G_IR_NODE_FUNCTION     =  1,
52   G_IR_NODE_CALLBACK     =  2,
53   G_IR_NODE_STRUCT       =  3,
54   G_IR_NODE_BOXED        =  4,
55   G_IR_NODE_ENUM         =  5,
56   G_IR_NODE_FLAGS        =  6, 
57   G_IR_NODE_OBJECT       =  7,
58   G_IR_NODE_INTERFACE    =  8,
59   G_IR_NODE_CONSTANT     =  9,
60   G_IR_NODE_ERROR_DOMAIN = 10,
61   G_IR_NODE_UNION        = 11,
62   G_IR_NODE_PARAM        = 12,
63   G_IR_NODE_TYPE         = 13,
64   G_IR_NODE_PROPERTY     = 14,
65   G_IR_NODE_SIGNAL       = 15,
66   G_IR_NODE_VALUE        = 16,
67   G_IR_NODE_VFUNC        = 17,
68   G_IR_NODE_FIELD        = 18,
69   G_IR_NODE_XREF         = 19
70 } GIrNodeTypeId;
71
72 struct _GIrNode
73 {
74   GIrNodeTypeId type;
75   gchar *name;
76 };
77
78 struct _GIrNodeXRef
79 {
80   GIrNode node;
81
82   gchar *namespace;
83 };
84
85 struct _GIrNodeFunction
86 {
87   GIrNode node;
88
89   gboolean deprecated;
90   gboolean is_varargs; /* Not in typelib yet */ 
91
92   gboolean is_method;
93   gboolean is_setter;
94   gboolean is_getter;
95   gboolean is_constructor;
96   gboolean wraps_vfunc;
97   gboolean throws;
98
99   gchar *symbol;
100
101   GIrNodeParam *result;
102   GList *parameters;
103 };
104
105 struct _GIrNodeType 
106 {
107   GIrNode node;
108
109   gboolean is_pointer;
110   gboolean is_basic;
111   gboolean is_array;
112   gboolean is_glist;
113   gboolean is_gslist;
114   gboolean is_ghashtable;
115   gboolean is_interface;
116   gboolean is_error;
117   gint tag;
118
119   gchar *unparsed;
120
121   gboolean zero_terminated;
122   gboolean has_length;
123   gint length;
124   gboolean has_size;
125   gint size;
126   
127   GIrNodeType *parameter_type1;
128   GIrNodeType *parameter_type2;  
129
130   gchar *interface;
131   gchar **errors;
132 };
133
134 struct _GIrNodeParam 
135 {
136   GIrNode node;
137
138   gboolean in;
139   gboolean out;
140   gboolean dipper;
141   gboolean optional;
142   gboolean retval;
143   gboolean allow_none;
144   gboolean transfer;
145   gboolean shallow_transfer;
146   GIScopeType scope;
147   
148   gint8 closure;
149   gint8 destroy;
150   
151   GIrNodeType *type;
152 };
153
154 struct _GIrNodeProperty
155 {
156   GIrNode node;
157
158   gboolean deprecated;
159
160   gchar *name;
161   gboolean readable;
162   gboolean writable;
163   gboolean construct;
164   gboolean construct_only;
165   
166   GIrNodeType *type;
167 };
168
169 struct _GIrNodeSignal 
170 {
171   GIrNode node;
172
173   gboolean deprecated;
174
175   gboolean run_first;
176   gboolean run_last;
177   gboolean run_cleanup;
178   gboolean no_recurse;
179   gboolean detailed;
180   gboolean action;
181   gboolean no_hooks;
182   
183   gboolean has_class_closure;
184   gboolean true_stops_emit;
185   
186   gint class_closure;
187   
188   GList *parameters;
189   GIrNodeParam *result;    
190 };
191
192 struct _GIrNodeVFunc 
193 {
194   GIrNode node;
195
196   gboolean is_varargs; /* Not in typelib yet */ 
197   gboolean must_chain_up;
198   gboolean must_be_implemented;
199   gboolean must_not_be_implemented;
200   gboolean is_class_closure;
201   
202   GList *parameters;
203   GIrNodeParam *result;      
204
205   gint offset;
206 };
207
208 struct _GIrNodeField
209 {
210   GIrNode node;
211
212   gboolean readable;
213   gboolean writable;
214   gint bits;
215   gint offset;
216   
217   GIrNodeType *type;
218 };
219
220 struct _GIrNodeInterface
221 {
222   GIrNode node;
223
224   gboolean abstract;
225   gboolean deprecated;
226
227   gchar *gtype_name;
228   gchar *gtype_init;
229
230   gchar *parent;
231   gchar *class_struct; /* Only applies to classes */
232   
233   GList *interfaces;
234   GList *prerequisites;
235
236   gint alignment;
237   gint size;
238   
239   GList *members;
240 };
241
242 struct _GIrNodeValue
243 {
244   GIrNode node;
245
246   gboolean deprecated;
247
248   guint32 value;
249 };
250
251 struct _GIrNodeConstant
252 {
253   GIrNode node;
254
255   gboolean deprecated;
256
257   GIrNodeType *type;
258   
259   gchar *value;
260 };
261
262 struct _GIrNodeEnum
263 {
264   GIrNode node;
265
266   gboolean deprecated;
267   gint storage_type;
268
269   gchar *gtype_name;
270   gchar *gtype_init;
271
272   GList *values;
273 };
274
275 struct _GIrNodeBoxed
276
277   GIrNode node;
278
279   gboolean deprecated;
280
281   gchar *gtype_name;
282   gchar *gtype_init;
283
284   gint alignment;
285   gint size;
286   
287   GList *members;
288 };
289
290 struct _GIrNodeStruct
291 {
292   GIrNode node;
293
294   gboolean deprecated;
295   gboolean disguised;
296   gboolean is_gclass_struct;
297
298   gchar *gtype_name;
299   gchar *gtype_init;
300
301   gint alignment;
302   gint size;
303   
304   GList *members;
305 };
306
307 struct _GIrNodeUnion
308 {
309   GIrNode node;
310
311   gboolean deprecated;
312   
313   GList *members;
314   GList *discriminators;
315
316   gchar *gtype_name;
317   gchar *gtype_init;
318
319   gint alignment;
320   gint size;
321
322   gint discriminator_offset;
323   GIrNodeType *discriminator_type;
324 };
325
326
327 struct _GIrNodeErrorDomain
328 {
329   GIrNode node;
330
331   gboolean deprecated;
332   
333   gchar *name;
334   gchar *getquark;
335   gchar *codes;
336 };
337
338
339 GIrNode * g_ir_node_new             (GIrNodeTypeId type);
340 void      g_ir_node_free            (GIrNode    *node);
341 guint32   g_ir_node_get_size        (GIrNode    *node);
342 guint32   g_ir_node_get_full_size   (GIrNode    *node);
343 void      g_ir_node_build_typelib   (GIrNode    *node,
344                                      GIrModule  *module,
345                                      GList       *modules,
346                                      GHashTable  *strings,
347                                      GHashTable  *types,
348                                      guchar      *data,
349                                      guint32     *offset,
350                                      guint32     *offset2);
351 int       g_ir_node_cmp             (GIrNode    *node,
352                                      GIrNode    *other);
353 gboolean  g_ir_node_can_have_member (GIrNode    *node);
354 void      g_ir_node_add_member      (GIrNode         *node,
355                                      GIrNodeFunction *member);
356 guint32   write_string              (const gchar *str,
357                                      GHashTable  *strings, 
358                                      guchar      *data,
359                                      guint32     *offset);
360
361 const gchar * g_ir_node_param_direction_string (GIrNodeParam * node);
362 const gchar * g_ir_node_type_to_string         (GIrNodeTypeId type);
363
364 gboolean g_ir_find_node (GIrModule  *module,
365                          GList      *modules,
366                          const char *name,
367                          GIrNode   **node_out,
368                          GIrModule **module_out);
369
370 /* In giroffsets.c */
371
372 void g_ir_node_compute_offsets (GIrNode   *node,
373                                 GIrModule *module,
374                                 GList     *modules);
375
376
377 G_END_DECLS
378
379 #endif  /* __G_IR_NODE_H__ */