2 # GObject-Introspection - a framework for introspecting GObject libraries
3 # Copyright (C) 2008 Johan Dahlin
4 # Copyright (C) 2008, 2009 Red Hat, Inc.
6 # This library is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU Lesser General Public
8 # License as published by the Free Software Foundation; either
9 # version 2 of the License, or (at your option) any later version.
11 # This library is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 # Lesser General Public License for more details.
16 # You should have received a copy of the GNU Lesser General Public
17 # License along with this library; if not, write to the
18 # Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 # Boston, MA 02111-1307, USA.
23 This file descbribes abstract data type nodes independent on the
24 implementation language.
26 These can later on be extended (eg subclassed) with additional information
27 which is language/library/domain specific.
31 ## Basic types, modeled on GITypeTag but not equivalent
34 TYPE_NONE = 'none' # We differ from repository on these first two
36 TYPE_BOOLEAN = 'boolean'
40 TYPE_UINT16 = 'uint16'
44 TYPE_UINT32 = 'uint32'
46 TYPE_UINT64 = 'uint64'
49 TYPE_SSIZET = 'ssize_t'
54 TYPE_DOUBLE = 'double'
55 TYPE_STRING = 'utf8' # requires zero-terminated
56 TYPE_FILENAME = 'filename'
58 BASIC_GIR_TYPES = [TYPE_BOOLEAN, TYPE_INT8, TYPE_UINT8, TYPE_INT16,
59 TYPE_UINT16, TYPE_INT32, TYPE_UINT32, TYPE_INT64,
60 TYPE_UINT64, TYPE_INT, TYPE_UINT, TYPE_LONG,
61 TYPE_ULONG, TYPE_SSIZET, TYPE_SIZET, TYPE_FLOAT,
62 TYPE_DOUBLE, TYPE_TIMET, TYPE_GTYPE]
63 GIR_TYPES = [TYPE_NONE, TYPE_ANY]
64 GIR_TYPES.extend(BASIC_GIR_TYPES)
65 GIR_TYPES.extend([TYPE_STRING, TYPE_FILENAME])
67 # Higher-level data types
68 TYPE_SEQUENCE = 'sequence' # Sequence of something
72 TYPE_USTRING = 'ustring'
78 PARAM_DIRECTION_IN = 'in'
79 PARAM_DIRECTION_OUT = 'out'
80 PARAM_DIRECTION_INOUT = 'inout'
82 PARAM_TRANSFER_NONE = 'none'
83 PARAM_TRANSFER_CONTAINER = 'container'
84 PARAM_TRANSFER_FULL = 'full'
87 for name in GIR_TYPES:
88 type_names[name] = name
91 type_names['char'] = TYPE_INT8
92 type_names['signed char'] = TYPE_INT8
93 type_names['unsigned char'] = TYPE_UINT8
94 type_names['short'] = TYPE_INT16
95 type_names['signed short'] = TYPE_INT16
96 type_names['unsigned short'] = TYPE_UINT16
97 type_names['int'] = TYPE_INT
98 type_names['signed int'] = TYPE_INT
99 type_names['signed'] = TYPE_INT
100 type_names['unsigned int'] = TYPE_UINT
101 type_names['unsigned'] = TYPE_UINT
102 type_names['long'] = TYPE_LONG
103 type_names['signed long'] = TYPE_LONG
104 type_names['unsigned long'] = TYPE_ULONG
105 type_names['float'] = TYPE_FLOAT
106 type_names['double'] = TYPE_DOUBLE
107 type_names['char*'] = TYPE_STRING
108 type_names['void*'] = TYPE_ANY
109 type_names['void'] = TYPE_NONE
112 type_names['off_t'] = TYPE_SIZET
113 type_names['pid_t'] = TYPE_INT
114 type_names['size_t'] = TYPE_SIZET
115 type_names['ssize_t'] = TYPE_SSIZET
116 type_names['socklen_t'] = TYPE_INT32
119 type_names['id'] = TYPE_ANY
121 # Suppress some GLib names
122 type_names['uchar'] = TYPE_UINT8
123 type_names['ushort'] = TYPE_UINT16
124 type_names['size'] = TYPE_SIZET
125 type_names['ssize'] = TYPE_SSIZET
126 type_names['pointer'] = TYPE_ANY
127 type_names['constpointer'] = TYPE_ANY
130 # These types, when seen by reference, are converted into an Array()
132 # If you add/change these, be sure to update glibast.py too
133 default_array_types = {}
134 default_array_types['uint8*'] = TYPE_UINT8
135 default_array_types['utf8*'] = TYPE_STRING
137 # These types, when seen by reference, are interpreted as out parameters
138 default_out_types = (TYPE_INT, TYPE_UINT, TYPE_LONG, TYPE_ULONG,
139 TYPE_FLOAT, TYPE_DOUBLE, TYPE_SIZET, TYPE_SSIZET)
142 def type_name_from_ctype(ctype):
143 return type_names.get(ctype, ctype)
148 def __init__(self, name=None):
150 self.deprecated = None
151 self.deprecated_version = None
154 def __cmp__(self, other):
155 return cmp(self.name, other.name)
158 return '%s(%r)' % (self.__class__.__name__, self.name)
161 class Namespace(Node):
163 def __init__(self, name, version):
164 Node.__init__(self, name)
165 self.version = version
169 return '%s(%r, %r, %r)' % (self.__class__.__name__, self.name,
170 self.version, self.nodes)
175 def __init__(self, name, version):
176 Node.__init__(self, 'include')
178 self.version = version
181 def from_string(self, string):
182 return Include(*string.split('-', 1))
184 def __cmp__(self, other):
185 if not isinstance(other, Include):
186 return cmp(self, other)
187 namecmp = cmp(self.name, other.name)
190 return cmp(self.version, other.version)
193 return hash((self.name, self.version))
196 return '%s-%s' % (self.name, self.version)
199 class Function(Node):
201 def __init__(self, name, retval, parameters, symbol, throws=None):
202 Node.__init__(self, name)
204 self.parameters = parameters
206 self.throws = not not throws
207 self.is_method = False
208 self.is_virtual = False
211 def get_parameter_index(self, name):
212 for i, parameter in enumerate(self.parameters):
213 if parameter.name == name:
214 return i + int(self.is_method)
216 def get_parameter(self, name):
217 for parameter in self.parameters:
218 if parameter.name == name:
222 return '%s(%r, %r, %r)' % (self.__class__.__name__,
223 self.name, self.retval,
228 def __init__(self, name, ctype=None):
229 Node.__init__(self, name)
231 self.resolved = False
232 self.is_const = False
233 self.canonical = None
234 self.derefed_canonical = None
240 Type.__init__(self, '<varargs>')
245 def __init__(self, ctype, element_type):
246 Type.__init__(self, '<carray>', ctype)
247 self.element_type = element_type
248 self.zeroterminated = True
249 self.length_param_index = -1
250 self.length_param_name = None
254 return 'Array(%r, %r)' % (self.name, self.element_type, )
259 def __init__(self, name, ctype, element_type):
260 Type.__init__(self, name, ctype)
261 self.element_type = element_type
264 return 'List(%r of %r)' % (self.name, self.element_type, )
269 def __init__(self, name, ctype, key_type, value_type):
270 Type.__init__(self, name, ctype)
271 self.key_type = key_type
272 self.value_type = value_type
275 return 'Map(%r <%r,%r.)' % (self.name, self.key_type, self.value_type)
280 def __init__(self, name, target, ctype=None):
281 Node.__init__(self, name)
286 return 'Alias(%r, %r)' % (self.name, self.target)
289 class TypeContainer(Node):
291 def __init__(self, name, typenode, transfer):
292 Node.__init__(self, name)
294 if transfer in [PARAM_TRANSFER_NONE, PARAM_TRANSFER_CONTAINER,
295 PARAM_TRANSFER_FULL]:
296 self.transfer = transfer
301 class Parameter(TypeContainer):
303 def __init__(self, name, typenode, direction=None,
304 transfer=None, allow_none=False, scope=None):
305 TypeContainer.__init__(self, name, typenode, transfer)
306 if direction in [PARAM_DIRECTION_IN, PARAM_DIRECTION_OUT,
307 PARAM_DIRECTION_INOUT, None]:
308 self.direction = direction
310 self.direction = PARAM_DIRECTION_IN
312 self.allow_none = allow_none
314 self.closure_index = -1
315 self.destroy_index = -1
319 return 'Parameter(%r, %r)' % (self.name, self.type)
324 def __init__(self, name, symbol, members):
325 Node.__init__(self, name)
327 self.members = members
331 return 'Enum(%r, %r)' % (self.name, self.members)
334 class Bitfield(Node):
336 def __init__(self, name, symbol, members):
337 Node.__init__(self, name)
339 self.members = members
343 return 'Bitfield(%r, %r)' % (self.name, self.members)
348 def __init__(self, name, value, symbol):
349 Node.__init__(self, name)
354 return 'Member(%r, %r)' % (self.name, self.value)
359 def __init__(self, name, symbol, disguised=False):
360 Node.__init__(self, name)
362 self.constructors = []
364 self.disguised = disguised
374 def __init__(self, name, typenode, symbol, readable, writable, bits=None):
375 Node.__init__(self, name)
378 self.readable = readable
379 self.writable = writable
384 return 'Field(%r, %r, %r)' % (self.name, self.type, self.bits)
386 return 'Field(%r, %r)' % (self.name, self.type)
389 class Return(TypeContainer):
391 def __init__(self, rtype, transfer=None):
392 TypeContainer.__init__(self, None, rtype, transfer)
393 self.direction = PARAM_DIRECTION_OUT
397 return 'Return(%r)' % (self.type, )
402 def __init__(self, name, parent, is_abstract):
403 Node.__init__(self, name)
406 self.glib_type_struct = None
407 self.is_abstract = is_abstract
409 self.static_methods = []
411 self.constructors = []
417 return '%s(%r, %r, %r)' % (
418 self.__class__.__name__,
419 self.name, self.parent, self.methods)
422 class Interface(Node):
424 def __init__(self, name, parent):
425 Node.__init__(self, name)
428 self.glib_type_struct = None
431 self.prerequisites = []
435 return '%s(%r, %r)' % (
436 self.__class__.__name__,
437 self.name, self.methods)
440 class Constant(Node):
442 def __init__(self, name, type_name, value):
443 Node.__init__(self, name)
444 self.type = Type(type_name)
448 return 'Constant(%r, %r, %r)' % (
449 self.name, self.type, self.value)
452 class Property(Node):
454 def __init__(self, name, type_name, readable, writable,
455 construct, construct_only, ctype=None):
456 Node.__init__(self, name)
457 self.type = Type(type_name, ctype)
458 self.readable = readable
459 self.writable = writable
460 self.construct = construct
461 self.construct_only = construct_only
465 return '%s(%r, %r)' % (
466 self.__class__.__name__,
467 self.name, self.type)
470 # FIXME: Inherit from Function
473 class Callback(Node):
475 def __init__(self, name, retval, parameters, ctype=None):
476 Node.__init__(self, name)
478 self.parameters = parameters
484 return 'Callback(%r, %r, %r)' % (
485 self.name, self.retval, self.parameters)
490 def __init__(self, name, symbol):
491 Node.__init__(self, name)
493 self.constructors = []
499 return 'Union(%r, %r)' % (self.name, self.fields, )