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.
37 TYPE_UINT16 = 'uint16'
39 TYPE_UINT32 = 'uint32'
41 TYPE_UINT64 = 'uint64'
47 TYPE_DOUBLE = 'double'
49 # Higher-level data types
51 TYPE_ANY = 'any' # CORBA Any/Variant/GValue, holds anything.
52 TYPE_BOOLEAN = 'boolean' # True/False
53 TYPE_STRING = 'string' # Sequence of characters
54 TYPE_SEQUENCE = 'sequence' # Sequence of something
55 TYPE_CHAR = 'char' # Character
56 TYPE_UCHAR = 'uchar' # Unsigned Character
57 TYPE_SIZE = 'size' # Size type (memory, buffer etc)
62 TYPE_USTRING = 'ustring'
64 # Domain specific, but practically useful
65 TYPE_FILENAME = 'filename'
71 PARAM_DIRECTION_IN = 'in'
72 PARAM_DIRECTION_OUT = 'out'
73 PARAM_DIRECTION_INOUT = 'inout'
78 type_names['char'] = TYPE_CHAR
79 type_names['unsigned char'] = TYPE_UCHAR
80 type_names['short'] = TYPE_INT16
81 type_names['unsigned short'] = TYPE_UINT16
82 type_names['int'] = TYPE_INT32
83 type_names['unsigned int'] = TYPE_UINT32
84 type_names['long'] = TYPE_LONG
85 type_names['unsigned long'] = TYPE_ULONG
86 type_names['float'] = TYPE_FLOAT
87 type_names['double'] = TYPE_DOUBLE
88 type_names['char*'] = TYPE_STRING
89 type_names['void*'] = TYPE_ANY
90 type_names['void'] = TYPE_NONE
91 type_names['size_t'] = TYPE_SIZE
92 type_names['ssize_t'] = TYPE_SSIZE
95 def type_name_from_ctype(ctype):
96 return type_names.get(ctype, ctype)
101 def __init__(self, name=None):
105 return '%s(%r)' % (self.__class__.__name__, self.name)
108 class Namespace(Node):
110 def __init__(self, name):
111 Node.__init__(self, name)
115 return '%s(%r, %r)' % (self.__class__.__name__, self.name,
119 class Function(Node):
121 def __init__(self, name, retval, parameters, symbol):
122 Node.__init__(self, name)
124 self.parameters = parameters
128 return '%s(%r, %r, %r)' % (self.__class__.__name__,
129 self.name, self.retval,
133 class VFunction(Function):
139 def __init__(self, name, ctype=None):
140 Node.__init__(self, name)
146 def __init__(self, name, target, ctype=None):
147 Node.__init__(self, name)
152 return 'Alias(%r, %r)' % (self.name, self.target)
155 class Parameter(Node):
157 def __init__(self, name, typenode):
158 Node.__init__(self, name)
160 self.direction = PARAM_DIRECTION_IN
161 self.transfer = False
162 self.allow_none = False
165 return 'Parameter(%r, %r)' % (self.name, self.type)
170 def __init__(self, name, symbol, members):
171 Node.__init__(self, name)
173 self.members = members
176 return 'Enum(%r, %r)' % (self.name, self.members)
181 def __init__(self, name, value, symbol):
182 Node.__init__(self, name)
187 return 'Member(%r, %r)' % (self.name, self.value)
192 def __init__(self, name, symbol):
193 Node.__init__(self, name)
200 def __init__(self, name, typenode, symbol):
201 Node.__init__(self, name)
206 return 'Field(%r, %r)' % (self.name, self.type)
211 def __init__(self, rtype):
214 self.transfer = False
217 return 'Return(%r)' % (self.type, )
222 def __init__(self, name, parent):
223 Node.__init__(self, name)
227 self.constructors = []
232 return '%s(%r, %r, %r)' % (
233 self.__class__.__name__,
234 self.name, self.parent, self.methods)
237 class Interface(Node):
239 def __init__(self, name, parent):
240 Node.__init__(self, name)
247 return '%s(%r, %r)' % (
248 self.__class__.__name__,
249 self.name, self.methods)
252 class Constant(Node):
254 def __init__(self, name, type_name, value):
255 Node.__init__(self, name)
256 self.type = Type(type_name)
260 return 'Constant(%r, %r, %r)' % (
261 self.name, self.type, self.value)
264 class Property(Node):
266 def __init__(self, name, type_name, ctype=None):
267 Node.__init__(self, name)
268 self.type = Type(type_name, ctype)
271 return '%s(%r, %r, %r)' % (
272 self.__class__.__name__,
273 self.name, self.type, self.value)
276 # FIXME: Inherit from Function
279 class Callback(Node):
281 def __init__(self, name, retval, parameters):
282 Node.__init__(self, name)
284 self.parameters = parameters
287 return 'Callback(%r, %r, %r)' % (
288 self.name, self.retval, self.parameters)
291 class Sequence(Type):
292 # Subclass, because a Sequence is a kind of Type
294 def __init__(self, name, ctype, element_type):
295 Type.__init__(self, name, ctype)
296 self.element_type = element_type
297 self.transfer = False