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 # FIXME - we should be evaluating these per-platform; maybe check glibconfig.h?
100 type_names['time_t'] = TYPE_LONG
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 def type_name_from_ctype(ctype):
113 return type_names.get(ctype, ctype)
118 def __init__(self, name=None):
120 self.deprecated = None
121 self.deprecated_version = None
124 return '%s(%r)' % (self.__class__.__name__, self.name)
127 class Namespace(Node):
129 def __init__(self, name):
130 Node.__init__(self, name)
134 return '%s(%r, %r)' % (self.__class__.__name__, self.name,
138 class Function(Node):
140 def __init__(self, name, retval, parameters, symbol):
141 Node.__init__(self, name)
143 self.parameters = parameters
147 return '%s(%r, %r, %r)' % (self.__class__.__name__,
148 self.name, self.retval,
152 class VFunction(Function):
158 def __init__(self, name, ctype=None):
159 Node.__init__(self, name)
161 self.resolved = False
166 def __init__(self, name, target, ctype=None):
167 Node.__init__(self, name)
172 return 'Alias(%r, %r)' % (self.name, self.target)
175 class Parameter(Node):
177 def __init__(self, name, typenode):
178 Node.__init__(self, name)
180 self.direction = PARAM_DIRECTION_IN
181 self.transfer = False
182 self.allow_none = False
185 return 'Parameter(%r, %r)' % (self.name, self.type)
190 def __init__(self, name, symbol, members):
191 Node.__init__(self, name)
193 self.members = members
196 return 'Enum(%r, %r)' % (self.name, self.members)
201 def __init__(self, name, value, symbol):
202 Node.__init__(self, name)
207 return 'Member(%r, %r)' % (self.name, self.value)
212 def __init__(self, name, symbol):
213 Node.__init__(self, name)
220 def __init__(self, name, typenode, symbol):
221 Node.__init__(self, name)
226 return 'Field(%r, %r)' % (self.name, self.type)
231 def __init__(self, rtype):
234 self.transfer = False
237 return 'Return(%r)' % (self.type, )
242 def __init__(self, name, parent):
243 Node.__init__(self, name)
248 self.constructors = []
253 return '%s(%r, %r, %r)' % (
254 self.__class__.__name__,
255 self.name, self.parent, self.methods)
258 class Interface(Node):
260 def __init__(self, name, parent):
261 Node.__init__(self, name)
268 return '%s(%r, %r)' % (
269 self.__class__.__name__,
270 self.name, self.methods)
273 class Constant(Node):
275 def __init__(self, name, type_name, value):
276 Node.__init__(self, name)
277 self.type = Type(type_name)
281 return 'Constant(%r, %r, %r)' % (
282 self.name, self.type, self.value)
285 class Property(Node):
287 def __init__(self, name, type_name, readable, writable,
288 construct, construct_only, ctype=None):
289 Node.__init__(self, name)
290 self.type = Type(type_name, ctype)
291 self.readable = readable
292 self.writable = writable
293 self.construct = construct
294 self.construct_only = construct_only
297 return '%s(%r, %r, %r)' % (
298 self.__class__.__name__,
299 self.name, self.type, self.value)
302 # FIXME: Inherit from Function
305 class Callback(Node):
307 def __init__(self, name, retval, parameters, ctype=None):
308 Node.__init__(self, name)
310 self.parameters = parameters
314 return 'Callback(%r, %r, %r)' % (
315 self.name, self.retval, self.parameters)
318 class Sequence(Type):
319 # Subclass, because a Sequence is a kind of Type
321 def __init__(self, name, ctype, element_type):
322 Type.__init__(self, name, ctype)
323 self.element_type = element_type
324 self.transfer = False
327 return 'Sequence(%r of %r)' % (self.name, self.element_type, )
332 def __init__(self, name, symbol):
333 Node.__init__(self, name)
338 return 'Union(%r, %r)' % (self.name, self.fields, )