2 # GObject-Introspection - a framework for introspecting GObject libraries
3 # Copyright (C) 2008 Johan Dahlin
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.
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.
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
22 This file descbribes abstract data type nodes independent on the
23 implementation language.
25 These can later on be extended (eg subclassed) with additional information
26 which is language/library/domain specific.
30 ## Basic types, modeled on GITypeTag but not equivalent
33 TYPE_NONE = 'none' # We differ from repository on these first two
35 TYPE_BOOLEAN = 'boolean'
39 TYPE_UINT16 = 'uint16'
43 TYPE_UINT32 = 'uint32'
45 TYPE_UINT64 = 'uint64'
48 TYPE_SSIZET = 'ssize_t'
53 TYPE_DOUBLE = 'double'
54 TYPE_STRING = 'utf8' # requires zero-terminated
55 TYPE_FILENAME = 'filename'
57 BASIC_GIR_TYPES = [TYPE_BOOLEAN, TYPE_INT8, TYPE_UINT8, TYPE_INT16,
58 TYPE_UINT16, TYPE_INT32, TYPE_UINT32, TYPE_INT64,
59 TYPE_UINT64, TYPE_INT, TYPE_UINT, TYPE_LONG,
60 TYPE_ULONG, TYPE_SSIZET, TYPE_SIZET, TYPE_FLOAT,
61 TYPE_DOUBLE, TYPE_TIMET, TYPE_GTYPE]
62 GIR_TYPES = [TYPE_NONE, TYPE_ANY]
63 GIR_TYPES.extend(BASIC_GIR_TYPES)
64 GIR_TYPES.extend([TYPE_STRING, TYPE_FILENAME])
66 # Higher-level data types
67 TYPE_SEQUENCE = 'sequence' # Sequence of something
71 TYPE_USTRING = 'ustring'
77 PARAM_DIRECTION_IN = 'in'
78 PARAM_DIRECTION_OUT = 'out'
79 PARAM_DIRECTION_INOUT = 'inout'
81 PARAM_TRANSFER_NONE = 'none'
82 PARAM_TRANSFER_CONTAINER = 'container'
83 PARAM_TRANSFER_FULL = 'full'
86 for name in GIR_TYPES:
87 type_names[name] = name
90 type_names['char'] = TYPE_INT8
91 type_names['signed char'] = TYPE_INT8
92 type_names['unsigned char'] = TYPE_UINT8
93 type_names['short'] = TYPE_INT16
94 type_names['signed short'] = TYPE_INT16
95 type_names['unsigned short'] = TYPE_UINT16
96 type_names['int'] = TYPE_INT
97 type_names['signed int'] = TYPE_INT
98 type_names['signed'] = TYPE_INT
99 type_names['unsigned int'] = TYPE_UINT
100 type_names['unsigned'] = TYPE_UINT
101 type_names['long'] = TYPE_LONG
102 type_names['signed long'] = TYPE_LONG
103 type_names['unsigned long'] = TYPE_ULONG
104 type_names['float'] = TYPE_FLOAT
105 type_names['double'] = TYPE_DOUBLE
106 type_names['char*'] = TYPE_STRING
107 type_names['void*'] = TYPE_ANY
108 type_names['void'] = TYPE_NONE
109 type_names['size_t'] = TYPE_SIZET
110 type_names['ssize_t'] = TYPE_SSIZET
111 type_names['off_t'] = TYPE_SIZET
112 # FIXME - can we make libraries use GPid?
113 type_names['pid_t'] = TYPE_INT
116 type_names['id'] = TYPE_ANY
118 # Suppress some GLib names
119 type_names['uchar'] = TYPE_UINT8
120 type_names['ushort'] = TYPE_UINT16
121 type_names['size'] = TYPE_SIZET
122 type_names['ssize'] = TYPE_SSIZET
123 type_names['pointer'] = TYPE_ANY
124 type_names['constpointer'] = TYPE_ANY
127 # These types, when seen by reference, are converted into an Array()
129 # If you add/change these, be sure to update glibast.py too
130 default_array_types = {}
131 default_array_types['uint8*'] = TYPE_UINT8
132 default_array_types['char**'] = TYPE_STRING
134 # These types, when seen by reference, are interpreted as out parameters
135 default_out_types = (TYPE_INT, TYPE_UINT, TYPE_LONG, TYPE_ULONG,
136 TYPE_FLOAT, TYPE_DOUBLE, TYPE_SIZET, TYPE_SSIZET)
139 def type_name_from_ctype(ctype):
140 return type_names.get(ctype, ctype)
145 def __init__(self, name=None):
147 self.deprecated = None
148 self.deprecated_version = None
151 return '%s(%r)' % (self.__class__.__name__, self.name)
154 class Namespace(Node):
156 def __init__(self, name, version):
157 Node.__init__(self, name)
158 self.version = version
162 return '%s(%r, %r, %r)' % (self.__class__.__name__, self.name,
163 self.version, self.nodes)
168 def __init__(self, name, version):
169 Node.__init__(self, 'include')
171 self.version = version
174 def from_string(self, string):
175 return Include(*string.split('-', 1))
177 def __cmp__(self, other):
178 if not isinstance(other, Include):
179 return cmp(self, other)
180 namecmp = cmp(self.name, other.name)
183 return cmp(self.version, other.version)
186 return hash((self.name, self.version))
189 return '%s-%s' % (self.name, self.version)
192 class Function(Node):
194 def __init__(self, name, retval, parameters, symbol, throws=None):
195 Node.__init__(self, name)
197 self.parameters = parameters
199 self.throws = not not throws
202 return '%s(%r, %r, %r)' % (self.__class__.__name__,
203 self.name, self.retval,
207 class VFunction(Function):
213 def __init__(self, name, ctype=None):
214 Node.__init__(self, name)
216 self.resolved = False
222 Type.__init__(self, '<varargs>')
227 def __init__(self, ctype, element_type):
228 Type.__init__(self, '<carray>', ctype)
229 self.element_type = element_type
230 self.zeroterminated = True
231 self.length_param_index = -1
232 self.length_param_name = None
236 return 'Array(%r of %r)' % (self.name, self.element_type, )
241 def __init__(self, name, ctype, element_type):
242 Type.__init__(self, name, ctype)
243 self.element_type = element_type
246 return 'List(%r of %r)' % (self.name, self.element_type, )
251 def __init__(self, name, ctype, key_type, value_type):
252 Type.__init__(self, name, ctype)
253 self.key_type = key_type
254 self.value_type = value_type
257 return 'Map(%r <%r,%r.)' % (self.name, self.key_type, self.value_type)
262 def __init__(self, name, target, ctype=None):
263 Node.__init__(self, name)
268 return 'Alias(%r, %r)' % (self.name, self.target)
271 class TypeContainer(Node):
273 def __init__(self, name, typenode, transfer):
274 Node.__init__(self, name)
276 if transfer in [PARAM_TRANSFER_NONE, PARAM_TRANSFER_CONTAINER,
277 PARAM_TRANSFER_FULL]:
278 self.transfer = transfer
282 # transformer.py overrides this as needed
283 self.transfer_inferred = False
286 class Parameter(TypeContainer):
288 def __init__(self, name, typenode, direction=PARAM_DIRECTION_IN,
289 transfer=None, allow_none=False):
290 TypeContainer.__init__(self, name, typenode, transfer)
291 if direction in [PARAM_DIRECTION_IN, PARAM_DIRECTION_OUT,
292 PARAM_DIRECTION_INOUT]:
293 self.direction = direction
295 self.direction = PARAM_DIRECTION_IN
297 self.allow_none = not not allow_none
300 return 'Parameter(%r, %r)' % (self.name, self.type)
305 def __init__(self, name, symbol, members):
306 Node.__init__(self, name)
308 self.members = members
311 return 'Enum(%r, %r)' % (self.name, self.members)
316 def __init__(self, name, value, symbol):
317 Node.__init__(self, name)
322 return 'Member(%r, %r)' % (self.name, self.value)
327 def __init__(self, name, symbol):
328 Node.__init__(self, name)
330 self.constructors = []
336 def __init__(self, name, typenode, symbol, readable, writable, bits=None):
337 Node.__init__(self, name)
340 self.readable = readable
341 self.writable = writable
346 return 'Field(%r, %r, %r)' % (self.name, self.type, self.bits)
348 return 'Field(%r, %r)' % (self.name, self.type)
351 class Return(TypeContainer):
353 def __init__(self, rtype, transfer=None):
354 TypeContainer.__init__(self, None, rtype, transfer)
357 return 'Return(%r)' % (self.type, )
362 def __init__(self, name, parent, is_abstract):
363 Node.__init__(self, name)
366 self.is_abstract = is_abstract
369 self.constructors = []
374 return '%s(%r, %r, %r)' % (
375 self.__class__.__name__,
376 self.name, self.parent, self.methods)
379 class Interface(Node):
381 def __init__(self, name, parent):
382 Node.__init__(self, name)
389 return '%s(%r, %r)' % (
390 self.__class__.__name__,
391 self.name, self.methods)
394 class Constant(Node):
396 def __init__(self, name, type_name, value):
397 Node.__init__(self, name)
398 self.type = Type(type_name)
402 return 'Constant(%r, %r, %r)' % (
403 self.name, self.type, self.value)
406 class Property(Node):
408 def __init__(self, name, type_name, readable, writable,
409 construct, construct_only, ctype=None):
410 Node.__init__(self, name)
411 self.type = Type(type_name, ctype)
412 self.readable = readable
413 self.writable = writable
414 self.construct = construct
415 self.construct_only = construct_only
418 return '%s(%r, %r)' % (
419 self.__class__.__name__,
420 self.name, self.type)
423 # FIXME: Inherit from Function
426 class Callback(Node):
428 def __init__(self, name, retval, parameters, ctype=None):
429 Node.__init__(self, name)
431 self.parameters = parameters
435 return 'Callback(%r, %r, %r)' % (
436 self.name, self.retval, self.parameters)
441 def __init__(self, name, symbol):
442 Node.__init__(self, name)
444 self.constructors = []
448 return 'Union(%r, %r)' % (self.name, self.fields, )