Run pep8.py in make check, fix old errors.
[gnome.gobject-introspection] / giscanner / ast.py
1 # -*- Mode: Python -*-
2 # GObject-Introspection - a framework for introspecting GObject libraries
3 # Copyright (C) 2008  Johan Dahlin
4 #
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.
9 #
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.
14 #
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
18 # 02110-1301, USA.
19 #
20
21 """AST nodes
22 This file descbribes abstract data type nodes independent on the
23 implementation language.
24
25 These can later on be extended (eg subclassed) with additional information
26 which is language/library/domain specific.
27 """
28
29 ##
30 ## Types
31 ##
32
33 # Basic types
34 TYPE_INT8 = 'int8'
35 TYPE_UINT8 = 'uint8'
36 TYPE_INT16 = 'int16'
37 TYPE_UINT16 = 'uint16'
38 TYPE_INT32 = 'int32'
39 TYPE_UINT32 = 'uint32'
40 TYPE_INT64 = 'int64'
41 TYPE_UINT64 = 'uint64'
42 TYPE_LONG = 'long'
43 TYPE_ULONG = 'ulong'
44
45 # Floating-point
46 TYPE_FLOAT = 'float'
47 TYPE_DOUBLE = 'double'
48
49 # Higher-level data types
50 TYPE_NONE = 'none'
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)
58 TYPE_SSIZE = 'ssize'
59
60 # Wide/Unicode
61 TYPE_UCHAR = 'uchar'
62 TYPE_USTRING = 'ustring'
63
64 # Domain specific, but practically useful
65 TYPE_FILENAME = 'filename'
66
67 ##
68 ## Parameters
69 ##
70
71 PARAM_DIRECTION_IN = 'in'
72 PARAM_DIRECTION_OUT = 'out'
73 PARAM_DIRECTION_INOUT = 'inout'
74
75 type_names = {}
76
77 # C
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
93
94
95 def type_name_from_ctype(ctype):
96     return type_names.get(ctype, ctype)
97
98
99 class Node(object):
100
101     def __init__(self, name=None):
102         self.name = name
103
104     def __repr__(self):
105         return '%s(%r)' % (self.__class__.__name__, self.name)
106
107
108 class Namespace(Node):
109
110     def __init__(self, name):
111         Node.__init__(self, name)
112         self.nodes = []
113
114     def __repr__(self):
115         return '%s(%r, %r)' % (self.__class__.__name__, self.name,
116                                self.nodes)
117
118
119 class Function(Node):
120
121     def __init__(self, name, retval, parameters, symbol):
122         Node.__init__(self, name)
123         self.retval = retval
124         self.parameters = parameters
125         self.symbol = symbol
126
127     def __repr__(self):
128         return '%s(%r, %r, %r)' % (self.__class__.__name__,
129                                    self.name, self.retval,
130                                    self.parameters)
131
132
133 class VFunction(Function):
134     pass
135
136
137 class Type(Node):
138
139     def __init__(self, name, ctype=None):
140         Node.__init__(self, name)
141         self.ctype = ctype
142
143
144 class Alias(Node):
145
146     def __init__(self, name, target, ctype=None):
147         Node.__init__(self, name)
148         self.target = target
149         self.ctype = ctype
150
151     def __repr__(self):
152         return 'Alias(%r, %r)' % (self.name, self.target)
153
154
155 class Parameter(Node):
156
157     def __init__(self, name, typenode):
158         Node.__init__(self, name)
159         self.type = typenode
160         self.direction = PARAM_DIRECTION_IN
161         self.transfer = False
162         self.allow_none = False
163
164     def __repr__(self):
165         return 'Parameter(%r, %r)' % (self.name, self.type)
166
167
168 class Enum(Node):
169
170     def __init__(self, name, symbol, members):
171         Node.__init__(self, name)
172         self.symbol = symbol
173         self.members = members
174
175     def __repr__(self):
176         return 'Enum(%r, %r)' % (self.name, self.members)
177
178
179 class Member(Node):
180
181     def __init__(self, name, value, symbol):
182         Node.__init__(self, name)
183         self.value = value
184         self.symbol = symbol
185
186     def __repr__(self):
187         return 'Member(%r, %r)' % (self.name, self.value)
188
189
190 class Struct(Node):
191
192     def __init__(self, name, symbol):
193         Node.__init__(self, name)
194         self.fields = []
195         self.symbol = symbol
196
197
198 class Field(Node):
199
200     def __init__(self, name, typenode, symbol):
201         Node.__init__(self, name)
202         self.type = typenode
203         self.symbol = symbol
204
205     def __repr__(self):
206         return 'Field(%r, %r)' % (self.name, self.type)
207
208
209 class Return(Node):
210
211     def __init__(self, rtype):
212         Node.__init__(self)
213         self.type = rtype
214         self.transfer = False
215
216     def __repr__(self):
217         return 'Return(%r)' % (self.type, )
218
219
220 class Class(Node):
221
222     def __init__(self, name, parent):
223         Node.__init__(self, name)
224         self.ctype = name
225         self.parent = parent
226         self.methods = []
227         self.constructors = []
228         self.properties = []
229         self.fields = []
230
231     def __repr__(self):
232         return '%s(%r, %r, %r)' % (
233             self.__class__.__name__,
234             self.name, self.parent, self.methods)
235
236
237 class Interface(Node):
238
239     def __init__(self, name):
240         Node.__init__(self, name)
241         self.methods = []
242         self.properties = []
243         self.fields = []
244
245     def __repr__(self):
246         return '%s(%r, %r)' % (
247             self.__class__.__name__,
248             self.name, self.methods)
249
250
251 class Constant(Node):
252
253     def __init__(self, name, type_name, value):
254         Node.__init__(self, name)
255         self.type = Type(type_name)
256         self.value = value
257
258     def __repr__(self):
259         return 'Constant(%r, %r, %r)' % (
260             self.name, self.type, self.value)
261
262
263 class Property(Node):
264
265     def __init__(self, name, type_name, ctype=None):
266         Node.__init__(self, name)
267         self.type = Type(type_name, ctype)
268
269     def __repr__(self):
270         return '%s(%r, %r, %r)' % (
271             self.__class__.__name__,
272             self.name, self.type, self.value)
273
274
275 # FIXME: Inherit from Function
276
277
278 class Callback(Node):
279
280     def __init__(self, name, retval, parameters):
281         Node.__init__(self, name)
282         self.retval = retval
283         self.parameters = parameters
284
285     def __repr__(self):
286         return 'Callback(%r, %r, %r)' % (
287             self.name, self.retval, self.parameters)
288
289
290 class Sequence(Type):
291     # Subclass, because a Sequence is a kind of Type
292
293     def __init__(self, name, ctype, element_type):
294         Type.__init__(self, name, ctype)
295         self.element_type = element_type
296         self.transfer = False