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'
82 for name in GIR_TYPES:
83 type_names[name] = name
86 type_names['char'] = TYPE_INT8
87 type_names['unsigned char'] = TYPE_UINT8
88 type_names['short'] = TYPE_INT16
89 type_names['unsigned short'] = TYPE_UINT16
90 type_names['int'] = TYPE_INT
91 type_names['unsigned int'] = TYPE_UINT
92 type_names['unsigned'] = TYPE_UINT
93 type_names['long'] = TYPE_LONG
94 type_names['unsigned long'] = TYPE_ULONG
95 type_names['float'] = TYPE_FLOAT
96 type_names['double'] = TYPE_DOUBLE
97 type_names['char*'] = TYPE_STRING
98 type_names['void*'] = TYPE_ANY
99 type_names['void'] = TYPE_NONE
100 type_names['size_t'] = TYPE_SIZET
101 type_names['ssize_t'] = TYPE_SSIZET
102 # FIXME - can we make libraries use GPid?
103 type_names['pid_t'] = TYPE_INT
105 # Suppress some GLib names
106 type_names['uchar'] = TYPE_UINT8
107 type_names['ushort'] = TYPE_UINT16
108 type_names['size'] = TYPE_SIZET
109 type_names['ssize'] = TYPE_SSIZET
110 type_names['pointer'] = TYPE_ANY
111 type_names['constpointer'] = TYPE_ANY
114 # These types, when seen by reference, are converted into an Array()
116 default_array_types = {}
117 default_array_types['uint8*'] = TYPE_UINT8
118 default_array_types['char**'] = TYPE_STRING
121 def type_name_from_ctype(ctype):
122 return type_names.get(ctype, ctype)
127 def __init__(self, name=None):
129 self.deprecated = None
130 self.deprecated_version = None
133 return '%s(%r)' % (self.__class__.__name__, self.name)
136 class Namespace(Node):
138 def __init__(self, name):
139 Node.__init__(self, name)
143 return '%s(%r, %r)' % (self.__class__.__name__, self.name,
147 class Function(Node):
149 def __init__(self, name, retval, parameters, symbol):
150 Node.__init__(self, name)
152 self.parameters = parameters
156 return '%s(%r, %r, %r)' % (self.__class__.__name__,
157 self.name, self.retval,
161 class VFunction(Function):
167 def __init__(self, name, ctype=None):
168 Node.__init__(self, name)
170 self.resolved = False
176 Type.__init__(self, '<varargs>')
181 def __init__(self, ctype, element_type):
182 Type.__init__(self, '<carray>', ctype)
183 self.element_type = element_type
184 self.zeroterminated = True
185 self.length_param_index = -1
186 self.length_param_name = None
189 return 'Array(%r of %r)' % (self.name, self.element_type, )
194 def __init__(self, name, ctype, element_type):
195 Type.__init__(self, name, ctype)
196 self.element_type = element_type
199 return 'List(%r of %r)' % (self.name, self.element_type, )
204 def __init__(self, name, ctype, key_type, value_type):
205 Type.__init__(self, name, ctype)
206 self.key_type = key_type
207 self.value_type = value_type
210 return 'Map(%r <%r,%r.)' % (self.name, self.key_type, self.value_type)
215 def __init__(self, name, target, ctype=None):
216 Node.__init__(self, name)
221 return 'Alias(%r, %r)' % (self.name, self.target)
224 class Parameter(Node):
226 def __init__(self, name, typenode):
227 Node.__init__(self, name)
229 self.direction = PARAM_DIRECTION_IN
231 self.allow_none = False
234 return 'Parameter(%r, %r)' % (self.name, self.type)
239 def __init__(self, name, symbol, members):
240 Node.__init__(self, name)
242 self.members = members
245 return 'Enum(%r, %r)' % (self.name, self.members)
250 def __init__(self, name, value, symbol):
251 Node.__init__(self, name)
256 return 'Member(%r, %r)' % (self.name, self.value)
261 def __init__(self, name, symbol):
262 Node.__init__(self, name)
264 self.constructors = []
270 def __init__(self, name, typenode, symbol, bits=None):
271 Node.__init__(self, name)
278 return 'Field(%r, %r, %r)' % (self.name, self.type, self.bits)
280 return 'Field(%r, %r)' % (self.name, self.type)
285 def __init__(self, rtype, transfer=None):
288 if transfer is None and rtype.name in ['utf8', 'filename']:
289 self.transfer = 'full'
291 self.transfer = transfer
294 return 'Return(%r)' % (self.type, )
299 def __init__(self, name, parent):
300 Node.__init__(self, name)
305 self.constructors = []
310 return '%s(%r, %r, %r)' % (
311 self.__class__.__name__,
312 self.name, self.parent, self.methods)
315 class Interface(Node):
317 def __init__(self, name, parent):
318 Node.__init__(self, name)
325 return '%s(%r, %r)' % (
326 self.__class__.__name__,
327 self.name, self.methods)
330 class Constant(Node):
332 def __init__(self, name, type_name, value):
333 Node.__init__(self, name)
334 self.type = Type(type_name)
338 return 'Constant(%r, %r, %r)' % (
339 self.name, self.type, self.value)
342 class Property(Node):
344 def __init__(self, name, type_name, readable, writable,
345 construct, construct_only, ctype=None):
346 Node.__init__(self, name)
347 self.type = Type(type_name, ctype)
348 self.readable = readable
349 self.writable = writable
350 self.construct = construct
351 self.construct_only = construct_only
354 return '%s(%r, %r, %r)' % (
355 self.__class__.__name__,
356 self.name, self.type, self.value)
359 # FIXME: Inherit from Function
362 class Callback(Node):
364 def __init__(self, name, retval, parameters, ctype=None):
365 Node.__init__(self, name)
367 self.parameters = parameters
371 return 'Callback(%r, %r, %r)' % (
372 self.name, self.retval, self.parameters)
377 def __init__(self, name, symbol):
378 Node.__init__(self, name)
380 self.constructors = []
384 return 'Union(%r, %r)' % (self.name, self.fields, )