]> git.tdb.fi Git - libs/gl.git/blob - source/programsyntax.cpp
Overhaul assignment tracking to work properly with conditionals
[libs/gl.git] / source / programsyntax.cpp
1 #include "programsyntax.h"
2
3 using namespace std;
4
5 namespace Msp {
6 namespace GL {
7 namespace ProgramSyntax {
8
9 Block::Block():
10         use_braces(false)
11 { }
12
13 void Block::visit(NodeVisitor &visitor)
14 {
15         visitor.visit(*this);
16 }
17
18
19 void Literal::visit(NodeVisitor &visitor)
20 {
21         visitor.visit(*this);
22 }
23
24
25 void ParenthesizedExpression::visit(NodeVisitor &visitor)
26 {
27         visitor.visit(*this);
28 }
29
30
31 VariableReference::VariableReference():
32         declaration(0)
33 { }
34
35 void VariableReference::visit(NodeVisitor &visitor)
36 {
37         visitor.visit(*this);
38 }
39
40
41 void MemberAccess::visit(NodeVisitor &visitor)
42 {
43         visitor.visit(*this);
44 }
45
46
47 UnaryExpression::UnaryExpression():
48         prefix(true)
49 { }
50
51 void UnaryExpression::visit(NodeVisitor &visitor)
52 {
53         visitor.visit(*this);
54 }
55
56
57 void BinaryExpression::visit(NodeVisitor &visitor)
58 {
59         visitor.visit(*this);
60 }
61
62
63 Assignment::Assignment():
64         self_referencing(false),
65         target_declaration(0)
66 { }
67
68 void Assignment::visit(NodeVisitor &visitor)
69 {
70         visitor.visit(*this);
71 }
72
73
74 FunctionCall::FunctionCall():
75         constructor(false)
76 { }
77
78 void FunctionCall::visit(NodeVisitor &visitor)
79 {
80         visitor.visit(*this);
81 }
82
83
84 void ExpressionStatement::visit(NodeVisitor &visitor)
85 {
86         visitor.visit(*this);
87 }
88
89
90 void Layout::visit(NodeVisitor &visitor)
91 {
92         visitor.visit(*this);
93 }
94
95
96 StructDeclaration::StructDeclaration()
97 {
98         members.use_braces = true;
99 }
100
101 void StructDeclaration::visit(NodeVisitor &visitor)
102 {
103         visitor.visit(*this);
104 }
105
106
107 VariableDeclaration::VariableDeclaration():
108         constant(false),
109         type_declaration(0),
110         array(false),
111         linked_declaration(0)
112 { }
113
114 void VariableDeclaration::visit(NodeVisitor &visitor)
115 {
116         visitor.visit(*this);
117 }
118
119
120 InterfaceBlock::InterfaceBlock():
121         array(false)
122 {
123         members.use_braces = true;
124 }
125
126 void InterfaceBlock::visit(NodeVisitor &visitor)
127 {
128         visitor.visit(*this);
129 }
130
131
132 FunctionDeclaration::FunctionDeclaration():
133         definition(false)
134 { }
135
136 void FunctionDeclaration::visit(NodeVisitor &visitor)
137 {
138         visitor.visit(*this);
139 }
140
141
142 void Conditional::visit(NodeVisitor &visitor)
143 {
144         visitor.visit(*this);
145 }
146
147
148 void Iteration::visit(NodeVisitor &visitor)
149 {
150         visitor.visit(*this);
151 }
152
153
154 void Passthrough::visit(NodeVisitor &visitor)
155 {
156         visitor.visit(*this);
157 }
158
159
160 void Return::visit(NodeVisitor &visitor)
161 {
162         visitor.visit(*this);
163 }
164
165
166 void NodeVisitor::visit(Assignment &assign)
167 {
168         visit(static_cast<BinaryExpression &>(assign));
169 }
170
171
172 void TraversingVisitor::visit(Block &block)
173 {
174         for(list<NodePtr<Node> >::iterator i=block.body.begin(); i!=block.body.end(); ++i)
175                 (*i)->visit(*this);
176 }
177
178 void TraversingVisitor::visit(ParenthesizedExpression &parexpr)
179 {
180         parexpr.expression->visit(*this);
181 }
182
183 void TraversingVisitor::visit(MemberAccess &memacc)
184 {
185         memacc.left->visit(*this);
186 }
187
188 void TraversingVisitor::visit(UnaryExpression &unary)
189 {
190         unary.expression->visit(*this);
191 }
192
193 void TraversingVisitor::visit(BinaryExpression &binary)
194 {
195         binary.left->visit(*this);
196         binary.right->visit(*this);
197 }
198
199 void TraversingVisitor::visit(FunctionCall &call)
200 {
201         for(vector<NodePtr<Expression> >::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i)
202                 (*i)->visit(*this);
203 }
204
205 void TraversingVisitor::visit(ExpressionStatement &expr)
206 {
207         expr.expression->visit(*this);
208 }
209
210 void TraversingVisitor::visit(StructDeclaration &strct)
211 {
212         strct.members.visit(*this);
213 }
214
215 void TraversingVisitor::visit(VariableDeclaration &var)
216 {
217         if(var.init_expression)
218                 var.init_expression->visit(*this);
219         if(var.array_size)
220                 var.array_size->visit(*this);
221 }
222
223 void TraversingVisitor::visit(InterfaceBlock &iface)
224 {
225         iface.members.visit(*this);
226 }
227
228 void TraversingVisitor::visit(FunctionDeclaration &func)
229 {
230         for(vector<NodePtr<VariableDeclaration> >::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i)
231                 (*i)->visit(*this);
232         func.body.visit(*this);
233 }
234
235 void TraversingVisitor::visit(Conditional &cond)
236 {
237         cond.condition->visit(*this);
238         cond.body.visit(*this);
239         cond.else_body.visit(*this);
240 }
241
242 void TraversingVisitor::visit(Iteration &iter)
243 {
244         iter.init_statement->visit(*this);
245         if(iter.condition)
246                 iter.condition->visit(*this);
247         if(iter.loop_expression)
248                 iter.loop_expression->visit(*this);
249         iter.body.visit(*this);
250 }
251
252 void TraversingVisitor::visit(Passthrough &pass)
253 {
254         if(pass.subscript)
255                 pass.subscript->visit(*this);
256 }
257
258 void TraversingVisitor::visit(Return &ret)
259 {
260         if(ret.expression)
261                 ret.expression->visit(*this);
262 }
263
264
265 Stage::Stage(StageType t):
266         type(t),
267         previous(0)
268 { }
269
270
271 Module::Module():
272         shared(SHARED)
273 { }
274
275 } // namespace ProgramSyntax
276 } // namespace GL
277 } // namespace Msp