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