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['pointer'] = TYPE_ANY
105 type_names['constpointer'] = TYPE_ANY
108 def type_name_from_ctype(ctype):
109 return type_names.get(ctype, ctype)
114 def __init__(self, name=None):
118 return '%s(%r)' % (self.__class__.__name__, self.name)
121 class Namespace(Node):
123 def __init__(self, name):
124 Node.__init__(self, name)
128 return '%s(%r, %r)' % (self.__class__.__name__, self.name,
132 class Function(Node):
134 def __init__(self, name, retval, parameters, symbol):
135 Node.__init__(self, name)
137 self.parameters = parameters
141 return '%s(%r, %r, %r)' % (self.__class__.__name__,
142 self.name, self.retval,
146 class VFunction(Function):
152 def __init__(self, name, ctype=None):
153 Node.__init__(self, name)
155 self.resolved = False
160 def __init__(self, name, target, ctype=None):
161 Node.__init__(self, name)
166 return 'Alias(%r, %r)' % (self.name, self.target)
169 class Parameter(Node):
171 def __init__(self, name, typenode):
172 Node.__init__(self, name)
174 self.direction = PARAM_DIRECTION_IN
175 self.transfer = False
176 self.allow_none = False
179 return 'Parameter(%r, %r)' % (self.name, self.type)
184 def __init__(self, name, symbol, members):
185 Node.__init__(self, name)
187 self.members = members
190 return 'Enum(%r, %r)' % (self.name, self.members)
195 def __init__(self, name, value, symbol):
196 Node.__init__(self, name)
201 return 'Member(%r, %r)' % (self.name, self.value)
206 def __init__(self, name, symbol):
207 Node.__init__(self, name)
214 def __init__(self, name, typenode, symbol):
215 Node.__init__(self, name)
220 return 'Field(%r, %r)' % (self.name, self.type)
225 def __init__(self, rtype):
228 self.transfer = False
231 return 'Return(%r)' % (self.type, )
236 def __init__(self, name, parent):
237 Node.__init__(self, name)
242 self.constructors = []
247 return '%s(%r, %r, %r)' % (
248 self.__class__.__name__,
249 self.name, self.parent, self.methods)
252 class Interface(Node):
254 def __init__(self, name, parent):
255 Node.__init__(self, name)
262 return '%s(%r, %r)' % (
263 self.__class__.__name__,
264 self.name, self.methods)
267 class Constant(Node):
269 def __init__(self, name, type_name, value):
270 Node.__init__(self, name)
271 self.type = Type(type_name)
275 return 'Constant(%r, %r, %r)' % (
276 self.name, self.type, self.value)
279 class Property(Node):
281 def __init__(self, name, type_name, ctype=None):
282 Node.__init__(self, name)
283 self.type = Type(type_name, ctype)
286 return '%s(%r, %r, %r)' % (
287 self.__class__.__name__,
288 self.name, self.type, self.value)
291 # FIXME: Inherit from Function
294 class Callback(Node):
296 def __init__(self, name, retval, parameters, ctype=None):
297 Node.__init__(self, name)
299 self.parameters = parameters
303 return 'Callback(%r, %r, %r)' % (
304 self.name, self.retval, self.parameters)
307 class Sequence(Type):
308 # Subclass, because a Sequence is a kind of Type
310 def __init__(self, name, ctype, element_type):
311 Type.__init__(self, name, ctype)
312 self.element_type = element_type
313 self.transfer = False
316 return 'Sequence(%r of %r)' % (self.name, self.element_type, )
321 def __init__(self, name, symbol):
322 Node.__init__(self, name)
327 return 'Union(%r, %r)' % (self.name, self.fields, )