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'
51 TYPE_DOUBLE = 'double'
52 TYPE_STRING = 'string' # requires zero-terminated
53 TYPE_FILENAME = 'filename'
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,
60 GIR_TYPES = [TYPE_NONE, TYPE_ANY]
61 GIR_TYPES.extend(BASIC_GIR_TYPES)
62 GIR_TYPES.extend([TYPE_STRING, TYPE_FILENAME])
64 # Higher-level data types
65 TYPE_SEQUENCE = 'sequence' # Sequence of something
69 TYPE_USTRING = 'ustring'
75 PARAM_DIRECTION_IN = 'in'
76 PARAM_DIRECTION_OUT = 'out'
77 PARAM_DIRECTION_INOUT = 'inout'
80 for name in GIR_TYPES:
81 type_names[name] = name
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
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
110 def type_name_from_ctype(ctype):
111 return type_names.get(ctype, ctype)
116 def __init__(self, name=None):
120 return '%s(%r)' % (self.__class__.__name__, self.name)
123 class Namespace(Node):
125 def __init__(self, name):
126 Node.__init__(self, name)
130 return '%s(%r, %r)' % (self.__class__.__name__, self.name,
134 class Function(Node):
136 def __init__(self, name, retval, parameters, symbol):
137 Node.__init__(self, name)
139 self.parameters = parameters
143 return '%s(%r, %r, %r)' % (self.__class__.__name__,
144 self.name, self.retval,
148 class VFunction(Function):
154 def __init__(self, name, ctype=None):
155 Node.__init__(self, name)
157 self.resolved = False
162 def __init__(self, name, target, ctype=None):
163 Node.__init__(self, name)
168 return 'Alias(%r, %r)' % (self.name, self.target)
171 class Parameter(Node):
173 def __init__(self, name, typenode):
174 Node.__init__(self, name)
176 self.direction = PARAM_DIRECTION_IN
177 self.transfer = False
178 self.allow_none = False
181 return 'Parameter(%r, %r)' % (self.name, self.type)
186 def __init__(self, name, symbol, members):
187 Node.__init__(self, name)
189 self.members = members
192 return 'Enum(%r, %r)' % (self.name, self.members)
197 def __init__(self, name, value, symbol):
198 Node.__init__(self, name)
203 return 'Member(%r, %r)' % (self.name, self.value)
208 def __init__(self, name, symbol):
209 Node.__init__(self, name)
216 def __init__(self, name, typenode, symbol):
217 Node.__init__(self, name)
222 return 'Field(%r, %r)' % (self.name, self.type)
227 def __init__(self, rtype):
230 self.transfer = False
233 return 'Return(%r)' % (self.type, )
238 def __init__(self, name, parent):
239 Node.__init__(self, name)
244 self.constructors = []
249 return '%s(%r, %r, %r)' % (
250 self.__class__.__name__,
251 self.name, self.parent, self.methods)
254 class Interface(Node):
256 def __init__(self, name, parent):
257 Node.__init__(self, name)
264 return '%s(%r, %r)' % (
265 self.__class__.__name__,
266 self.name, self.methods)
269 class Constant(Node):
271 def __init__(self, name, type_name, value):
272 Node.__init__(self, name)
273 self.type = Type(type_name)
277 return 'Constant(%r, %r, %r)' % (
278 self.name, self.type, self.value)
281 class Property(Node):
283 def __init__(self, name, type_name, ctype=None):
284 Node.__init__(self, name)
285 self.type = Type(type_name, ctype)
288 return '%s(%r, %r, %r)' % (
289 self.__class__.__name__,
290 self.name, self.type, self.value)
293 # FIXME: Inherit from Function
296 class Callback(Node):
298 def __init__(self, name, retval, parameters, ctype=None):
299 Node.__init__(self, name)
301 self.parameters = parameters
305 return 'Callback(%r, %r, %r)' % (
306 self.name, self.retval, self.parameters)
309 class Sequence(Type):
310 # Subclass, because a Sequence is a kind of Type
312 def __init__(self, name, ctype, element_type):
313 Type.__init__(self, name, ctype)
314 self.element_type = element_type
315 self.transfer = False
318 return 'Sequence(%r of %r)' % (self.name, self.element_type, )
323 def __init__(self, name, symbol):
324 Node.__init__(self, name)
329 return 'Union(%r, %r)' % (self.name, self.fields, )