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['long'] = TYPE_LONG
93 type_names['unsigned long'] = TYPE_ULONG
94 type_names['float'] = TYPE_FLOAT
95 type_names['double'] = TYPE_DOUBLE
96 type_names['char*'] = TYPE_STRING
97 type_names['void*'] = TYPE_ANY
98 type_names['void'] = TYPE_NONE
99 type_names['size_t'] = TYPE_SIZET
100 type_names['ssize_t'] = TYPE_SSIZET
101 # FIXME - can we make libraries use GPid?
102 type_names['pid_t'] = TYPE_INT
104 # Suppress some GLib names
105 type_names['uchar'] = TYPE_UINT8
106 type_names['ushort'] = TYPE_UINT16
107 type_names['size'] = TYPE_SIZET
108 type_names['ssize'] = TYPE_SSIZET
109 type_names['pointer'] = TYPE_ANY
110 type_names['constpointer'] = TYPE_ANY
113 # These types, when seen by reference, are converted into an Array()
115 default_array_types = {}
116 default_array_types['uint8*'] = TYPE_UINT8
117 default_array_types['char**'] = TYPE_STRING
120 def type_name_from_ctype(ctype):
121 return type_names.get(ctype, ctype)
126 def __init__(self, name=None):
128 self.deprecated = None
129 self.deprecated_version = None
132 return '%s(%r)' % (self.__class__.__name__, self.name)
135 class Namespace(Node):
137 def __init__(self, name):
138 Node.__init__(self, name)
142 return '%s(%r, %r)' % (self.__class__.__name__, self.name,
146 class Function(Node):
148 def __init__(self, name, retval, parameters, symbol):
149 Node.__init__(self, name)
151 self.parameters = parameters
155 return '%s(%r, %r, %r)' % (self.__class__.__name__,
156 self.name, self.retval,
160 class VFunction(Function):
166 def __init__(self, name, ctype=None):
167 Node.__init__(self, name)
169 self.resolved = False
174 def __init__(self, ctype, element_type):
175 Type.__init__(self, '<carray>', ctype)
176 self.element_type = element_type
177 self.zeroterminated = True
178 self.length_param_index = -1
181 return 'Array(%r of %r)' % (self.name, self.element_type, )
186 def __init__(self, name, ctype, element_type):
187 Type.__init__(self, name, ctype)
188 self.element_type = element_type
191 return 'List(%r of %r)' % (self.name, self.element_type, )
196 def __init__(self, name, ctype, key_type, value_type):
197 Type.__init__(self, name, ctype)
198 self.key_type = key_type
199 self.value_type = value_type
202 return 'Map(%r <%r,%r.)' % (self.name, self.key_type, self.value_type)
207 def __init__(self, name, target, ctype=None):
208 Node.__init__(self, name)
213 return 'Alias(%r, %r)' % (self.name, self.target)
216 class Parameter(Node):
218 def __init__(self, name, typenode):
219 Node.__init__(self, name)
221 self.direction = PARAM_DIRECTION_IN
222 self.transfer = False
223 self.allow_none = False
226 return 'Parameter(%r, %r)' % (self.name, self.type)
231 def __init__(self, name, symbol, members):
232 Node.__init__(self, name)
234 self.members = members
237 return 'Enum(%r, %r)' % (self.name, self.members)
242 def __init__(self, name, value, symbol):
243 Node.__init__(self, name)
248 return 'Member(%r, %r)' % (self.name, self.value)
253 def __init__(self, name, symbol):
254 Node.__init__(self, name)
261 def __init__(self, name, typenode, symbol):
262 Node.__init__(self, name)
267 return 'Field(%r, %r)' % (self.name, self.type)
272 def __init__(self, rtype):
275 self.transfer = isinstance(rtype, (List, Map, Array)) or \
276 rtype.name in ('utf8', 'filename')
279 return 'Return(%r)' % (self.type, )
284 def __init__(self, name, parent):
285 Node.__init__(self, name)
290 self.constructors = []
295 return '%s(%r, %r, %r)' % (
296 self.__class__.__name__,
297 self.name, self.parent, self.methods)
300 class Interface(Node):
302 def __init__(self, name, parent):
303 Node.__init__(self, name)
310 return '%s(%r, %r)' % (
311 self.__class__.__name__,
312 self.name, self.methods)
315 class Constant(Node):
317 def __init__(self, name, type_name, value):
318 Node.__init__(self, name)
319 self.type = Type(type_name)
323 return 'Constant(%r, %r, %r)' % (
324 self.name, self.type, self.value)
327 class Property(Node):
329 def __init__(self, name, type_name, readable, writable,
330 construct, construct_only, ctype=None):
331 Node.__init__(self, name)
332 self.type = Type(type_name, ctype)
333 self.readable = readable
334 self.writable = writable
335 self.construct = construct
336 self.construct_only = construct_only
339 return '%s(%r, %r, %r)' % (
340 self.__class__.__name__,
341 self.name, self.type, self.value)
344 # FIXME: Inherit from Function
347 class Callback(Node):
349 def __init__(self, name, retval, parameters, ctype=None):
350 Node.__init__(self, name)
352 self.parameters = parameters
356 return 'Callback(%r, %r, %r)' % (
357 self.name, self.retval, self.parameters)
362 def __init__(self, name, symbol):
363 Node.__init__(self, name)
368 return 'Union(%r, %r)' % (self.name, self.fields, )