Introduce a namespace ast node
[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
81 class Namespace(Node):
82     def __init__(self, name):
83         Node.__init__(self, name)
84         self.nodes = []
85
86
87 class Function(Node):
88     def __init__(self, name, retval, parameters, symbol):
89         Node.__init__(self, name)
90         self.retval = retval
91         self.parameters = parameters
92         self.symbol = symbol
93
94     def __repr__(self):
95         return '%s(%r, %r, %r)' % (self.__class__.__name__,
96                                    self.name, self.retval,
97                                    self.parameters)
98
99
100 class VFunction(Function):
101     pass
102
103
104 class Type(Node):
105     def __init__(self, name):
106         Node.__init__(self, name)
107         self.ctype = name
108
109     def __repr__(self):
110         return 'Type(%r)' % (self.name,)
111
112
113 class Parameter(Node):
114     def __init__(self, name, typenode):
115         Node.__init__(self, name)
116         self.type = typenode
117         self.direction = PARAM_DIRECTION_IN
118         self.transfer = False
119
120     def __repr__(self):
121         return 'Parameter(%r, %r)' % (self.name, self.type)
122
123
124 class Enum(Node):
125     def __init__(self, name, members):
126         Node.__init__(self, name)
127         self.members = members
128         self.ctype = name
129
130     def __repr__(self):
131         return 'Enum(%r, %r)' % (self.name, self.members)
132
133
134 class Member(Node):
135     def __init__(self, name, value):
136         Node.__init__(self, name)
137         self.value = value
138
139     def __repr__(self):
140         return 'Member(%r, %r)' % (self.name, self.value)
141
142
143 class Struct(Node):
144     def __init__(self, name, symbol):
145         Node.__init__(self, name)
146         self.fields = []
147         self.symbol = symbol
148
149     def __repr__(self):
150         return 'Struct(%r)' % (self.name,)
151
152
153 class Return(Node):
154     def __init__(self, type_name):
155         Node.__init__(self)
156         self.type = Type(type_name)
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