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