1038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley/* 2038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * Copyright (C) 2015, The Android Open Source Project 3038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * 4038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * Licensed under the Apache License, Version 2.0 (the "License"); 5038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * you may not use this file except in compliance with the License. 6038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * You may obtain a copy of the License at 7038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * 8038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * http://www.apache.org/licenses/LICENSE-2.0 9038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * 10038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * Unless required by applicable law or agreed to in writing, software 11038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * distributed under the License is distributed on an "AS IS" BASIS, 12038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * See the License for the specific language governing permissions and 14038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * limitations under the License. 15038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley */ 16038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley 17038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley#include "ast_java.h" 18038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley 19fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wiley#include "code_writer.h" 20775fa1f7db4626b85e5185149b054821fc605c2bChristopher Wiley#include "type_java.h" 21fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wiley 2212e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wileyusing std::vector; 2312e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wileyusing std::string; 2412e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley 25fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wileynamespace android { 26fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wileynamespace aidl { 27db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wileynamespace java { 28ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 29ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid WriteModifiers(CodeWriter* to, int mod, int mask) { 30ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley int m = mod & mask; 31ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 32ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (m & OVERRIDE) { 33ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("@Override "); 34ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 35ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 36ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if ((m & SCOPE_MASK) == PUBLIC) { 37ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("public "); 38ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } else if ((m & SCOPE_MASK) == PRIVATE) { 39ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("private "); 40ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } else if ((m & SCOPE_MASK) == PROTECTED) { 41ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("protected "); 42ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 43ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 44ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (m & STATIC) { 45ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("static "); 46ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 47ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 48ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (m & FINAL) { 49ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("final "); 50ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 51ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 52ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (m & ABSTRACT) { 53ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("abstract "); 54ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 55ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 56ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 57ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid WriteArgumentList(CodeWriter* to, const vector<Expression*>& arguments) { 58ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley size_t N = arguments.size(); 59ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley for (size_t i = 0; i < N; i++) { 60ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley arguments[i]->Write(to); 61ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (i != N - 1) { 62ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(", "); 63ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski } 64ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 65ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 66ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 67ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyField::Field(int m, Variable* v) : ClassElement(), modifiers(m), variable(v) {} 68ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 69ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid Field::Write(CodeWriter* to) const { 70ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->comment.length() != 0) { 71ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("%s\n", this->comment.c_str()); 72ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 73ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley WriteModifiers(to, this->modifiers, SCOPE_MASK | STATIC | FINAL | OVERRIDE); 74d21bfee0d45a5eb8ffb09eaae3c6d81f3dd292f7Christopher Wiley to->Write("%s %s", this->variable->type->JavaType().c_str(), 75ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski this->variable->name.c_str()); 76ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->value.length() != 0) { 77ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(" = %s", this->value.c_str()); 78ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 79ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(";\n"); 80ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 81ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 82ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyLiteralExpression::LiteralExpression(const string& v) : value(v) {} 83ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 84ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid LiteralExpression::Write(CodeWriter* to) const { 85ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("%s", this->value.c_str()); 86ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 87ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 88ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyStringLiteralExpression::StringLiteralExpression(const string& v) : value(v) {} 89ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 90ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid StringLiteralExpression::Write(CodeWriter* to) const { 91ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("\"%s\"", this->value.c_str()); 92ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 93ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 948f6816ea1fb532cff9ce0ecc1449926553b4e1daChristopher WileyVariable::Variable(const Type* t, const string& n) 95ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley : type(t), name(n), dimension(0) {} 96ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 978f6816ea1fb532cff9ce0ecc1449926553b4e1daChristopher WileyVariable::Variable(const Type* t, const string& n, int d) 98ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley : type(t), name(n), dimension(d) {} 99ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 100ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid Variable::WriteDeclaration(CodeWriter* to) const { 101ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley string dim; 102ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley for (int i = 0; i < this->dimension; i++) { 103ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley dim += "[]"; 104ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 105d21bfee0d45a5eb8ffb09eaae3c6d81f3dd292f7Christopher Wiley to->Write("%s%s %s", this->type->JavaType().c_str(), dim.c_str(), 106ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski this->name.c_str()); 107ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 108ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 109ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid Variable::Write(CodeWriter* to) const { to->Write("%s", name.c_str()); } 110ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 111ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam LesinskiFieldVariable::FieldVariable(Expression* o, const string& n) 112ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley : object(o), clazz(NULL), name(n) {} 113ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 1148f6816ea1fb532cff9ce0ecc1449926553b4e1daChristopher WileyFieldVariable::FieldVariable(const Type* c, const string& n) 115ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley : object(NULL), clazz(c), name(n) {} 116ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 117ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid FieldVariable::Write(CodeWriter* to) const { 118ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->object != NULL) { 119ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->object->Write(to); 120ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } else if (this->clazz != NULL) { 121d21bfee0d45a5eb8ffb09eaae3c6d81f3dd292f7Christopher Wiley to->Write("%s", this->clazz->JavaType().c_str()); 122ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 123ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(".%s", name.c_str()); 124ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 125ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 126ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid StatementBlock::Write(CodeWriter* to) const { 127ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("{\n"); 128ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley int N = this->statements.size(); 129ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley for (int i = 0; i < N; i++) { 130ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->statements[i]->Write(to); 131ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 132ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("}\n"); 133ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 134ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 135ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid StatementBlock::Add(Statement* statement) { 136ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->statements.push_back(statement); 137ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 138ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 139ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid StatementBlock::Add(Expression* expression) { 140ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->statements.push_back(new ExpressionStatement(expression)); 141ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 142ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 143ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyExpressionStatement::ExpressionStatement(Expression* e) : expression(e) {} 144ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 145ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid ExpressionStatement::Write(CodeWriter* to) const { 146ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->expression->Write(to); 147ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(";\n"); 148ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 149ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 150ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam LesinskiAssignment::Assignment(Variable* l, Expression* r) 151ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley : lvalue(l), rvalue(r), cast(NULL) {} 152ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 1533637a4d41d9dd1669d92127212fb4822a315ab76Christopher WileyAssignment::Assignment(Variable* l, Expression* r, const Type* c) 154ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley : lvalue(l), rvalue(r), cast(c) {} 155ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 156ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid Assignment::Write(CodeWriter* to) const { 157ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->lvalue->Write(to); 158ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(" = "); 159ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->cast != NULL) { 160d21bfee0d45a5eb8ffb09eaae3c6d81f3dd292f7Christopher Wiley to->Write("(%s)", this->cast->JavaType().c_str()); 161ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 162ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->rvalue->Write(to); 163ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 164ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 165ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyMethodCall::MethodCall(const string& n) : name(n) {} 166ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 167ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyMethodCall::MethodCall(const string& n, int argc = 0, ...) : name(n) { 168ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski va_list args; 169ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski va_start(args, argc); 170ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski init(argc, args); 171ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski va_end(args); 172ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 173ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 174ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyMethodCall::MethodCall(Expression* o, const string& n) : obj(o), name(n) {} 175ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 176ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyMethodCall::MethodCall(const Type* t, const string& n) : clazz(t), name(n) {} 177ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 178ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam LesinskiMethodCall::MethodCall(Expression* o, const string& n, int argc = 0, ...) 179ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley : obj(o), name(n) { 180ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski va_list args; 181ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski va_start(args, argc); 182ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski init(argc, args); 183ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski va_end(args); 184ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 185ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 1868f6816ea1fb532cff9ce0ecc1449926553b4e1daChristopher WileyMethodCall::MethodCall(const Type* t, const string& n, int argc = 0, ...) 187ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley : clazz(t), name(n) { 188ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski va_list args; 189ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski va_start(args, argc); 190ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski init(argc, args); 191ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski va_end(args); 192ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 193ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 194ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid MethodCall::init(int n, va_list args) { 195ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley for (int i = 0; i < n; i++) { 196ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* expression = (Expression*)va_arg(args, void*); 197ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->arguments.push_back(expression); 198ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 199ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 200ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 201ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid MethodCall::Write(CodeWriter* to) const { 202ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->obj != NULL) { 203ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->obj->Write(to); 204ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("."); 205ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } else if (this->clazz != NULL) { 206d21bfee0d45a5eb8ffb09eaae3c6d81f3dd292f7Christopher Wiley to->Write("%s.", this->clazz->JavaType().c_str()); 207ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 208ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("%s(", this->name.c_str()); 209ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley WriteArgumentList(to, this->arguments); 210ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(")"); 211ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 212ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 213ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam LesinskiComparison::Comparison(Expression* l, const string& o, Expression* r) 214ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley : lvalue(l), op(o), rvalue(r) {} 215ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 216ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid Comparison::Write(CodeWriter* to) const { 217ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("("); 218ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->lvalue->Write(to); 219ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("%s", this->op.c_str()); 220ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->rvalue->Write(to); 221ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(")"); 222ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 223ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 224ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyNewExpression::NewExpression(const Type* t) : type(t) {} 225ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 226ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyNewExpression::NewExpression(const Type* t, int argc = 0, ...) : type(t) { 227ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski va_list args; 228ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski va_start(args, argc); 229ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski init(argc, args); 230ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski va_end(args); 231ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 232ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 233ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid NewExpression::init(int n, va_list args) { 234ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley for (int i = 0; i < n; i++) { 235ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* expression = (Expression*)va_arg(args, void*); 236ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->arguments.push_back(expression); 237ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 238ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 239ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 240ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid NewExpression::Write(CodeWriter* to) const { 241ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("new %s(", this->type->InstantiableName().c_str()); 242ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley WriteArgumentList(to, this->arguments); 243ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(")"); 244ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 245ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 2468f6816ea1fb532cff9ce0ecc1449926553b4e1daChristopher WileyNewArrayExpression::NewArrayExpression(const Type* t, Expression* s) 247ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley : type(t), size(s) {} 248ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 249ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid NewArrayExpression::Write(CodeWriter* to) const { 250d21bfee0d45a5eb8ffb09eaae3c6d81f3dd292f7Christopher Wiley to->Write("new %s[", this->type->JavaType().c_str()); 251ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley size->Write(to); 252ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("]"); 253ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 254ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 255ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam LesinskiTernary::Ternary(Expression* a, Expression* b, Expression* c) 256ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley : condition(a), ifpart(b), elsepart(c) {} 257ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 258ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid Ternary::Write(CodeWriter* to) const { 259ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("(("); 260ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->condition->Write(to); 261ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(")?("); 262ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->ifpart->Write(to); 263ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("):("); 264ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->elsepart->Write(to); 265ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("))"); 266ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 267ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 268ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyCast::Cast(const Type* t, Expression* e) : type(t), expression(e) {} 269ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 270ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid Cast::Write(CodeWriter* to) const { 271d21bfee0d45a5eb8ffb09eaae3c6d81f3dd292f7Christopher Wiley to->Write("((%s)", this->type->JavaType().c_str()); 272ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley expression->Write(to); 273ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(")"); 274ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 275ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 276ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyVariableDeclaration::VariableDeclaration(Variable* l, Expression* r, 277ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const Type* c) 278ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley : lvalue(l), cast(c), rvalue(r) {} 279ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 280ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyVariableDeclaration::VariableDeclaration(Variable* l) : lvalue(l) {} 281ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 282ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid VariableDeclaration::Write(CodeWriter* to) const { 283ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->lvalue->WriteDeclaration(to); 284ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->rvalue != NULL) { 285ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(" = "); 286ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->cast != NULL) { 287d21bfee0d45a5eb8ffb09eaae3c6d81f3dd292f7Christopher Wiley to->Write("(%s)", this->cast->JavaType().c_str()); 288ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 289ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->rvalue->Write(to); 290ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 291ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(";\n"); 292ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 293ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 294ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid IfStatement::Write(CodeWriter* to) const { 295ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->expression != NULL) { 296ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("if ("); 297ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski this->expression->Write(to); 298ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(") "); 299ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 300ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->statements->Write(to); 301ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->elseif != NULL) { 302ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("else "); 303ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->elseif->Write(to); 304ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 305ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 306ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 307ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyReturnStatement::ReturnStatement(Expression* e) : expression(e) {} 308ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 309ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid ReturnStatement::Write(CodeWriter* to) const { 310ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("return "); 311ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->expression->Write(to); 312ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(";\n"); 313ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley} 314ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 315ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid TryStatement::Write(CodeWriter* to) const { 316ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("try "); 317ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->statements->Write(to); 318ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 319ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 320ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam LesinskiCatchStatement::CatchStatement(Variable* e) 321ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley : statements(new StatementBlock), exception(e) {} 322ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 323ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid CatchStatement::Write(CodeWriter* to) const { 324ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("catch "); 325ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->exception != NULL) { 326ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("("); 327ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->exception->WriteDeclaration(to); 328ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(") "); 329ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 330ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->statements->Write(to); 331ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 332ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 333ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid FinallyStatement::Write(CodeWriter* to) const { 334ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("finally "); 335ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->statements->Write(to); 336ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 337ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 338ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileyCase::Case(const string& c) { cases.push_back(c); } 339ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 340ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid Case::Write(CodeWriter* to) const { 341ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley int N = this->cases.size(); 342ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (N > 0) { 343ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley for (int i = 0; i < N; i++) { 344ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley string s = this->cases[i]; 345ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (s.length() != 0) { 346ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("case %s:\n", s.c_str()); 347ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } else { 348fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wiley to->Write("default:\n"); 349ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 350ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski } 351ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } else { 352ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("default:\n"); 353ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 354ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley statements->Write(to); 355ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 356ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 357ae58997526a9cd817508366471d6fcf03b1993c4Christopher WileySwitchStatement::SwitchStatement(Expression* e) : expression(e) {} 358ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 359ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid SwitchStatement::Write(CodeWriter* to) const { 360ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("switch ("); 361ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->expression->Write(to); 362ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(")\n{\n"); 363ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley int N = this->cases.size(); 364ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley for (int i = 0; i < N; i++) { 365ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->cases[i]->Write(to); 366ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 367ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("}\n"); 368ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 369ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 370ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid Break::Write(CodeWriter* to) const { to->Write("break;\n"); } 371ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 372ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid Method::Write(CodeWriter* to) const { 373ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley size_t N, i; 374ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 375ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->comment.length() != 0) { 376ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("%s\n", this->comment.c_str()); 377ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 378ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 379ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley WriteModifiers(to, this->modifiers, 380ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley SCOPE_MASK | STATIC | ABSTRACT | FINAL | OVERRIDE); 381ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 382ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->returnType != NULL) { 383ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley string dim; 384ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley for (i = 0; i < this->returnTypeDimension; i++) { 385ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley dim += "[]"; 386ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski } 387d21bfee0d45a5eb8ffb09eaae3c6d81f3dd292f7Christopher Wiley to->Write("%s%s ", this->returnType->JavaType().c_str(), dim.c_str()); 388ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 389ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 390ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("%s(", this->name.c_str()); 391ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 392ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley N = this->parameters.size(); 393ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley for (i = 0; i < N; i++) { 394ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->parameters[i]->WriteDeclaration(to); 395ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (i != N - 1) { 396ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(", "); 397ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski } 398ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 399ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 400ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(")"); 401ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 402ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley N = this->exceptions.size(); 403ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley for (i = 0; i < N; i++) { 404ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (i == 0) { 405ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(" throws "); 406ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski } else { 407ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(", "); 408ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski } 409d21bfee0d45a5eb8ffb09eaae3c6d81f3dd292f7Christopher Wiley to->Write("%s", this->exceptions[i]->JavaType().c_str()); 410ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 411ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 412ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->statements == NULL) { 413ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(";\n"); 414ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } else { 415ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("\n"); 416ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->statements->Write(to); 417ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 418ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 419ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 420ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid Constant::Write(CodeWriter* to) const { 421ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley WriteModifiers(to, STATIC | FINAL | PUBLIC, ALL_MODIFIERS); 422ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("int %s = %d;\n", name.c_str(), value); 423d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin} 424d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin 425ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileyvoid Class::Write(CodeWriter* to) const { 426ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley size_t N, i; 427ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 428ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->comment.length() != 0) { 429ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("%s\n", this->comment.c_str()); 430ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 431ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 432ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley WriteModifiers(to, this->modifiers, ALL_MODIFIERS); 433ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 434ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->what == Class::CLASS) { 435ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("class "); 436ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } else { 437ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("interface "); 438ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 439ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 440d21bfee0d45a5eb8ffb09eaae3c6d81f3dd292f7Christopher Wiley string name = this->type->JavaType(); 441ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley size_t pos = name.rfind('.'); 442ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (pos != string::npos) { 443ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley name = name.c_str() + pos + 1; 444ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 445ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 446ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("%s", name.c_str()); 447ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 448ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->extends != NULL) { 449d21bfee0d45a5eb8ffb09eaae3c6d81f3dd292f7Christopher Wiley to->Write(" extends %s", this->extends->JavaType().c_str()); 450ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 451ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 452ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley N = this->interfaces.size(); 453ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (N != 0) { 454ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (this->what == Class::CLASS) { 455ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(" implements"); 456ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } else { 457ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write(" extends"); 458ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski } 459ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley for (i = 0; i < N; i++) { 460d21bfee0d45a5eb8ffb09eaae3c6d81f3dd292f7Christopher Wiley to->Write(" %s", this->interfaces[i]->JavaType().c_str()); 461ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski } 462ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 463ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 464ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("\n"); 465ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("{\n"); 466ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 467ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley N = this->elements.size(); 468ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley for (i = 0; i < N; i++) { 469ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley this->elements[i]->Write(to); 470ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 471ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 472ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write("}\n"); 473ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 474ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 475ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystatic string escape_backslashes(const string& str) { 476ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley string result; 477ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const size_t I = str.length(); 478ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley for (size_t i = 0; i < I; i++) { 479ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley char c = str[i]; 480ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley if (c == '\\') { 481ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley result += "\\\\"; 482ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } else { 483ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley result += c; 484ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 485ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 486ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley return result; 487ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley} 488ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 489f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher WileyDocument::Document(const std::string& comment, 490f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley const std::string& package, 491f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley const std::string& original_src, 492f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley std::unique_ptr<Class> clazz) 493f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley : comment_(comment), 494f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley package_(package), 495f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley original_src_(original_src), 496f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley clazz_(std::move(clazz)) { 497f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley} 498ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 499f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wileyvoid Document::Write(CodeWriter* to) const { 500f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley if (!comment_.empty()) { 501f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley to->Write("%s\n", comment_.c_str()); 502ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 503ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley to->Write( 504ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley "/*\n" 505ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley " * This file is auto-generated. DO NOT MODIFY.\n" 506ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley " * Original file: %s\n" 507ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley " */\n", 508f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley escape_backslashes(original_src_).c_str()); 509f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley if (!package_.empty()) { 510f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley to->Write("package %s;\n", package_.c_str()); 511ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 512ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 513f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley if (clazz_) { 514f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley clazz_->Write(to); 515ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley } 516ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski} 517ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 518db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wiley} // namespace java 519fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wiley} // namespace aidl 520fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wiley} // namespace android 521