Start using abstract type instead of the raw C types. Register a bunch of
[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     def __init__(self, name=None):
101         self.name = name
102
103     def __repr__(self):
104         return '%s(%r)' % (self.__class__.__name__, self.name)
105
106
107 class Namespace(Node):
108     def __init__(self, name):
109         Node.__init__(self, name)
110         self.nodes = []
111
112     def __repr__(self):
113         return '%s(%r, %r)' % (self.__class__.__name__, self.name,
114                                self.nodes)
115
116 class Function(Node):
117     def __init__(self, name, retval, parameters, symbol):
118         Node.__init__(self, name)
119         self.retval = retval
120         self.parameters = parameters
121         self.symbol = symbol
122
123     def __repr__(self):
124         return '%s(%r, %r, %r)' % (self.__class__.__name__,
125                                    self.name, self.retval,
126                                    self.parameters)
127
128
129 class VFunction(Function):
130     pass
131
132
133 class Type(Node):
134     def __init__(self, name, ctype=None):
135         Node.__init__(self, name)
136         self.ctype = ctype
137
138
139 class Parameter(Node):
140     def __init__(self, name, typenode):
141         Node.__init__(self, name)
142         self.type = typenode
143         self.direction = PARAM_DIRECTION_IN
144         self.transfer = False
145
146     def __repr__(self):
147         return 'Parameter(%r, %r)' % (self.name, self.type)
148
149
150 class Enum(Node):
151     def __init__(self, name, symbol, members):
152         Node.__init__(self, name)
153         self.symbol = symbol
154         self.members = members
155
156     def __repr__(self):
157         return 'Enum(%r, %r)' % (self.name, self.members)
158
159
160 class Member(Node):
161     def __init__(self, name, value, symbol):
162         Node.__init__(self, name)
163         self.value = value
164         self.symbol = symbol
165
166     def __repr__(self):
167         return 'Member(%r, %r)' % (self.name, self.value)
168
169
170 class Struct(Node):
171     def __init__(self, name, symbol):
172         Node.__init__(self, name)
173         self.fields = []
174         self.symbol = symbol
175
176
177 class Field(Node):
178     def __init__(self, name, typenode, symbol):
179         Node.__init__(self, name)
180         self.type = typenode
181         self.symbol = symbol
182
183     def __repr__(self):
184         return 'Field(%r, %r)' % (self.name, self.type)
185
186
187 class Return(Node):
188     def __init__(self, rtype):
189         Node.__init__(self)
190         self.type = rtype
191         self.transfer = False
192
193     def __repr__(self):
194         return 'Return(%r)' % (self.type,)
195
196
197 class Class(Node):
198     def __init__(self, name, parent):
199         Node.__init__(self, name)
200         self.ctype = name
201         self.parent = parent
202         self.methods = []
203         self.constructors = []
204         self.properties = []
205         self.fields = []
206
207     def __repr__(self):
208         return '%s(%r, %r, %r)' % (
209             self.__class__.__name__,
210             self.name, self.parent, self.methods)
211
212
213 class Interface(Node):
214     def __init__(self, name):
215         Node.__init__(self, name)
216         self.methods = []
217         self.properties = []
218         self.fields = []
219
220     def __repr__(self):
221         return '%s(%r, %r)' % (
222             self.__class__.__name__,
223             self.name, self.methods)
224
225
226 class Constant(Node):
227     def __init__(self, name, type_name, value):
228         Node.__init__(self, name)
229         self.type = Type(type_name)
230         self.value = value
231
232     def __repr__(self):
233         return 'Constant(%r, %r, %r)' % (
234             self.name, self.type, self.value)
235
236
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)
241
242     def __repr__(self):
243         return '%s(%r, %r, %r)' % (
244             self.__class__.__name__,
245             self.name, self.type, self.value)
246
247
248 # FIXME: Inherit from Function
249 class Callback(Node):
250     def __init__(self, name, retval, parameters):
251         Node.__init__(self, name)
252         self.retval = retval
253         self.parameters = parameters
254
255     def __repr__(self):
256         return 'Callback(%r, %r, %r)' % (
257             self.name, self.retval, self.parameters)
258
259
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
266