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'
52 TYPE_DOUBLE = 'double'
53 TYPE_STRING = 'utf8' # requires zero-terminated
54 TYPE_FILENAME = 'filename'
56 BASIC_GIR_TYPES = [TYPE_BOOLEAN, TYPE_INT8, TYPE_UINT8, TYPE_INT16,
57 TYPE_UINT16, TYPE_INT32, TYPE_UINT32, TYPE_INT64,
58 TYPE_UINT64, TYPE_INT, TYPE_UINT, TYPE_LONG,
59 TYPE_ULONG, TYPE_SSIZET, TYPE_SIZET, TYPE_FLOAT,
60 TYPE_DOUBLE, TYPE_TIMET]
61 GIR_TYPES = [TYPE_NONE, TYPE_ANY]
62 GIR_TYPES.extend(BASIC_GIR_TYPES)
63 GIR_TYPES.extend([TYPE_STRING, TYPE_FILENAME])
65 # Higher-level data types
66 TYPE_SEQUENCE = 'sequence' # Sequence of something
70 TYPE_USTRING = 'ustring'
76 PARAM_DIRECTION_IN = 'in'
77 PARAM_DIRECTION_OUT = 'out'
78 PARAM_DIRECTION_INOUT = 'inout'
81 for name in GIR_TYPES:
82 type_names[name] = name
85 type_names['char'] = TYPE_INT8
86 type_names['unsigned char'] = TYPE_UINT8
87 type_names['short'] = TYPE_INT16
88 type_names['unsigned short'] = TYPE_UINT16
89 type_names['int'] = TYPE_INT
90 type_names['unsigned int'] = TYPE_UINT
91 type_names['long'] = TYPE_LONG
92 type_names['unsigned long'] = TYPE_ULONG
93 type_names['float'] = TYPE_FLOAT
94 type_names['double'] = TYPE_DOUBLE
95 type_names['char*'] = TYPE_STRING
96 type_names['void*'] = TYPE_ANY
97 type_names['void'] = TYPE_NONE
98 type_names['size_t'] = TYPE_SIZET
99 type_names['ssize_t'] = TYPE_SSIZET
100 # FIXME - can we make libraries use GPid?
101 type_names['pid_t'] = TYPE_INT
103 # Suppress some GLib names
104 type_names['uchar'] = TYPE_UINT8
105 type_names['ushort'] = TYPE_UINT16
106 type_names['size'] = TYPE_SIZET
107 type_names['ssize'] = TYPE_SSIZET
108 type_names['pointer'] = TYPE_ANY
109 type_names['constpointer'] = TYPE_ANY
112 # These types, when seen by reference, are converted into an Array()
114 default_array_types = {}
115 default_array_types['uint8*'] = TYPE_UINT8
116 default_array_types['char**'] = TYPE_STRING
119 def type_name_from_ctype(ctype):
120 return type_names.get(ctype, ctype)
125 def __init__(self, name=None):
127 self.deprecated = None
128 self.deprecated_version = None
131 return '%s(%r)' % (self.__class__.__name__, self.name)
134 class Namespace(Node):
136 def __init__(self, name):
137 Node.__init__(self, name)
141 return '%s(%r, %r)' % (self.__class__.__name__, self.name,
145 class Function(Node):
147 def __init__(self, name, retval, parameters, symbol):
148 Node.__init__(self, name)
150 self.parameters = parameters
154 return '%s(%r, %r, %r)' % (self.__class__.__name__,
155 self.name, self.retval,
159 class VFunction(Function):
165 def __init__(self, name, ctype=None):
166 Node.__init__(self, name)
168 self.resolved = False
173 def __init__(self, ctype, element_type):
174 Type.__init__(self, '<carray>', ctype)
175 self.element_type = element_type
176 self.zeroterminated = True
177 self.length_param_index = -1
180 return 'Array(%r of %r)' % (self.name, self.element_type, )
185 def __init__(self, name, ctype, element_type):
186 Type.__init__(self, name, ctype)
187 self.element_type = element_type
190 return 'List(%r of %r)' % (self.name, self.element_type, )
195 def __init__(self, name, ctype, key_type, value_type):
196 Type.__init__(self, name, ctype)
197 self.key_type = key_type
198 self.value_type = value_type
201 return 'Map(%r <%r,%r.)' % (self.name, self.key_type, self.value_type)
206 def __init__(self, name, target, ctype=None):
207 Node.__init__(self, name)
212 return 'Alias(%r, %r)' % (self.name, self.target)
215 class Parameter(Node):
217 def __init__(self, name, typenode):
218 Node.__init__(self, name)
220 self.direction = PARAM_DIRECTION_IN
221 self.transfer = False
222 self.allow_none = False
225 return 'Parameter(%r, %r)' % (self.name, self.type)
230 def __init__(self, name, symbol, members):
231 Node.__init__(self, name)
233 self.members = members
236 return 'Enum(%r, %r)' % (self.name, self.members)
241 def __init__(self, name, value, symbol):
242 Node.__init__(self, name)
247 return 'Member(%r, %r)' % (self.name, self.value)
252 def __init__(self, name, symbol):
253 Node.__init__(self, name)
260 def __init__(self, name, typenode, symbol):
261 Node.__init__(self, name)
266 return 'Field(%r, %r)' % (self.name, self.type)
271 def __init__(self, rtype):
274 self.transfer = isinstance(rtype, (List, Map, Array)) or \
275 rtype.name in ('utf8', 'filename')
278 return 'Return(%r)' % (self.type, )
283 def __init__(self, name, parent):
284 Node.__init__(self, name)
289 self.constructors = []
294 return '%s(%r, %r, %r)' % (
295 self.__class__.__name__,
296 self.name, self.parent, self.methods)
299 class Interface(Node):
301 def __init__(self, name, parent):
302 Node.__init__(self, name)
309 return '%s(%r, %r)' % (
310 self.__class__.__name__,
311 self.name, self.methods)
314 class Constant(Node):
316 def __init__(self, name, type_name, value):
317 Node.__init__(self, name)
318 self.type = Type(type_name)
322 return 'Constant(%r, %r, %r)' % (
323 self.name, self.type, self.value)
326 class Property(Node):
328 def __init__(self, name, type_name, readable, writable,
329 construct, construct_only, ctype=None):
330 Node.__init__(self, name)
331 self.type = Type(type_name, ctype)
332 self.readable = readable
333 self.writable = writable
334 self.construct = construct
335 self.construct_only = construct_only
338 return '%s(%r, %r, %r)' % (
339 self.__class__.__name__,
340 self.name, self.type, self.value)
343 # FIXME: Inherit from Function
346 class Callback(Node):
348 def __init__(self, name, retval, parameters, ctype=None):
349 Node.__init__(self, name)
351 self.parameters = parameters
355 return 'Callback(%r, %r, %r)' % (
356 self.name, self.retval, self.parameters)
361 def __init__(self, name, symbol):
362 Node.__init__(self, name)
367 return 'Union(%r, %r)' % (self.name, self.fields, )