1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "AST.h"
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "Type.h"
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiWriteModifiers(FILE* to, int mod, int mask)
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int m = mod & mask;
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (m & OVERRIDE) {
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "@Override ");
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if ((m & SCOPE_MASK) == PUBLIC) {
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "public ");
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    else if ((m & SCOPE_MASK) == PRIVATE) {
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "private ");
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    else if ((m & SCOPE_MASK) == PROTECTED) {
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "protected ");
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (m & STATIC) {
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "static ");
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (m & FINAL) {
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "final ");
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (m & ABSTRACT) {
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "abstract ");
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiWriteArgumentList(FILE* to, const vector<Expression*>& arguments)
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t N = arguments.size();
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<N; i++) {
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        arguments[i]->Write(to);
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (i != N-1) {
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(to, ", ");
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiClassElement::ClassElement()
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiClassElement::~ClassElement()
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiField::Field()
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :ClassElement(),
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     modifiers(0),
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     variable(NULL)
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiField::Field(int m, Variable* v)
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :ClassElement(),
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     modifiers(m),
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     variable(v)
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiField::~Field()
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiField::GatherTypes(set<Type*>* types) const
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    types->insert(this->variable->type);
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiField::Write(FILE* to)
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->comment.length() != 0) {
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "%s\n", this->comment.c_str());
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    WriteModifiers(to, this->modifiers, SCOPE_MASK | STATIC | FINAL | OVERRIDE);
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "%s %s", this->variable->type->QualifiedName().c_str(),
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            this->variable->name.c_str());
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->value.length() != 0) {
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, " = %s", this->value.c_str());
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, ";\n");
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiExpression::~Expression()
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiLiteralExpression::LiteralExpression(const string& v)
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :value(v)
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiLiteralExpression::~LiteralExpression()
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiLiteralExpression::Write(FILE* to)
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "%s", this->value.c_str());
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiStringLiteralExpression::StringLiteralExpression(const string& v)
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :value(v)
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiStringLiteralExpression::~StringLiteralExpression()
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiStringLiteralExpression::Write(FILE* to)
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "\"%s\"", this->value.c_str());
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiVariable::Variable()
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :type(NULL),
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     name(),
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     dimension(0)
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiVariable::Variable(Type* t, const string& n)
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :type(t),
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     name(n),
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     dimension(0)
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiVariable::Variable(Type* t, const string& n, int d)
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :type(t),
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     name(n),
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     dimension(d)
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiVariable::~Variable()
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiVariable::GatherTypes(set<Type*>* types) const
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    types->insert(this->type);
158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
161282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiVariable::WriteDeclaration(FILE* to)
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string dim;
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (int i=0; i<this->dimension; i++) {
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        dim += "[]";
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "%s%s %s", this->type->QualifiedName().c_str(), dim.c_str(),
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            this->name.c_str());
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiVariable::Write(FILE* to)
173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "%s", name.c_str());
175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
177282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiFieldVariable::FieldVariable(Expression* o, const string& n)
178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :object(o),
179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     clazz(NULL),
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     name(n)
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiFieldVariable::FieldVariable(Type* c, const string& n)
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :object(NULL),
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     clazz(c),
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     name(n)
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiFieldVariable::~FieldVariable()
192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
196282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiFieldVariable::Write(FILE* to)
197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->object != NULL) {
199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->object->Write(to);
200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    else if (this->clazz != NULL) {
202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "%s", this->clazz->QualifiedName().c_str());
203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, ".%s", name.c_str());
205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
208282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiStatement::~Statement()
209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
212282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiStatementBlock::StatementBlock()
213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
216282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiStatementBlock::~StatementBlock()
217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
221282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiStatementBlock::Write(FILE* to)
222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "{\n");
224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int N = this->statements.size();
225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (int i=0; i<N; i++) {
226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->statements[i]->Write(to);
227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "}\n");
229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
232282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiStatementBlock::Add(Statement* statement)
233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->statements.push_back(statement);
235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
238282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiStatementBlock::Add(Expression* expression)
239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->statements.push_back(new ExpressionStatement(expression));
241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
243282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiExpressionStatement::ExpressionStatement(Expression* e)
244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :expression(e)
245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
248282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiExpressionStatement::~ExpressionStatement()
249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
253282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiExpressionStatement::Write(FILE* to)
254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->expression->Write(to);
256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, ";\n");
257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
259282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAssignment::Assignment(Variable* l, Expression* r)
260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :lvalue(l),
261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     rvalue(r),
262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     cast(NULL)
263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
266282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAssignment::Assignment(Variable* l, Expression* r, Type* c)
267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :lvalue(l),
268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     rvalue(r),
269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     cast(c)
270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
273282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAssignment::~Assignment()
274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
278282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAssignment::Write(FILE* to)
279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->lvalue->Write(to);
281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, " = ");
282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->cast != NULL) {
283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "(%s)", this->cast->QualifiedName().c_str());
284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->rvalue->Write(to);
286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
288282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMethodCall::MethodCall(const string& n)
289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :obj(NULL),
290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     clazz(NULL),
291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     name(n)
292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
295282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMethodCall::MethodCall(const string& n, int argc = 0, ...)
296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :obj(NULL),
297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     clazz(NULL),
298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     name(n)
299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  va_list args;
301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  va_start(args, argc);
302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  init(argc, args);
303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  va_end(args);
304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
306282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMethodCall::MethodCall(Expression* o, const string& n)
307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :obj(o),
308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     clazz(NULL),
309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     name(n)
310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
313282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMethodCall::MethodCall(Type* t, const string& n)
314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :obj(NULL),
315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     clazz(t),
316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     name(n)
317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
320282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMethodCall::MethodCall(Expression* o, const string& n, int argc = 0, ...)
321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :obj(o),
322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     clazz(NULL),
323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     name(n)
324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  va_list args;
326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  va_start(args, argc);
327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  init(argc, args);
328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  va_end(args);
329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
331282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMethodCall::MethodCall(Type* t, const string& n, int argc = 0, ...)
332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :obj(NULL),
333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     clazz(t),
334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     name(n)
335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  va_list args;
337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  va_start(args, argc);
338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  init(argc, args);
339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  va_end(args);
340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
342282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMethodCall::~MethodCall()
343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
347282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMethodCall::init(int n, va_list args)
348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (int i=0; i<n; i++) {
350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Expression* expression = (Expression*)va_arg(args, void*);
351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->arguments.push_back(expression);
352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
356282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMethodCall::Write(FILE* to)
357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->obj != NULL) {
359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->obj->Write(to);
360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, ".");
361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    else if (this->clazz != NULL) {
363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "%s.", this->clazz->QualifiedName().c_str());
364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "%s(", this->name.c_str());
366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    WriteArgumentList(to, this->arguments);
367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, ")");
368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
370282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiComparison::Comparison(Expression* l, const string& o, Expression* r)
371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :lvalue(l),
372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     op(o),
373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     rvalue(r)
374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
377282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiComparison::~Comparison()
378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
382282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiComparison::Write(FILE* to)
383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "(");
385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->lvalue->Write(to);
386282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "%s", this->op.c_str());
387282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->rvalue->Write(to);
388282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, ")");
389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
391282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiNewExpression::NewExpression(Type* t)
392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :type(t)
393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
396282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiNewExpression::NewExpression(Type* t, int argc = 0, ...)
397282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :type(t)
398282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
399282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  va_list args;
400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  va_start(args, argc);
401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  init(argc, args);
402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  va_end(args);
403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
405282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiNewExpression::~NewExpression()
406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
410282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiNewExpression::init(int n, va_list args)
411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (int i=0; i<n; i++) {
413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Expression* expression = (Expression*)va_arg(args, void*);
414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->arguments.push_back(expression);
415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
419282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiNewExpression::Write(FILE* to)
420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "new %s(", this->type->InstantiableName().c_str());
422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    WriteArgumentList(to, this->arguments);
423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, ")");
424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
426282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiNewArrayExpression::NewArrayExpression(Type* t, Expression* s)
427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :type(t),
428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     size(s)
429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
432282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiNewArrayExpression::~NewArrayExpression()
433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
437282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiNewArrayExpression::Write(FILE* to)
438282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
439282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "new %s[", this->type->QualifiedName().c_str());
440282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size->Write(to);
441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "]");
442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
444282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiTernary::Ternary()
445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :condition(NULL),
446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     ifpart(NULL),
447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     elsepart(NULL)
448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
451282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiTernary::Ternary(Expression* a, Expression* b, Expression* c)
452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :condition(a),
453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     ifpart(b),
454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     elsepart(c)
455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
458282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiTernary::~Ternary()
459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
463282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiTernary::Write(FILE* to)
464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "((");
466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->condition->Write(to);
467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, ")?(");
468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->ifpart->Write(to);
469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "):(");
470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->elsepart->Write(to);
471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "))");
472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
474282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiCast::Cast()
475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :type(NULL),
476282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     expression(NULL)
477282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
478282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
479282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
480282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiCast::Cast(Type* t, Expression* e)
481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :type(t),
482282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     expression(e)
483282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
485282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
486282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiCast::~Cast()
487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
488282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
489282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
491282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiCast::Write(FILE* to)
492282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
493282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "((%s)", this->type->QualifiedName().c_str());
494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    expression->Write(to);
495282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, ")");
496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
497282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
498282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiVariableDeclaration::VariableDeclaration(Variable* l, Expression* r, Type* c)
499282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :lvalue(l),
500282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     cast(c),
501282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     rvalue(r)
502282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
503282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
504282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
505282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiVariableDeclaration::VariableDeclaration(Variable* l)
506282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :lvalue(l),
507282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     cast(NULL),
508282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     rvalue(NULL)
509282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
510282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
511282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
512282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiVariableDeclaration::~VariableDeclaration()
513282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
514282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
517282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiVariableDeclaration::Write(FILE* to)
518282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
519282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->lvalue->WriteDeclaration(to);
520282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->rvalue != NULL) {
521282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, " = ");
522282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (this->cast != NULL) {
523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(to, "(%s)", this->cast->QualifiedName().c_str());
524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->rvalue->Write(to);
526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
527282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, ";\n");
528282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
529282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
530282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiIfStatement::IfStatement()
531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :expression(NULL),
532282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     statements(new StatementBlock),
533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     elseif(NULL)
534282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
535282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
536282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
537282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiIfStatement::~IfStatement()
538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
541282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
542282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiIfStatement::Write(FILE* to)
543282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
544282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->expression != NULL) {
545282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "if (");
546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->expression->Write(to);
547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, ") ");
548282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
549282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->statements->Write(to);
550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->elseif != NULL) {
551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "else ");
552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->elseif->Write(to);
553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
555282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
556282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiReturnStatement::ReturnStatement(Expression* e)
557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :expression(e)
558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
560282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
561282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiReturnStatement::~ReturnStatement()
562282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
563282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
564282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
565282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
566282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiReturnStatement::Write(FILE* to)
567282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
568282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "return ");
569282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->expression->Write(to);
570282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, ";\n");
571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
572282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
573282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiTryStatement::TryStatement()
574282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :statements(new StatementBlock)
575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
576282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
577282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
578282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiTryStatement::~TryStatement()
579282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
580282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
581282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
582282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
583282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiTryStatement::Write(FILE* to)
584282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
585282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "try ");
586282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->statements->Write(to);
587282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
588282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
589282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiCatchStatement::CatchStatement(Variable* e)
590282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :statements(new StatementBlock),
591282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     exception(e)
592282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
593282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
594282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
595282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiCatchStatement::~CatchStatement()
596282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
597282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
598282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
599282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
600282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiCatchStatement::Write(FILE* to)
601282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
602282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "catch ");
603282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->exception != NULL) {
604282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "(");
605282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->exception->WriteDeclaration(to);
606282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, ") ");
607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
608282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->statements->Write(to);
609282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
610282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
611282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiFinallyStatement::FinallyStatement()
612282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :statements(new StatementBlock)
613282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
614282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
615282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
616282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiFinallyStatement::~FinallyStatement()
617282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
618282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
619282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
620282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
621282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiFinallyStatement::Write(FILE* to)
622282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
623282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "finally ");
624282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->statements->Write(to);
625282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
626282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
627282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiCase::Case()
628282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :statements(new StatementBlock)
629282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
630282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
631282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
632282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiCase::Case(const string& c)
633282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :statements(new StatementBlock)
634282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
635282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    cases.push_back(c);
636282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
637282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
638282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiCase::~Case()
639282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
640282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
641282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
642282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
643282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiCase::Write(FILE* to)
644282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
645282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int N = this->cases.size();
646282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (N > 0) {
647282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (int i=0; i<N; i++) {
648282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            string s = this->cases[i];
649282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (s.length() != 0) {
650282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                fprintf(to, "case %s:\n", s.c_str());
651282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
652282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                fprintf(to, "default:\n");
653282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
654282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
655282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
656282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "default:\n");
657282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
658282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    statements->Write(to);
659282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
660282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
661282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiSwitchStatement::SwitchStatement(Expression* e)
662282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :expression(e)
663282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
664282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
665282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
666282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiSwitchStatement::~SwitchStatement()
667282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
668282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
669282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
670282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
671282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiSwitchStatement::Write(FILE* to)
672282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
673282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "switch (");
674282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->expression->Write(to);
675282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, ")\n{\n");
676282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int N = this->cases.size();
677282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (int i=0; i<N; i++) {
678282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->cases[i]->Write(to);
679282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
680282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "}\n");
681282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
682282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
683282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiBreak::Break()
684282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
685282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
686282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
687282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiBreak::~Break()
688282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
689282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
690282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
691282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
692282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiBreak::Write(FILE* to)
693282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
694282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "break;\n");
695282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
696282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
697282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMethod::Method()
698282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :ClassElement(),
699282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     modifiers(0),
700282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     returnType(NULL), // (NULL means constructor)
701282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     returnTypeDimension(0),
702282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     statements(NULL)
703282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
704282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
705282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
706282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMethod::~Method()
707282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
708282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
709282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
710282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
711282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMethod::GatherTypes(set<Type*>* types) const
712282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
713282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t N, i;
714282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
715282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->returnType) {
716282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        types->insert(this->returnType);
717282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
718282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
719282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    N = this->parameters.size();
720282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<N; i++) {
721282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->parameters[i]->GatherTypes(types);
722282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
723282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
724282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    N = this->exceptions.size();
725282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<N; i++) {
726282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        types->insert(this->exceptions[i]);
727282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
728282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
729282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
730282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
731282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMethod::Write(FILE* to)
732282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
733282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t N, i;
734282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
735282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->comment.length() != 0) {
736282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "%s\n", this->comment.c_str());
737282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
738282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
739282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    WriteModifiers(to, this->modifiers, SCOPE_MASK | STATIC | ABSTRACT | FINAL | OVERRIDE);
740282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
741282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->returnType != NULL) {
742282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        string dim;
743282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (i=0; i<this->returnTypeDimension; i++) {
744282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            dim += "[]";
745282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
746282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "%s%s ", this->returnType->QualifiedName().c_str(),
747282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                dim.c_str());
748282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
749282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
750282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "%s(", this->name.c_str());
751282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
752282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    N = this->parameters.size();
753282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<N; i++) {
754282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->parameters[i]->WriteDeclaration(to);
755282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (i != N-1) {
756282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(to, ", ");
757282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
758282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
759282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
760282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, ")");
761282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
762282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    N = this->exceptions.size();
763282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<N; i++) {
764282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (i == 0) {
765282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(to, " throws ");
766282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
767282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(to, ", ");
768282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
769282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "%s", this->exceptions[i]->QualifiedName().c_str());
770282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
771282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
772282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->statements == NULL) {
773282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, ";\n");
774282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
775282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "\n");
776282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->statements->Write(to);
777282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
778282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
779282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
780282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiClass::Class()
781282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    :modifiers(0),
782282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     what(CLASS),
783282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     type(NULL),
784282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     extends(NULL)
785282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
786282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
787282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
788282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiClass::~Class()
789282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
790282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
791282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
792282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
793282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiClass::GatherTypes(set<Type*>* types) const
794282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
795282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int N, i;
796282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
797282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    types->insert(this->type);
798282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->extends != NULL) {
799282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        types->insert(this->extends);
800282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
801282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
802282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    N = this->interfaces.size();
803282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<N; i++) {
804282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        types->insert(this->interfaces[i]);
805282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
806282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
807282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    N = this->elements.size();
808282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<N; i++) {
809282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->elements[i]->GatherTypes(types);
810282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
811282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
812282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
813282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
814282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiClass::Write(FILE* to)
815282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
816282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t N, i;
817282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
818282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->comment.length() != 0) {
819282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "%s\n", this->comment.c_str());
820282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
821282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
822282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    WriteModifiers(to, this->modifiers, ALL_MODIFIERS);
823282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
824282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->what == Class::CLASS) {
825282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "class ");
826282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
827282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "interface ");
828282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
829282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
830282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string name = this->type->Name();
831282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t pos = name.rfind('.');
832282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (pos != string::npos) {
833282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        name = name.c_str() + pos + 1;
834282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
835282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
836282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "%s", name.c_str());
837282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
838282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->extends != NULL) {
839282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, " extends %s", this->extends->QualifiedName().c_str());
840282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
841282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
842282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    N = this->interfaces.size();
843282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (N != 0) {
844282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (this->what == Class::CLASS) {
845282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(to, " implements");
846282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
847282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(to, " extends");
848282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
849282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (i=0; i<N; i++) {
850282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(to, " %s", this->interfaces[i]->QualifiedName().c_str());
851282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
852282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
853282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
854282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "\n");
855282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "{\n");
856282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
857282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    N = this->elements.size();
858282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<N; i++) {
859282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->elements[i]->Write(to);
860282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
861282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
862282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "}\n");
863282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
864282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
865282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
866282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiDocument::Document()
867282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
868282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
869282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
870282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiDocument::~Document()
871282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
872282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
873282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
874282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic string
875282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiescape_backslashes(const string& str)
876282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
877282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string result;
878282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t I=str.length();
879282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<I; i++) {
880282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        char c = str[i];
881282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (c == '\\') {
882282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            result += "\\\\";
883282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
884282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            result += c;
885282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
886282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
887282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return result;
888282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
889282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
890282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
891282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiDocument::Write(FILE* to)
892282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
893282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t N, i;
894282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
895282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->comment.length() != 0) {
896282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "%s\n", this->comment.c_str());
897282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
898282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(to, "/*\n"
899282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                " * This file is auto-generated.  DO NOT MODIFY.\n"
900282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                " * Original file: %s\n"
901282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                " */\n", escape_backslashes(this->originalSrc).c_str());
902282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->package.length() != 0) {
903282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(to, "package %s;\n", this->package.c_str());
904282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
905282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
906282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    N = this->classes.size();
907282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<N; i++) {
908282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Class* c = this->classes[i];
909282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        c->Write(to);
910282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
911282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
912282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
913