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
107 def type_name_from_ctype(ctype):
108 return type_names.get(ctype, ctype)
113 def __init__(self, name=None):
117 return '%s(%r)' % (self.__class__.__name__, self.name)
120 class Namespace(Node):
122 def __init__(self, name):
123 Node.__init__(self, name)
127 return '%s(%r, %r)' % (self.__class__.__name__, self.name,
131 class Function(Node):
133 def __init__(self, name, retval, parameters, symbol):
134 Node.__init__(self, name)
136 self.parameters = parameters
140 return '%s(%r, %r, %r)' % (self.__class__.__name__,
141 self.name, self.retval,
145 class VFunction(Function):
151 def __init__(self, name, ctype=None):
152 Node.__init__(self, name)
154 self.resolved = False
159 def __init__(self, name, target, ctype=None):
160 Node.__init__(self, name)
165 return 'Alias(%r, %r)' % (self.name, self.target)
168 class Parameter(Node):
170 def __init__(self, name, typenode):
171 Node.__init__(self, name)
173 self.direction = PARAM_DIRECTION_IN
174 self.transfer = False
175 self.allow_none = False
178 return 'Parameter(%r, %r)' % (self.name, self.type)
183 def __init__(self, name, symbol, members):
184 Node.__init__(self, name)
186 self.members = members
189 return 'Enum(%r, %r)' % (self.name, self.members)
194 def __init__(self, name, value, symbol):
195 Node.__init__(self, name)
200 return 'Member(%r, %r)' % (self.name, self.value)
205 def __init__(self, name, symbol):
206 Node.__init__(self, name)
213 def __init__(self, name, typenode, symbol):
214 Node.__init__(self, name)
219 return 'Field(%r, %r)' % (self.name, self.type)
224 def __init__(self, rtype):
227 self.transfer = False
230 return 'Return(%r)' % (self.type, )
235 def __init__(self, name, parent):
236 Node.__init__(self, name)
240 self.constructors = []
245 return '%s(%r, %r, %r)' % (
246 self.__class__.__name__,
247 self.name, self.parent, self.methods)
250 class Interface(Node):
252 def __init__(self, name, parent):
253 Node.__init__(self, name)
260 return '%s(%r, %r)' % (
261 self.__class__.__name__,
262 self.name, self.methods)
265 class Constant(Node):
267 def __init__(self, name, type_name, value):
268 Node.__init__(self, name)
269 self.type = Type(type_name)
273 return 'Constant(%r, %r, %r)' % (
274 self.name, self.type, self.value)
277 class Property(Node):
279 def __init__(self, name, type_name, ctype=None):
280 Node.__init__(self, name)
281 self.type = Type(type_name, ctype)
284 return '%s(%r, %r, %r)' % (
285 self.__class__.__name__,
286 self.name, self.type, self.value)
289 # FIXME: Inherit from Function
292 class Callback(Node):
294 def __init__(self, name, retval, parameters, ctype=None):
295 Node.__init__(self, name)
297 self.parameters = parameters
301 return 'Callback(%r, %r, %r)' % (
302 self.name, self.retval, self.parameters)
305 class Sequence(Type):
306 # Subclass, because a Sequence is a kind of Type
308 def __init__(self, name, ctype, element_type):
309 Type.__init__(self, name, ctype)
310 self.element_type = element_type
311 self.transfer = False
314 return 'Sequence(%r of %r)' % (self.name, self.element_type, )
319 def __init__(self, name, symbol):
320 Node.__init__(self, name)
325 return 'Union(%r, %r)' % (self.name, self.fields, )