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.
37 TYPE_UINT16 = 'uint16'
39 TYPE_UINT32 = 'uint32'
41 TYPE_UINT64 = 'uint64'
47 TYPE_DOUBLE = 'double'
49 # Higher-level data types
51 TYPE_ANY = 'any' # CORBA Any/Variant/GValue, holds anything.
52 TYPE_BOOLEAN = 'boolean' # True/False
53 TYPE_STRING = 'string' # Sequence of characters
54 TYPE_SEQUENCE = 'sequence' # Sequence of something
55 TYPE_CHAR = 'char' # Character
56 TYPE_UCHAR = 'uchar' # Unsigned Character
57 TYPE_SIZE = 'size' # Size type (memory, buffer etc)
62 TYPE_USTRING = 'ustring'
64 # Domain specific, but practically useful
65 TYPE_FILENAME = 'filename'
71 PARAM_DIRECTION_IN = 'in'
72 PARAM_DIRECTION_OUT = 'out'
73 PARAM_DIRECTION_INOUT = 'inout'
78 type_names['char'] = TYPE_CHAR
79 type_names['unsigned char'] = TYPE_UCHAR
80 type_names['short'] = TYPE_INT16
81 type_names['unsigned short'] = TYPE_UINT16
82 type_names['int'] = TYPE_INT32
83 type_names['unsigned int'] = TYPE_UINT32
84 type_names['long'] = TYPE_LONG
85 type_names['unsigned long'] = TYPE_ULONG
86 type_names['float'] = TYPE_FLOAT
87 type_names['double'] = TYPE_DOUBLE
88 type_names['char*'] = TYPE_STRING
89 type_names['void*'] = TYPE_ANY
90 type_names['void'] = TYPE_NONE
91 type_names['size_t'] = TYPE_SIZE
92 type_names['ssize_t'] = TYPE_SSIZE
95 def type_name_from_ctype(ctype):
96 return type_names.get(ctype, ctype)
100 def __init__(self, name=None):
104 return '%s(%r)' % (self.__class__.__name__, self.name)
107 class Namespace(Node):
108 def __init__(self, name):
109 Node.__init__(self, name)
113 return '%s(%r, %r)' % (self.__class__.__name__, self.name,
116 class Function(Node):
117 def __init__(self, name, retval, parameters, symbol):
118 Node.__init__(self, name)
120 self.parameters = parameters
124 return '%s(%r, %r, %r)' % (self.__class__.__name__,
125 self.name, self.retval,
129 class VFunction(Function):
134 def __init__(self, name, ctype=None):
135 Node.__init__(self, name)
139 class Parameter(Node):
140 def __init__(self, name, typenode):
141 Node.__init__(self, name)
143 self.direction = PARAM_DIRECTION_IN
144 self.transfer = False
147 return 'Parameter(%r, %r)' % (self.name, self.type)
151 def __init__(self, name, symbol, members):
152 Node.__init__(self, name)
154 self.members = members
157 return 'Enum(%r, %r)' % (self.name, self.members)
161 def __init__(self, name, value, symbol):
162 Node.__init__(self, name)
167 return 'Member(%r, %r)' % (self.name, self.value)
171 def __init__(self, name, symbol):
172 Node.__init__(self, name)
178 def __init__(self, name, typenode, symbol):
179 Node.__init__(self, name)
184 return 'Field(%r, %r)' % (self.name, self.type)
188 def __init__(self, rtype):
191 self.transfer = False
194 return 'Return(%r)' % (self.type,)
198 def __init__(self, name, parent):
199 Node.__init__(self, name)
203 self.constructors = []
208 return '%s(%r, %r, %r)' % (
209 self.__class__.__name__,
210 self.name, self.parent, self.methods)
213 class Interface(Node):
214 def __init__(self, name):
215 Node.__init__(self, name)
221 return '%s(%r, %r)' % (
222 self.__class__.__name__,
223 self.name, self.methods)
226 class Constant(Node):
227 def __init__(self, name, type_name, value):
228 Node.__init__(self, name)
229 self.type = Type(type_name)
233 return 'Constant(%r, %r, %r)' % (
234 self.name, self.type, self.value)
237 class Property(Node):
238 def __init__(self, name, type_name, ctype=None):
239 Node.__init__(self, name)
240 self.type = Type(type_name, ctype)
243 return '%s(%r, %r, %r)' % (
244 self.__class__.__name__,
245 self.name, self.type, self.value)
248 # FIXME: Inherit from Function
249 class Callback(Node):
250 def __init__(self, name, retval, parameters):
251 Node.__init__(self, name)
253 self.parameters = parameters
256 return 'Callback(%r, %r, %r)' % (
257 self.name, self.retval, self.parameters)
260 class Sequence(Type):
261 # Subclass, because a Sequence is a kind of Type
262 def __init__(self, name, ctype, element_type):
263 Type.__init__(self, name, ctype)
264 self.element_type = element_type
265 self.transfer = False