Suppress size/ssize from being generated in GLib
[gnome.gobject-introspection] / giscanner / ast.py
1 # -*- Mode: Python -*-
2 # GObject-Introspection - a framework for introspecting GObject libraries
3 # Copyright (C) 2008  Johan Dahlin
4 #
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
9 #
10 # This program 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
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 # 02110-1301, USA.
19 #
20
21 """AST nodes
22 This file descbribes abstract data type nodes independent on the
23 implementation language.
24
25 These can later on be extended (eg subclassed) with additional information
26 which is language/library/domain specific.
27 """
28
29 ##
30 ## Basic types, modeled on GITypeTag but not equivalent
31 ##
32
33 TYPE_NONE = 'none' # We differ from repository on these first two
34 TYPE_ANY = 'any'
35 TYPE_BOOLEAN = 'boolean'
36 TYPE_INT8 = 'int8'
37 TYPE_UINT8 = 'uint8'
38 TYPE_INT16 = 'int16'
39 TYPE_UINT16 = 'uint16'
40 TYPE_INT = 'int'
41 TYPE_UINT = 'uint'
42 TYPE_INT32 = 'int32'
43 TYPE_UINT32 = 'uint32'
44 TYPE_INT64 = 'int64'
45 TYPE_UINT64 = 'uint64'
46 TYPE_LONG = 'long'
47 TYPE_ULONG = 'ulong'
48 TYPE_SSIZET = 'ssize_t'
49 TYPE_SIZET = 'size_t'
50 TYPE_FLOAT = 'float'
51 TYPE_DOUBLE = 'double'
52 TYPE_STRING = 'string' # requires zero-terminated
53 TYPE_FILENAME = 'filename'
54
55 BASIC_GIR_TYPES = [TYPE_BOOLEAN, TYPE_INT8, TYPE_UINT8, TYPE_INT16,
56                    TYPE_UINT16, TYPE_INT32, TYPE_UINT32, TYPE_INT64,
57                    TYPE_UINT64, TYPE_INT, TYPE_UINT, TYPE_LONG,
58                    TYPE_ULONG, TYPE_SSIZET, TYPE_SIZET, TYPE_FLOAT,
59                    TYPE_DOUBLE]
60 GIR_TYPES = [TYPE_NONE, TYPE_ANY]
61 GIR_TYPES.extend(BASIC_GIR_TYPES)
62 GIR_TYPES.extend([TYPE_STRING, TYPE_FILENAME])
63
64 # Higher-level data types
65 TYPE_SEQUENCE = 'sequence' # Sequence of something
66
67 # Wide/Unicode
68 TYPE_UCHAR = 'uchar'
69 TYPE_USTRING = 'ustring'
70
71 ##
72 ## Parameters
73 ##
74
75 PARAM_DIRECTION_IN = 'in'
76 PARAM_DIRECTION_OUT = 'out'
77 PARAM_DIRECTION_INOUT = 'inout'
78
79 type_names = {}
80 for name in GIR_TYPES:
81     type_names[name] = name
82
83 # C
84 type_names['char'] = TYPE_INT8
85 type_names['unsigned char'] = TYPE_UINT8
86 type_names['short'] = TYPE_INT16
87 type_names['unsigned short'] = TYPE_UINT16
88 type_names['int'] = TYPE_INT
89 type_names['unsigned int'] = TYPE_UINT
90 type_names['long'] = TYPE_LONG
91 type_names['unsigned long'] = TYPE_ULONG
92 type_names['float'] = TYPE_FLOAT
93 type_names['double'] = TYPE_DOUBLE
94 type_names['char*'] = TYPE_STRING
95 type_names['void*'] = TYPE_ANY
96 type_names['void'] = TYPE_NONE
97 type_names['size_t'] = TYPE_SIZET
98 type_names['ssize_t'] = TYPE_SSIZET
99 type_names['time_t'] = TYPE_LONG
100
101 # Suppress some GLib names
102 type_names['uchar'] = TYPE_UINT8
103 type_names['ushort'] = TYPE_UINT16
104 type_names['size'] = TYPE_SIZET
105 type_names['ssize'] = TYPE_SSIZET
106 type_names['pointer'] = TYPE_ANY
107 type_names['constpointer'] = TYPE_ANY
108
109
110 def type_name_from_ctype(ctype):
111     return type_names.get(ctype, ctype)
112
113
114 class Node(object):
115
116     def __init__(self, name=None):
117         self.name = name
118
119     def __repr__(self):
120         return '%s(%r)' % (self.__class__.__name__, self.name)
121
122
123 class Namespace(Node):
124
125     def __init__(self, name):
126         Node.__init__(self, name)
127         self.nodes = []
128
129     def __repr__(self):
130         return '%s(%r, %r)' % (self.__class__.__name__, self.name,
131                                self.nodes)
132
133
134 class Function(Node):
135
136     def __init__(self, name, retval, parameters, symbol):
137         Node.__init__(self, name)
138         self.retval = retval
139         self.parameters = parameters
140         self.symbol = symbol
141
142     def __repr__(self):
143         return '%s(%r, %r, %r)' % (self.__class__.__name__,
144                                    self.name, self.retval,
145                                    self.parameters)
146
147
148 class VFunction(Function):
149     pass
150
151
152 class Type(Node):
153
154     def __init__(self, name, ctype=None):
155         Node.__init__(self, name)
156         self.ctype = ctype
157         self.resolved = False
158
159
160 class Alias(Node):
161
162     def __init__(self, name, target, ctype=None):
163         Node.__init__(self, name)
164         self.target = target
165         self.ctype = ctype
166
167     def __repr__(self):
168         return 'Alias(%r, %r)' % (self.name, self.target)
169
170
171 class Parameter(Node):
172
173     def __init__(self, name, typenode):
174         Node.__init__(self, name)
175         self.type = typenode
176         self.direction = PARAM_DIRECTION_IN
177         self.transfer = False
178         self.allow_none = False
179
180     def __repr__(self):
181         return 'Parameter(%r, %r)' % (self.name, self.type)
182
183
184 class Enum(Node):
185
186     def __init__(self, name, symbol, members):
187         Node.__init__(self, name)
188         self.symbol = symbol
189         self.members = members
190
191     def __repr__(self):
192         return 'Enum(%r, %r)' % (self.name, self.members)
193
194
195 class Member(Node):
196
197     def __init__(self, name, value, symbol):
198         Node.__init__(self, name)
199         self.value = value
200         self.symbol = symbol
201
202     def __repr__(self):
203         return 'Member(%r, %r)' % (self.name, self.value)
204
205
206 class Struct(Node):
207
208     def __init__(self, name, symbol):
209         Node.__init__(self, name)
210         self.fields = []
211         self.symbol = symbol
212
213
214 class Field(Node):
215
216     def __init__(self, name, typenode, symbol):
217         Node.__init__(self, name)
218         self.type = typenode
219         self.symbol = symbol
220
221     def __repr__(self):
222         return 'Field(%r, %r)' % (self.name, self.type)
223
224
225 class Return(Node):
226
227     def __init__(self, rtype):
228         Node.__init__(self)
229         self.type = rtype
230         self.transfer = False
231
232     def __repr__(self):
233         return 'Return(%r)' % (self.type, )
234
235
236 class Class(Node):
237
238     def __init__(self, name, parent):
239         Node.__init__(self, name)
240         self.ctype = name
241         self.parent = parent
242         self.methods = []
243         self.interfaces = []
244         self.constructors = []
245         self.properties = []
246         self.fields = []
247
248     def __repr__(self):
249         return '%s(%r, %r, %r)' % (
250             self.__class__.__name__,
251             self.name, self.parent, self.methods)
252
253
254 class Interface(Node):
255
256     def __init__(self, name, parent):
257         Node.__init__(self, name)
258         self.parent = parent
259         self.methods = []
260         self.properties = []
261         self.fields = []
262
263     def __repr__(self):
264         return '%s(%r, %r)' % (
265             self.__class__.__name__,
266             self.name, self.methods)
267
268
269 class Constant(Node):
270
271     def __init__(self, name, type_name, value):
272         Node.__init__(self, name)
273         self.type = Type(type_name)
274         self.value = value
275
276     def __repr__(self):
277         return 'Constant(%r, %r, %r)' % (
278             self.name, self.type, self.value)
279
280
281 class Property(Node):
282
283     def __init__(self, name, type_name, ctype=None):
284         Node.__init__(self, name)
285         self.type = Type(type_name, ctype)
286
287     def __repr__(self):
288         return '%s(%r, %r, %r)' % (
289             self.__class__.__name__,
290             self.name, self.type, self.value)
291
292
293 # FIXME: Inherit from Function
294
295
296 class Callback(Node):
297
298     def __init__(self, name, retval, parameters, ctype=None):
299         Node.__init__(self, name)
300         self.retval = retval
301         self.parameters = parameters
302         self.ctype = ctype
303
304     def __repr__(self):
305         return 'Callback(%r, %r, %r)' % (
306             self.name, self.retval, self.parameters)
307
308
309 class Sequence(Type):
310     # Subclass, because a Sequence is a kind of Type
311
312     def __init__(self, name, ctype, element_type):
313         Type.__init__(self, name, ctype)
314         self.element_type = element_type
315         self.transfer = False
316
317     def __repr__(self):
318         return 'Sequence(%r of %r)' % (self.name, self.element_type, )
319
320
321 class Union(Node):
322
323     def __init__(self, name, symbol):
324         Node.__init__(self, name)
325         self.fields = []
326         self.symbol = symbol
327
328     def __repr__(self):
329         return 'Union(%r, %r)' % (self.name, self.fields, )