Allow parenthesis in annotations
[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  02110-1301, USA.
18 #
19
20
21 class Node(object):
22     def __init__(self, name=None):
23         self.name = name
24
25
26 class Function(Node):
27     def __init__(self, name, retval, parameters, symbol):
28         Node.__init__(self, name)
29         self.retval = retval
30         self.parameters = parameters
31         self.symbol = symbol
32
33     def __repr__(self):
34         return '%s(%r, %r, %r)' % (self.__class__.__name__,
35                                    self.name, self.retval,
36                                    self.parameters)
37
38
39 class VFunction(Function):
40     pass
41
42
43 class Type(Node):
44     def __init__(self, name):
45         Node.__init__(self, name)
46
47     def __repr__(self):
48         return 'Type(%r)' % (self.name,)
49
50
51 class Parameter(Node):
52     def __init__(self, name, type_name):
53         Node.__init__(self, name)
54         self.type = Type(type_name)
55         self.direction = 'in'
56         self.transfer = 'none'
57
58     def __repr__(self):
59         return 'Parameter(%r, %r)' % (self.name, self.type)
60
61
62 class Enum(Node):
63     def __init__(self, name, members):
64         Node.__init__(self, name)
65         self.members = members
66
67     def __repr__(self):
68         return 'Enum(%r, %r)' % (self.name, self.members)
69
70
71 class Member(Node):
72     def __init__(self, name, value):
73         Node.__init__(self, name)
74         self.value = value
75
76     def __repr__(self):
77         return 'Member(%r, %r)' % (self.name, self.value)
78
79
80 class Struct(Node):
81     def __init__(self, name):
82         Node.__init__(self, name)
83         self.fields = []
84
85     def __repr__(self):
86         return 'Struct(%r)' % (self.name,)
87
88
89 class Return(Node):
90     def __init__(self, type_name):
91         Node.__init__(self)
92         self.type = Type(type_name)
93         self.transfer = 'none'
94         self.ctype = self.type
95
96     def __repr__(self):
97         return 'Return(%r)' % (self.type,)
98
99
100 class Class(Node):
101     def __init__(self, name, parent):
102         Node.__init__(self, name)
103         self.parent = parent
104         self.methods = []
105         self.constructors = []
106         self.properties = []
107         self.fields = []
108
109     def __repr__(self):
110         return '%s(%r, %r, %r)' % (
111             self.__class__.__name__,
112             self.name, self.parent, self.methods)
113
114
115 class Interface(Node):
116     def __init__(self, name):
117         Node.__init__(self, name)
118         self.methods = []
119         self.properties = []
120         self.fields = []
121
122     def __repr__(self):
123         return '%s(%r, %r)' % (
124             self.__class__.__name__,
125             self.name, self.methods)
126
127
128 class Constant(Node):
129     def __init__(self, name, type_name, value):
130         Node.__init__(self, name)
131         self.type = Type(type_name)
132         self.value = value
133
134     def __repr__(self):
135         return 'Constant(%r, %r, %r)' % (
136             self.name, self.type, self.value)
137
138
139 class Property(Node):
140     def __init__(self, name, type_name):
141         Node.__init__(self, name)
142         self.type = Type(type_name)
143
144     def __repr__(self):
145         return '%s(%r, %r, %r)' % (
146             self.__class__.__name__,
147             self.name, self.type, self.value)
148
149
150 class Callback(Node):
151     def __init__(self, name, retval, parameters):
152         Node.__init__(self, name)
153         self.retval = retval
154         self.parameters = parameters
155
156     def __repr__(self):
157         return 'Callback(%r, %r, %r)' % (
158             self.name, self.retval, self.parameters)
159
160
161 class Sequence(Type):
162     # Subclass, because a Sequence is a kind of Type
163     def __init__(self, name, element_type):
164         Type.__init__(self, name)
165         self.element_type = element_type