Add interfaces property to class. Write out implemented interfaces.
[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 ## Basic types, modeled on GITypeTag but not equivalent
31 ##
32
33 TYPE_NONE = 'none' # We differ from repository on these first two
34 TYPE_ANY = 'any'
35 TYPE_BOOLEAN = 'boolean'
36 TYPE_INT8 = 'int8'
37 TYPE_UINT8 = 'uint8'
38 TYPE_INT16 = 'int16'
39 TYPE_UINT16 = 'uint16'
40 TYPE_INT = 'int'
41 TYPE_UINT = 'uint'
42 TYPE_INT32 = 'int32'
43 TYPE_UINT32 = 'uint32'
44 TYPE_INT64 = 'int64'
45 TYPE_UINT64 = 'uint64'
46 TYPE_LONG = 'long'
47 TYPE_ULONG = 'ulong'
48 TYPE_SSIZET = 'ssize_t'
49 TYPE_SIZET = 'size_t'
50 TYPE_FLOAT = 'float'
51 TYPE_DOUBLE = 'double'
52 TYPE_STRING = 'string' # requires zero-terminated
53 TYPE_FILENAME = 'filename'
54
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,
59                    TYPE_DOUBLE]
60 GIR_TYPES = [TYPE_NONE, TYPE_ANY]
61 GIR_TYPES.extend(BASIC_GIR_TYPES)
62 GIR_TYPES.extend([TYPE_STRING, TYPE_FILENAME])
63
64 # Higher-level data types
65 TYPE_SEQUENCE = 'sequence' # Sequence of something
66
67 # Wide/Unicode
68 TYPE_UCHAR = 'uchar'
69 TYPE_USTRING = 'ustring'
70
71 ##
72 ## Parameters
73 ##
74
75 PARAM_DIRECTION_IN = 'in'
76 PARAM_DIRECTION_OUT = 'out'
77 PARAM_DIRECTION_INOUT = 'inout'
78
79 type_names = {}
80 for name in GIR_TYPES:
81     type_names[name] = name
82
83 # C
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
100
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
106
107
108 def type_name_from_ctype(ctype):
109     return type_names.get(ctype, ctype)
110
111
112 class Node(object):
113
114     def __init__(self, name=None):
115         self.name = name
116
117     def __repr__(self):
118         return '%s(%r)' % (self.__class__.__name__, self.name)
119
120
121 class Namespace(Node):
122
123     def __init__(self, name):
124         Node.__init__(self, name)
125         self.nodes = []
126
127     def __repr__(self):
128         return '%s(%r, %r)' % (self.__class__.__name__, self.name,
129                                self.nodes)
130
131
132 class Function(Node):
133
134     def __init__(self, name, retval, parameters, symbol):
135         Node.__init__(self, name)
136         self.retval = retval
137         self.parameters = parameters
138         self.symbol = symbol
139
140     def __repr__(self):
141         return '%s(%r, %r, %r)' % (self.__class__.__name__,
142                                    self.name, self.retval,
143                                    self.parameters)
144
145
146 class VFunction(Function):
147     pass
148
149
150 class Type(Node):
151
152     def __init__(self, name, ctype=None):
153         Node.__init__(self, name)
154         self.ctype = ctype
155         self.resolved = False
156
157
158 class Alias(Node):
159
160     def __init__(self, name, target, ctype=None):
161         Node.__init__(self, name)
162         self.target = target
163         self.ctype = ctype
164
165     def __repr__(self):
166         return 'Alias(%r, %r)' % (self.name, self.target)
167
168
169 class Parameter(Node):
170
171     def __init__(self, name, typenode):
172         Node.__init__(self, name)
173         self.type = typenode
174         self.direction = PARAM_DIRECTION_IN
175         self.transfer = False
176         self.allow_none = False
177
178     def __repr__(self):
179         return 'Parameter(%r, %r)' % (self.name, self.type)
180
181
182 class Enum(Node):
183
184     def __init__(self, name, symbol, members):
185         Node.__init__(self, name)
186         self.symbol = symbol
187         self.members = members
188
189     def __repr__(self):
190         return 'Enum(%r, %r)' % (self.name, self.members)
191
192
193 class Member(Node):
194
195     def __init__(self, name, value, symbol):
196         Node.__init__(self, name)
197         self.value = value
198         self.symbol = symbol
199
200     def __repr__(self):
201         return 'Member(%r, %r)' % (self.name, self.value)
202
203
204 class Struct(Node):
205
206     def __init__(self, name, symbol):
207         Node.__init__(self, name)
208         self.fields = []
209         self.symbol = symbol
210
211
212 class Field(Node):
213
214     def __init__(self, name, typenode, symbol):
215         Node.__init__(self, name)
216         self.type = typenode
217         self.symbol = symbol
218
219     def __repr__(self):
220         return 'Field(%r, %r)' % (self.name, self.type)
221
222
223 class Return(Node):
224
225     def __init__(self, rtype):
226         Node.__init__(self)
227         self.type = rtype
228         self.transfer = False
229
230     def __repr__(self):
231         return 'Return(%r)' % (self.type, )
232
233
234 class Class(Node):
235
236     def __init__(self, name, parent):
237         Node.__init__(self, name)
238         self.ctype = name
239         self.parent = parent
240         self.methods = []
241         self.interfaces = []
242         self.constructors = []
243         self.properties = []
244         self.fields = []
245
246     def __repr__(self):
247         return '%s(%r, %r, %r)' % (
248             self.__class__.__name__,
249             self.name, self.parent, self.methods)
250
251
252 class Interface(Node):
253
254     def __init__(self, name, parent):
255         Node.__init__(self, name)
256         self.parent = parent
257         self.methods = []
258         self.properties = []
259         self.fields = []
260
261     def __repr__(self):
262         return '%s(%r, %r)' % (
263             self.__class__.__name__,
264             self.name, self.methods)
265
266
267 class Constant(Node):
268
269     def __init__(self, name, type_name, value):
270         Node.__init__(self, name)
271         self.type = Type(type_name)
272         self.value = value
273
274     def __repr__(self):
275         return 'Constant(%r, %r, %r)' % (
276             self.name, self.type, self.value)
277
278
279 class Property(Node):
280
281     def __init__(self, name, type_name, ctype=None):
282         Node.__init__(self, name)
283         self.type = Type(type_name, ctype)
284
285     def __repr__(self):
286         return '%s(%r, %r, %r)' % (
287             self.__class__.__name__,
288             self.name, self.type, self.value)
289
290
291 # FIXME: Inherit from Function
292
293
294 class Callback(Node):
295
296     def __init__(self, name, retval, parameters, ctype=None):
297         Node.__init__(self, name)
298         self.retval = retval
299         self.parameters = parameters
300         self.ctype = ctype
301
302     def __repr__(self):
303         return 'Callback(%r, %r, %r)' % (
304             self.name, self.retval, self.parameters)
305
306
307 class Sequence(Type):
308     # Subclass, because a Sequence is a kind of Type
309
310     def __init__(self, name, ctype, element_type):
311         Type.__init__(self, name, ctype)
312         self.element_type = element_type
313         self.transfer = False
314
315     def __repr__(self):
316         return 'Sequence(%r of %r)' % (self.name, self.element_type, )
317
318
319 class Union(Node):
320
321     def __init__(self, name, symbol):
322         Node.__init__(self, name)
323         self.fields = []
324         self.symbol = symbol
325
326     def __repr__(self):
327         return 'Union(%r, %r)' % (self.name, self.fields, )