Clean up and refactor enum namespacing
[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
76 class Node(object):
77     def __init__(self, name=None):
78         self.name = name
79
80     def __repr__(self):
81         return '%s(%r)' % (self.__class__.__name__, self.name)
82
83
84 class Namespace(Node):
85     def __init__(self, name):
86         Node.__init__(self, name)
87         self.nodes = []
88
89     def __repr__(self):
90         return '%s(%r, %r)' % (self.__class__.__name__, self.name,
91                                self.nodes)
92
93 class Function(Node):
94     def __init__(self, name, retval, parameters, symbol):
95         Node.__init__(self, name)
96         self.retval = retval
97         self.parameters = parameters
98         self.symbol = symbol
99
100     def __repr__(self):
101         return '%s(%r, %r, %r)' % (self.__class__.__name__,
102                                    self.name, self.retval,
103                                    self.parameters)
104
105
106 class VFunction(Function):
107     pass
108
109
110 class Type(Node):
111     def __init__(self, name):
112         Node.__init__(self, name)
113         self.ctype = name
114
115
116 class Parameter(Node):
117     def __init__(self, name, typenode):
118         Node.__init__(self, name)
119         self.type = typenode
120         self.direction = PARAM_DIRECTION_IN
121         self.transfer = False
122
123     def __repr__(self):
124         return 'Parameter(%r, %r)' % (self.name, self.type)
125
126
127 class Enum(Node):
128     def __init__(self, name, symbol, members):
129         Node.__init__(self, name)
130         self.symbol = symbol
131         self.members = members
132
133     def __repr__(self):
134         return 'Enum(%r, %r)' % (self.name, self.members)
135
136
137 class Member(Node):
138     def __init__(self, name, value):
139         Node.__init__(self, name)
140         self.value = value
141
142     def __repr__(self):
143         return 'Member(%r, %r)' % (self.name, self.value)
144
145
146 class Struct(Node):
147     def __init__(self, name, symbol):
148         Node.__init__(self, name)
149         self.fields = []
150         self.symbol = symbol
151
152
153 class Return(Node):
154     def __init__(self, rtype):
155         Node.__init__(self)
156         self.type = rtype
157         self.transfer = False
158
159     def __repr__(self):
160         return 'Return(%r)' % (self.type,)
161
162
163 class Class(Node):
164     def __init__(self, name, parent):
165         Node.__init__(self, name)
166         self.ctype = name
167         self.parent = parent
168         self.methods = []
169         self.constructors = []
170         self.properties = []
171         self.fields = []
172
173     def __repr__(self):
174         return '%s(%r, %r, %r)' % (
175             self.__class__.__name__,
176             self.name, self.parent, self.methods)
177
178
179 class Interface(Node):
180     def __init__(self, name):
181         Node.__init__(self, name)
182         self.methods = []
183         self.properties = []
184         self.fields = []
185
186     def __repr__(self):
187         return '%s(%r, %r)' % (
188             self.__class__.__name__,
189             self.name, self.methods)
190
191
192 class Constant(Node):
193     def __init__(self, name, type_name, value):
194         Node.__init__(self, name)
195         self.type = Type(type_name)
196         self.value = value
197
198     def __repr__(self):
199         return 'Constant(%r, %r, %r)' % (
200             self.name, self.type, self.value)
201
202
203 class Property(Node):
204     def __init__(self, name, type_name):
205         Node.__init__(self, name)
206         self.type = Type(type_name)
207
208     def __repr__(self):
209         return '%s(%r, %r, %r)' % (
210             self.__class__.__name__,
211             self.name, self.type, self.value)
212
213
214 class Callback(Node):
215     def __init__(self, name, retval, parameters):
216         Node.__init__(self, name)
217         self.retval = retval
218         self.parameters = parameters
219
220     def __repr__(self):
221         return 'Callback(%r, %r, %r)' % (
222             self.name, self.retval, self.parameters)
223
224
225 class Sequence(Type):
226     # Subclass, because a Sequence is a kind of Type
227     def __init__(self, name, element_type):
228         Type.__init__(self, name)
229         self.element_type = element_type
230         self.transfer = False