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)
101 def __init__(self, name=None):
105 return '%s(%r)' % (self.__class__.__name__, self.name)
108 class Namespace(Node):
109 def __init__(self, name):
110 Node.__init__(self, name)
114 return '%s(%r, %r)' % (self.__class__.__name__, self.name,
117 class Function(Node):
118 def __init__(self, name, retval, parameters, symbol):
119 Node.__init__(self, name)
121 self.parameters = parameters
125 return '%s(%r, %r, %r)' % (self.__class__.__name__,
126 self.name, self.retval,
130 class VFunction(Function):
135 def __init__(self, name, ctype=None):
136 Node.__init__(self, name)
140 class Parameter(Node):
141 def __init__(self, name, typenode):
142 Node.__init__(self, name)
144 self.direction = PARAM_DIRECTION_IN
145 self.transfer = False
146 self.allow_none = False
149 return 'Parameter(%r, %r)' % (self.name, self.type)
153 def __init__(self, name, symbol, members):
154 Node.__init__(self, name)
156 self.members = members
159 return 'Enum(%r, %r)' % (self.name, self.members)
163 def __init__(self, name, value, symbol):
164 Node.__init__(self, name)
169 return 'Member(%r, %r)' % (self.name, self.value)
173 def __init__(self, name, symbol):
174 Node.__init__(self, name)
180 def __init__(self, name, typenode, symbol):
181 Node.__init__(self, name)
186 return 'Field(%r, %r)' % (self.name, self.type)
190 def __init__(self, rtype):
193 self.transfer = False
196 return 'Return(%r)' % (self.type,)
200 def __init__(self, name, parent):
201 Node.__init__(self, name)
205 self.constructors = []
210 return '%s(%r, %r, %r)' % (
211 self.__class__.__name__,
212 self.name, self.parent, self.methods)
215 class Interface(Node):
216 def __init__(self, name):
217 Node.__init__(self, name)
223 return '%s(%r, %r)' % (
224 self.__class__.__name__,
225 self.name, self.methods)
228 class Constant(Node):
229 def __init__(self, name, type_name, value):
230 Node.__init__(self, name)
231 self.type = Type(type_name)
235 return 'Constant(%r, %r, %r)' % (
236 self.name, self.type, self.value)
239 class Property(Node):
240 def __init__(self, name, type_name, ctype=None):
241 Node.__init__(self, name)
242 self.type = Type(type_name, ctype)
245 return '%s(%r, %r, %r)' % (
246 self.__class__.__name__,
247 self.name, self.type, self.value)
250 # FIXME: Inherit from Function
251 class Callback(Node):
252 def __init__(self, name, retval, parameters):
253 Node.__init__(self, name)
255 self.parameters = parameters
258 return 'Callback(%r, %r, %r)' % (
259 self.name, self.retval, self.parameters)
262 class Sequence(Type):
263 # Subclass, because a Sequence is a kind of Type
264 def __init__(self, name, ctype, element_type):
265 Type.__init__(self, name, ctype)
266 self.element_type = element_type
267 self.transfer = False