blob: d51c76fa768bfbe2967409d3eedd2b8ea36d93a3 [file] [log] [blame]
Christopher Wiley775fa1f2015-09-22 15:00:12 -07001/*
2 * Copyright (C) 2015, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "type_java.h"
The Android Open Source Project46c012c2008-10-21 07:00:00 -070018
David 'Digit' Turnera3372982014-03-04 16:43:41 +010019#include <sys/types.h>
20
Christopher Wiley84c1eac2015-09-23 13:29:28 -070021#include "aidl_language.h"
22#include "logging.h"
23
Christopher Wileyfdeb0f42015-09-11 15:38:22 -070024namespace android {
25namespace aidl {
26
Christopher Wiley84c1eac2015-09-23 13:29:28 -070027JavaTypeNamespace NAMES;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070028
29Type* VOID_TYPE;
30Type* BOOLEAN_TYPE;
31Type* BYTE_TYPE;
32Type* CHAR_TYPE;
33Type* INT_TYPE;
34Type* LONG_TYPE;
35Type* FLOAT_TYPE;
36Type* DOUBLE_TYPE;
37Type* STRING_TYPE;
Joe Onoratoc596cfe2011-08-30 17:24:17 -070038Type* OBJECT_TYPE;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070039Type* CHAR_SEQUENCE_TYPE;
40Type* TEXT_UTILS_TYPE;
41Type* REMOTE_EXCEPTION_TYPE;
42Type* RUNTIME_EXCEPTION_TYPE;
43Type* IBINDER_TYPE;
44Type* IINTERFACE_TYPE;
45Type* BINDER_NATIVE_TYPE;
46Type* BINDER_PROXY_TYPE;
47Type* PARCEL_TYPE;
48Type* PARCELABLE_INTERFACE_TYPE;
Joe Onoratoc596cfe2011-08-30 17:24:17 -070049Type* CONTEXT_TYPE;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070050Type* MAP_TYPE;
51Type* LIST_TYPE;
52Type* CLASSLOADER_TYPE;
53
54Expression* NULL_VALUE;
55Expression* THIS_VALUE;
56Expression* SUPER_VALUE;
57Expression* TRUE_VALUE;
58Expression* FALSE_VALUE;
59
Christopher Wileye6dee912015-09-22 14:50:23 -070060void register_base_types() {
61 VOID_TYPE = new BasicType("void", "XXX", "XXX", "XXX", "XXX", "XXX");
62 NAMES.Add(VOID_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070063
Christopher Wileye6dee912015-09-22 14:50:23 -070064 BOOLEAN_TYPE = new BooleanType();
65 NAMES.Add(BOOLEAN_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070066
Christopher Wileye6dee912015-09-22 14:50:23 -070067 BYTE_TYPE = new BasicType("byte", "writeByte", "readByte", "writeByteArray",
68 "createByteArray", "readByteArray");
69 NAMES.Add(BYTE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070070
Christopher Wileye6dee912015-09-22 14:50:23 -070071 CHAR_TYPE = new CharType();
72 NAMES.Add(CHAR_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070073
Christopher Wileye6dee912015-09-22 14:50:23 -070074 INT_TYPE = new BasicType("int", "writeInt", "readInt", "writeIntArray",
75 "createIntArray", "readIntArray");
76 NAMES.Add(INT_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070077
Christopher Wileye6dee912015-09-22 14:50:23 -070078 LONG_TYPE = new BasicType("long", "writeLong", "readLong", "writeLongArray",
79 "createLongArray", "readLongArray");
80 NAMES.Add(LONG_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070081
Christopher Wileye6dee912015-09-22 14:50:23 -070082 FLOAT_TYPE =
83 new BasicType("float", "writeFloat", "readFloat", "writeFloatArray",
84 "createFloatArray", "readFloatArray");
85 NAMES.Add(FLOAT_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070086
Christopher Wileye6dee912015-09-22 14:50:23 -070087 DOUBLE_TYPE =
88 new BasicType("double", "writeDouble", "readDouble", "writeDoubleArray",
89 "createDoubleArray", "readDoubleArray");
90 NAMES.Add(DOUBLE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070091
Christopher Wileye6dee912015-09-22 14:50:23 -070092 STRING_TYPE = new StringType();
93 NAMES.Add(STRING_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070094
Christopher Wileye6dee912015-09-22 14:50:23 -070095 OBJECT_TYPE = new Type("java.lang", "Object", Type::BUILT_IN, false, false);
96 NAMES.Add(OBJECT_TYPE);
Joe Onoratoc596cfe2011-08-30 17:24:17 -070097
Christopher Wileye6dee912015-09-22 14:50:23 -070098 CHAR_SEQUENCE_TYPE = new CharSequenceType();
99 NAMES.Add(CHAR_SEQUENCE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700100
Christopher Wileye6dee912015-09-22 14:50:23 -0700101 MAP_TYPE = new MapType();
102 NAMES.Add(MAP_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700103
Christopher Wileye6dee912015-09-22 14:50:23 -0700104 LIST_TYPE = new ListType();
105 NAMES.Add(LIST_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700106
Christopher Wileye6dee912015-09-22 14:50:23 -0700107 TEXT_UTILS_TYPE =
108 new Type("android.text", "TextUtils", Type::BUILT_IN, false, false);
109 NAMES.Add(TEXT_UTILS_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700110
Christopher Wileye6dee912015-09-22 14:50:23 -0700111 REMOTE_EXCEPTION_TYPE = new RemoteExceptionType();
112 NAMES.Add(REMOTE_EXCEPTION_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700113
Christopher Wileye6dee912015-09-22 14:50:23 -0700114 RUNTIME_EXCEPTION_TYPE = new RuntimeExceptionType();
115 NAMES.Add(RUNTIME_EXCEPTION_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700116
Christopher Wileye6dee912015-09-22 14:50:23 -0700117 IBINDER_TYPE = new IBinderType();
118 NAMES.Add(IBINDER_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700119
Christopher Wileye6dee912015-09-22 14:50:23 -0700120 IINTERFACE_TYPE = new IInterfaceType();
121 NAMES.Add(IINTERFACE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700122
Christopher Wileye6dee912015-09-22 14:50:23 -0700123 BINDER_NATIVE_TYPE = new BinderType();
124 NAMES.Add(BINDER_NATIVE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700125
Christopher Wileye6dee912015-09-22 14:50:23 -0700126 BINDER_PROXY_TYPE = new BinderProxyType();
127 NAMES.Add(BINDER_PROXY_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700128
Christopher Wileye6dee912015-09-22 14:50:23 -0700129 PARCEL_TYPE = new ParcelType();
130 NAMES.Add(PARCEL_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700131
Christopher Wileye6dee912015-09-22 14:50:23 -0700132 PARCELABLE_INTERFACE_TYPE = new ParcelableInterfaceType();
133 NAMES.Add(PARCELABLE_INTERFACE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700134
Christopher Wileye6dee912015-09-22 14:50:23 -0700135 CONTEXT_TYPE =
136 new Type("android.content", "Context", Type::BUILT_IN, false, false);
137 NAMES.Add(CONTEXT_TYPE);
Joe Onoratoc596cfe2011-08-30 17:24:17 -0700138
Christopher Wileye6dee912015-09-22 14:50:23 -0700139 CLASSLOADER_TYPE = new ClassLoaderType();
140 NAMES.Add(CLASSLOADER_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700141
Christopher Wileye6dee912015-09-22 14:50:23 -0700142 NULL_VALUE = new LiteralExpression("null");
143 THIS_VALUE = new LiteralExpression("this");
144 SUPER_VALUE = new LiteralExpression("super");
145 TRUE_VALUE = new LiteralExpression("true");
146 FALSE_VALUE = new LiteralExpression("false");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700147
Christopher Wileye6dee912015-09-22 14:50:23 -0700148 NAMES.AddGenericType("java.util", "List", 1);
149 NAMES.AddGenericType("java.util", "Map", 2);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700150}
151
Christopher Wileye6dee912015-09-22 14:50:23 -0700152static Type* make_generic_type(const string& package, const string& name,
Christopher Wiley8f6816e2015-09-22 17:03:47 -0700153 const vector<const Type*>& args) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700154 if (package == "java.util" && name == "List") {
155 return new GenericListType("java.util", "List", args);
156 }
157 return NULL;
158 // return new GenericType(package, name, args);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700159}
160
161// ================================================================
162
Casey Dahlin88868fc2015-09-01 13:21:26 -0700163Type::Type(const string& name, int kind, bool canWriteToParcel, bool canBeOut)
Christopher Wileye6dee912015-09-22 14:50:23 -0700164 : m_package(),
165 m_name(name),
166 m_declFile(""),
167 m_declLine(-1),
168 m_kind(kind),
169 m_canWriteToParcel(canWriteToParcel),
170 m_canBeOut(canBeOut) {
171 m_qualifiedName = name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700172}
173
Christopher Wileye6dee912015-09-22 14:50:23 -0700174Type::Type(const string& package, const string& name, int kind,
175 bool canWriteToParcel, bool canBeOut, const string& declFile,
176 int declLine)
177 : m_package(package),
178 m_name(name),
179 m_declFile(declFile),
180 m_declLine(declLine),
181 m_kind(kind),
182 m_canWriteToParcel(canWriteToParcel),
183 m_canBeOut(canBeOut) {
184 if (package.length() > 0) {
185 m_qualifiedName = package;
186 m_qualifiedName += '.';
187 }
188 m_qualifiedName += name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700189}
190
Christopher Wileye6dee912015-09-22 14:50:23 -0700191Type::~Type() {}
192
193string Type::HumanReadableKind() const {
194 switch (Kind()) {
195 case INTERFACE:
196 return "an interface";
197 case USERDATA:
198 return "a user data";
199 default:
200 return "ERROR";
201 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700202}
203
Christopher Wileye6dee912015-09-22 14:50:23 -0700204bool Type::CanBeArray() const { return false; }
205
206string Type::ImportType() const { return m_qualifiedName; }
207
208string Type::CreatorName() const { return ""; }
209
210string Type::InstantiableName() const { return QualifiedName(); }
211
212void Type::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700213 int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700214 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%sn", __FILE__,
215 __LINE__, m_qualifiedName.c_str());
216 addTo->Add(new LiteralExpression("/* WriteToParcel error " + m_qualifiedName +
217 " */"));
Christopher Wileyf690be52015-09-14 15:19:10 -0700218}
219
Christopher Wileye6dee912015-09-22 14:50:23 -0700220void Type::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700221 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700222 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
223 __LINE__, m_qualifiedName.c_str());
224 addTo->Add(new LiteralExpression("/* CreateFromParcel error " +
225 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700226}
227
Christopher Wileye6dee912015-09-22 14:50:23 -0700228void Type::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700229 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700230 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
231 __LINE__, m_qualifiedName.c_str());
232 addTo->Add(new LiteralExpression("/* ReadFromParcel error " +
233 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700234}
235
Christopher Wileye6dee912015-09-22 14:50:23 -0700236void Type::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700237 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700238 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
239 __LINE__, m_qualifiedName.c_str());
240 addTo->Add(new LiteralExpression("/* WriteArrayToParcel error " +
241 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700242}
243
Christopher Wileye6dee912015-09-22 14:50:23 -0700244void Type::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700245 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700246 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
247 __LINE__, m_qualifiedName.c_str());
248 addTo->Add(new LiteralExpression("/* CreateArrayFromParcel error " +
249 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700250}
251
Christopher Wileye6dee912015-09-22 14:50:23 -0700252void Type::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700253 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700254 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
255 __LINE__, m_qualifiedName.c_str());
256 addTo->Add(new LiteralExpression("/* ReadArrayFromParcel error " +
257 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700258}
259
Christopher Wileye6dee912015-09-22 14:50:23 -0700260void Type::SetQualifiedName(const string& qualified) {
261 m_qualifiedName = qualified;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700262}
263
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700264Expression* Type::BuildWriteToParcelFlags(int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700265 if (flags == 0) {
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700266 return new LiteralExpression("0");
Christopher Wileye6dee912015-09-22 14:50:23 -0700267 }
268 if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0) {
269 return new FieldVariable(PARCELABLE_INTERFACE_TYPE,
270 "PARCELABLE_WRITE_RETURN_VALUE");
271 }
272 return new LiteralExpression("0");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700273}
274
275// ================================================================
276
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700277BasicType::BasicType(const string& name, const string& marshallParcel,
Christopher Wileye6dee912015-09-22 14:50:23 -0700278 const string& unmarshallParcel,
279 const string& writeArrayParcel,
280 const string& createArrayParcel,
281 const string& readArrayParcel)
282 : Type(name, BUILT_IN, true, false),
283 m_marshallParcel(marshallParcel),
284 m_unmarshallParcel(unmarshallParcel),
285 m_writeArrayParcel(writeArrayParcel),
286 m_createArrayParcel(createArrayParcel),
287 m_readArrayParcel(readArrayParcel) {}
288
289void BasicType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700290 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700291 addTo->Add(new MethodCall(parcel, m_marshallParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700292}
293
Christopher Wileye6dee912015-09-22 14:50:23 -0700294void BasicType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700295 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700296 addTo->Add(new Assignment(v, new MethodCall(parcel, m_unmarshallParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700297}
298
Christopher Wileye6dee912015-09-22 14:50:23 -0700299bool BasicType::CanBeArray() const { return true; }
300
301void BasicType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700302 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700303 addTo->Add(new MethodCall(parcel, m_writeArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700304}
305
Christopher Wileye6dee912015-09-22 14:50:23 -0700306void BasicType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700307 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700308 addTo->Add(new Assignment(v, new MethodCall(parcel, m_createArrayParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700309}
310
Christopher Wileye6dee912015-09-22 14:50:23 -0700311void BasicType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700312 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700313 addTo->Add(new MethodCall(parcel, m_readArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700314}
315
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700316// ================================================================
317
Christopher Wileye6dee912015-09-22 14:50:23 -0700318BooleanType::BooleanType() : Type("boolean", BUILT_IN, true, false) {}
319
320void BooleanType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700321 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700322 addTo->Add(new MethodCall(
323 parcel, "writeInt", 1,
324 new Ternary(v, new LiteralExpression("1"), new LiteralExpression("0"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700325}
326
Christopher Wileye6dee912015-09-22 14:50:23 -0700327void BooleanType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700328 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700329 addTo->Add(
330 new Assignment(v, new Comparison(new LiteralExpression("0"), "!=",
331 new MethodCall(parcel, "readInt"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700332}
333
Christopher Wileye6dee912015-09-22 14:50:23 -0700334bool BooleanType::CanBeArray() const { return true; }
335
336void BooleanType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700337 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700338 addTo->Add(new MethodCall(parcel, "writeBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700339}
340
Christopher Wileye6dee912015-09-22 14:50:23 -0700341void BooleanType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700342 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700343 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBooleanArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700344}
345
Christopher Wileye6dee912015-09-22 14:50:23 -0700346void BooleanType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700347 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700348 addTo->Add(new MethodCall(parcel, "readBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700349}
350
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700351// ================================================================
352
Christopher Wileye6dee912015-09-22 14:50:23 -0700353CharType::CharType() : Type("char", BUILT_IN, true, false) {}
354
355void CharType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700356 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700357 addTo->Add(new MethodCall(parcel, "writeInt", 1, new Cast(INT_TYPE, v)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700358}
359
Christopher Wileye6dee912015-09-22 14:50:23 -0700360void CharType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700361 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700362 addTo->Add(new Assignment(v, new MethodCall(parcel, "readInt"), this));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700363}
364
Christopher Wileye6dee912015-09-22 14:50:23 -0700365bool CharType::CanBeArray() const { return true; }
366
367void CharType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700368 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700369 addTo->Add(new MethodCall(parcel, "writeCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700370}
371
Christopher Wileye6dee912015-09-22 14:50:23 -0700372void CharType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700373 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700374 addTo->Add(new Assignment(v, new MethodCall(parcel, "createCharArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700375}
376
Christopher Wileye6dee912015-09-22 14:50:23 -0700377void CharType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700378 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700379 addTo->Add(new MethodCall(parcel, "readCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700380}
381
382// ================================================================
383
Christopher Wileye6dee912015-09-22 14:50:23 -0700384StringType::StringType() : Type("java.lang", "String", BUILT_IN, true, false) {}
385
386string StringType::CreatorName() const {
387 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700388}
389
Christopher Wileye6dee912015-09-22 14:50:23 -0700390void StringType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700391 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700392 addTo->Add(new MethodCall(parcel, "writeString", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700393}
394
Christopher Wileye6dee912015-09-22 14:50:23 -0700395void StringType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700396 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700397 addTo->Add(new Assignment(v, new MethodCall(parcel, "readString")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700398}
399
Christopher Wileye6dee912015-09-22 14:50:23 -0700400bool StringType::CanBeArray() const { return true; }
401
402void StringType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700403 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700404 addTo->Add(new MethodCall(parcel, "writeStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700405}
406
Christopher Wileye6dee912015-09-22 14:50:23 -0700407void StringType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700408 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700409 addTo->Add(new Assignment(v, new MethodCall(parcel, "createStringArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700410}
411
Christopher Wileye6dee912015-09-22 14:50:23 -0700412void StringType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700413 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700414 addTo->Add(new MethodCall(parcel, "readStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700415}
416
417// ================================================================
418
419CharSequenceType::CharSequenceType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700420 : Type("java.lang", "CharSequence", BUILT_IN, true, false) {}
421
422string CharSequenceType::CreatorName() const {
423 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700424}
425
Christopher Wileye6dee912015-09-22 14:50:23 -0700426void CharSequenceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700427 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700428 // if (v != null) {
429 // parcel.writeInt(1);
430 // v.writeToParcel(parcel);
431 // } else {
432 // parcel.writeInt(0);
433 // }
434 IfStatement* elsepart = new IfStatement();
435 elsepart->statements->Add(
436 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
437 IfStatement* ifpart = new IfStatement;
438 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
439 ifpart->elseif = elsepart;
440 ifpart->statements->Add(
441 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
442 ifpart->statements->Add(new MethodCall(TEXT_UTILS_TYPE, "writeToParcel", 3, v,
443 parcel,
444 BuildWriteToParcelFlags(flags)));
445
446 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700447}
448
Christopher Wileye6dee912015-09-22 14:50:23 -0700449void CharSequenceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700450 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700451 // if (0 != parcel.readInt()) {
452 // v = TextUtils.createFromParcel(parcel)
453 // } else {
454 // v = null;
455 // }
456 IfStatement* elsepart = new IfStatement();
457 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700458
Christopher Wileye6dee912015-09-22 14:50:23 -0700459 IfStatement* ifpart = new IfStatement();
460 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
461 new MethodCall(parcel, "readInt"));
462 ifpart->elseif = elsepart;
463 ifpart->statements->Add(new Assignment(
464 v, new MethodCall(TEXT_UTILS_TYPE,
465 "CHAR_SEQUENCE_CREATOR.createFromParcel", 1, parcel)));
466
467 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700468}
469
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700470// ================================================================
471
472RemoteExceptionType::RemoteExceptionType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700473 : Type("android.os", "RemoteException", BUILT_IN, false, false) {}
474
475void RemoteExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700476 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700477 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700478}
479
Christopher Wileye6dee912015-09-22 14:50:23 -0700480void RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700481 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700482 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700483}
484
485// ================================================================
486
487RuntimeExceptionType::RuntimeExceptionType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700488 : Type("java.lang", "RuntimeException", BUILT_IN, false, false) {}
489
490void RuntimeExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700491 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700492 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700493}
494
Christopher Wileye6dee912015-09-22 14:50:23 -0700495void RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700496 Variable* parcel,
497 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700498 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700499}
500
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700501// ================================================================
502
503IBinderType::IBinderType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700504 : Type("android.os", "IBinder", BUILT_IN, true, false) {}
505
506void IBinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700507 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700508 addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700509}
510
Christopher Wileye6dee912015-09-22 14:50:23 -0700511void IBinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700512 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700513 addTo->Add(new Assignment(v, new MethodCall(parcel, "readStrongBinder")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700514}
515
Christopher Wileye6dee912015-09-22 14:50:23 -0700516void IBinderType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700517 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700518 addTo->Add(new MethodCall(parcel, "writeBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700519}
520
Christopher Wileye6dee912015-09-22 14:50:23 -0700521void IBinderType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700522 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700523 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBinderArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700524}
525
Christopher Wileye6dee912015-09-22 14:50:23 -0700526void IBinderType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700527 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700528 addTo->Add(new MethodCall(parcel, "readBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700529}
530
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700531// ================================================================
532
533IInterfaceType::IInterfaceType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700534 : Type("android.os", "IInterface", BUILT_IN, false, false) {}
535
536void IInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700537 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700538 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700539}
540
Christopher Wileye6dee912015-09-22 14:50:23 -0700541void IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700542 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700543 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700544}
545
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700546// ================================================================
547
548BinderType::BinderType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700549 : Type("android.os", "Binder", BUILT_IN, false, false) {}
550
551void BinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700552 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700553 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700554}
555
Christopher Wileye6dee912015-09-22 14:50:23 -0700556void BinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700557 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700558 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700559}
560
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700561// ================================================================
562
563BinderProxyType::BinderProxyType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700564 : Type("android.os", "BinderProxy", BUILT_IN, false, false) {}
565
566void BinderProxyType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700567 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700568 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700569}
570
Christopher Wileye6dee912015-09-22 14:50:23 -0700571void BinderProxyType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700572 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700573 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700574}
575
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700576// ================================================================
577
578ParcelType::ParcelType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700579 : Type("android.os", "Parcel", BUILT_IN, false, false) {}
580
581void ParcelType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700582 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700583 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700584}
585
Christopher Wileye6dee912015-09-22 14:50:23 -0700586void ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700587 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700588 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700589}
590
591// ================================================================
592
593ParcelableInterfaceType::ParcelableInterfaceType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700594 : Type("android.os", "Parcelable", BUILT_IN, false, false) {}
595
596void ParcelableInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700597 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700598 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700599}
600
Christopher Wileye6dee912015-09-22 14:50:23 -0700601void ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo,
602 Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700603 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700604 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700605}
606
607// ================================================================
608
Christopher Wileye6dee912015-09-22 14:50:23 -0700609MapType::MapType() : Type("java.util", "Map", BUILT_IN, true, true) {}
610
611void MapType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700612 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700613 addTo->Add(new MethodCall(parcel, "writeMap", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700614}
615
Christopher Wileye6dee912015-09-22 14:50:23 -0700616static void EnsureClassLoader(StatementBlock* addTo, Variable** cl) {
617 // We don't want to look up the class loader once for every
618 // collection argument, so ensure we do it at most once per method.
619 if (*cl == NULL) {
620 *cl = new Variable(CLASSLOADER_TYPE, "cl");
621 addTo->Add(new VariableDeclaration(
622 *cl, new LiteralExpression("this.getClass().getClassLoader()"),
623 CLASSLOADER_TYPE));
624 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700625}
626
Christopher Wileye6dee912015-09-22 14:50:23 -0700627void MapType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700628 Variable* parcel, Variable** cl) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700629 EnsureClassLoader(addTo, cl);
630 addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, *cl)));
Elliott Hughes15f8da22011-07-13 12:10:30 -0700631}
632
Christopher Wileye6dee912015-09-22 14:50:23 -0700633void MapType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700634 Variable* parcel, Variable** cl) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700635 EnsureClassLoader(addTo, cl);
636 addTo->Add(new MethodCall(parcel, "readMap", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700637}
638
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700639// ================================================================
640
Christopher Wileye6dee912015-09-22 14:50:23 -0700641ListType::ListType() : Type("java.util", "List", BUILT_IN, true, true) {}
642
643string ListType::InstantiableName() const { return "java.util.ArrayList"; }
644
645void ListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700646 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700647 addTo->Add(new MethodCall(parcel, "writeList", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700648}
649
Christopher Wileye6dee912015-09-22 14:50:23 -0700650void ListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700651 Variable* parcel, Variable** cl) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700652 EnsureClassLoader(addTo, cl);
653 addTo->Add(
654 new Assignment(v, new MethodCall(parcel, "readArrayList", 1, *cl)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700655}
656
Christopher Wileye6dee912015-09-22 14:50:23 -0700657void ListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700658 Variable* parcel, Variable** cl) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700659 EnsureClassLoader(addTo, cl);
660 addTo->Add(new MethodCall(parcel, "readList", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700661}
662
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700663// ================================================================
664
Joe Onoratobaaf9c82011-10-09 22:31:16 -0700665UserDataType::UserDataType(const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700666 bool builtIn, bool canWriteToParcel,
667 const string& declFile, int declLine)
668 : Type(package, name, builtIn ? BUILT_IN : USERDATA, canWriteToParcel, true,
669 declFile, declLine) {}
670
671string UserDataType::CreatorName() const {
672 return QualifiedName() + ".CREATOR";
Joe Onorato44050522011-10-09 17:38:20 -0700673}
674
Christopher Wileye6dee912015-09-22 14:50:23 -0700675void UserDataType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700676 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700677 // if (v != null) {
678 // parcel.writeInt(1);
679 // v.writeToParcel(parcel);
680 // } else {
681 // parcel.writeInt(0);
682 // }
683 IfStatement* elsepart = new IfStatement();
684 elsepart->statements->Add(
685 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
686 IfStatement* ifpart = new IfStatement;
687 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
688 ifpart->elseif = elsepart;
689 ifpart->statements->Add(
690 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
691 ifpart->statements->Add(new MethodCall(v, "writeToParcel", 2, parcel,
692 BuildWriteToParcelFlags(flags)));
693
694 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700695}
696
Christopher Wileye6dee912015-09-22 14:50:23 -0700697void UserDataType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700698 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700699 // if (0 != parcel.readInt()) {
700 // v = CLASS.CREATOR.createFromParcel(parcel)
701 // } else {
702 // v = null;
703 // }
704 IfStatement* elsepart = new IfStatement();
705 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700706
Christopher Wileye6dee912015-09-22 14:50:23 -0700707 IfStatement* ifpart = new IfStatement();
708 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
709 new MethodCall(parcel, "readInt"));
710 ifpart->elseif = elsepart;
711 ifpart->statements->Add(new Assignment(
712 v, new MethodCall(v->type, "CREATOR.createFromParcel", 1, parcel)));
713
714 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700715}
716
Christopher Wileye6dee912015-09-22 14:50:23 -0700717void UserDataType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700718 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700719 // TODO: really, we don't need to have this extra check, but we
720 // don't have two separate marshalling code paths
721 // if (0 != parcel.readInt()) {
722 // v.readFromParcel(parcel)
723 // }
724 IfStatement* ifpart = new IfStatement();
725 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
726 new MethodCall(parcel, "readInt"));
727 ifpart->statements->Add(new MethodCall(v, "readFromParcel", 1, parcel));
728 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700729}
730
Christopher Wileye6dee912015-09-22 14:50:23 -0700731bool UserDataType::CanBeArray() const { return true; }
732
733void UserDataType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700734 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700735 addTo->Add(new MethodCall(parcel, "writeTypedArray", 2, v,
736 BuildWriteToParcelFlags(flags)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700737}
738
Christopher Wileye6dee912015-09-22 14:50:23 -0700739void UserDataType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700740 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700741 string creator = v->type->QualifiedName() + ".CREATOR";
742 addTo->Add(new Assignment(v, new MethodCall(parcel, "createTypedArray", 1,
743 new LiteralExpression(creator))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700744}
745
Christopher Wileye6dee912015-09-22 14:50:23 -0700746void UserDataType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700747 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700748 string creator = v->type->QualifiedName() + ".CREATOR";
749 addTo->Add(new MethodCall(parcel, "readTypedArray", 2, v,
750 new LiteralExpression(creator)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700751}
752
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700753// ================================================================
754
755InterfaceType::InterfaceType(const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700756 bool builtIn, bool oneway, const string& declFile,
757 int declLine)
758 : Type(package, name, builtIn ? BUILT_IN : INTERFACE, true, false, declFile,
759 declLine),
760 m_oneway(oneway) {}
761
762bool InterfaceType::OneWay() const { return m_oneway; }
763
764void InterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700765 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700766 // parcel.writeStrongBinder(v != null ? v.asBinder() : null);
767 addTo->Add(
768 new MethodCall(parcel, "writeStrongBinder", 1,
769 new Ternary(new Comparison(v, "!=", NULL_VALUE),
770 new MethodCall(v, "asBinder"), NULL_VALUE)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700771}
772
Christopher Wileye6dee912015-09-22 14:50:23 -0700773void InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700774 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700775 // v = Interface.asInterface(parcel.readStrongBinder());
776 string type = v->type->QualifiedName();
777 type += ".Stub";
778 addTo->Add(new Assignment(
779 v, new MethodCall(NAMES.Find(type), "asInterface", 1,
780 new MethodCall(parcel, "readStrongBinder"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700781}
782
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700783// ================================================================
784
785GenericType::GenericType(const string& package, const string& name,
Christopher Wiley8f6816e2015-09-22 17:03:47 -0700786 const vector<const Type*>& args)
Christopher Wileye6dee912015-09-22 14:50:23 -0700787 : Type(package, name, BUILT_IN, true, true) {
788 m_args = args;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700789
Christopher Wileye6dee912015-09-22 14:50:23 -0700790 m_importName = package + '.' + name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700791
Christopher Wileye6dee912015-09-22 14:50:23 -0700792 string gen = "<";
793 int N = args.size();
794 for (int i = 0; i < N; i++) {
Christopher Wiley8f6816e2015-09-22 17:03:47 -0700795 const Type* t = args[i];
Christopher Wileye6dee912015-09-22 14:50:23 -0700796 gen += t->QualifiedName();
797 if (i != N - 1) {
798 gen += ',';
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700799 }
Christopher Wileye6dee912015-09-22 14:50:23 -0700800 }
801 gen += '>';
802 m_genericArguments = gen;
803 SetQualifiedName(m_importName + gen);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700804}
805
Christopher Wiley8f6816e2015-09-22 17:03:47 -0700806const vector<const Type*>& GenericType::GenericArgumentTypes() const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700807 return m_args;
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700808}
809
Christopher Wileye6dee912015-09-22 14:50:23 -0700810string GenericType::GenericArguments() const { return m_genericArguments; }
811
812string GenericType::ImportType() const { return m_importName; }
813
814void GenericType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700815 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700816 fprintf(stderr, "implement GenericType::WriteToParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700817}
818
Christopher Wileye6dee912015-09-22 14:50:23 -0700819void GenericType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700820 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700821 fprintf(stderr, "implement GenericType::CreateFromParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700822}
823
Christopher Wileye6dee912015-09-22 14:50:23 -0700824void GenericType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700825 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700826 fprintf(stderr, "implement GenericType::ReadFromParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700827}
828
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700829// ================================================================
830
831GenericListType::GenericListType(const string& package, const string& name,
Christopher Wiley8f6816e2015-09-22 17:03:47 -0700832 const vector<const Type*>& args)
Christopher Wileye6dee912015-09-22 14:50:23 -0700833 : GenericType(package, name, args), m_creator(args[0]->CreatorName()) {}
834
835string GenericListType::CreatorName() const {
836 return "android.os.Parcel.arrayListCreator";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700837}
838
Christopher Wileye6dee912015-09-22 14:50:23 -0700839string GenericListType::InstantiableName() const {
840 return "java.util.ArrayList" + GenericArguments();
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700841}
842
Christopher Wileye6dee912015-09-22 14:50:23 -0700843void GenericListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700844 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700845 if (m_creator == STRING_TYPE->CreatorName()) {
846 addTo->Add(new MethodCall(parcel, "writeStringList", 1, v));
847 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
848 addTo->Add(new MethodCall(parcel, "writeBinderList", 1, v));
849 } else {
850 // parcel.writeTypedListXX(arg);
851 addTo->Add(new MethodCall(parcel, "writeTypedList", 1, v));
852 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700853}
854
Christopher Wileye6dee912015-09-22 14:50:23 -0700855void GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700856 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700857 if (m_creator == STRING_TYPE->CreatorName()) {
858 addTo->Add(
859 new Assignment(v, new MethodCall(parcel, "createStringArrayList", 0)));
860 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
861 addTo->Add(
862 new Assignment(v, new MethodCall(parcel, "createBinderArrayList", 0)));
863 } else {
864 // v = _data.readTypedArrayList(XXX.creator);
865 addTo->Add(
866 new Assignment(v, new MethodCall(parcel, "createTypedArrayList", 1,
867 new LiteralExpression(m_creator))));
868 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700869}
870
Christopher Wileye6dee912015-09-22 14:50:23 -0700871void GenericListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700872 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700873 if (m_creator == STRING_TYPE->CreatorName()) {
874 addTo->Add(new MethodCall(parcel, "readStringList", 1, v));
875 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
876 addTo->Add(new MethodCall(parcel, "readBinderList", 1, v));
877 } else {
878 // v = _data.readTypedList(v, XXX.creator);
879 addTo->Add(new MethodCall(parcel, "readTypedList", 2, v,
880 new LiteralExpression(m_creator)));
881 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700882}
883
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700884// ================================================================
885
886ClassLoaderType::ClassLoaderType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700887 : Type("java.lang", "ClassLoader", BUILT_IN, false, false) {}
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700888
889// ================================================================
890
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700891JavaTypeNamespace::JavaTypeNamespace() {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700892
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700893JavaTypeNamespace::~JavaTypeNamespace() {
Christopher Wileye6dee912015-09-22 14:50:23 -0700894 int N = m_types.size();
895 for (int i = 0; i < N; i++) {
896 delete m_types[i];
897 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700898}
899
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700900bool JavaTypeNamespace::Add(const Type* type) {
901 const Type* existing = Find(type->QualifiedName());
902 if (!existing) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700903 m_types.push_back(type);
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700904 return true;
Christopher Wileye6dee912015-09-22 14:50:23 -0700905 }
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700906
907 if (existing->Kind() == Type::BUILT_IN) {
908 fprintf(stderr, "%s:%d attempt to redefine built in class %s\n",
909 type->DeclFile().c_str(), type->DeclLine(),
910 type->QualifiedName().c_str());
911 return false;
912 }
913
914 if (type->Kind() != existing->Kind()) {
915 fprintf(stderr, "%s:%d attempt to redefine %s as %s,\n",
916 type->DeclFile().c_str(), type->DeclLine(),
917 type->QualifiedName().c_str(),
918 type->HumanReadableKind().c_str());
919 fprintf(stderr, "%s:%d previously defined here as %s.\n",
920 existing->DeclFile().c_str(), existing->DeclLine(),
921 existing->HumanReadableKind().c_str());
922 return false;
923 }
924
925 return true;
Christopher Wileye6dee912015-09-22 14:50:23 -0700926}
927
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700928void JavaTypeNamespace::AddGenericType(const string& package,
929 const string& name,
930 int args) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700931 Generic g;
932 g.package = package;
933 g.name = name;
934 g.qualified = package + '.' + name;
935 g.args = args;
936 m_generics.push_back(g);
937}
938
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700939const Type* JavaTypeNamespace::Find(const string& name) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700940 int N = m_types.size();
941 for (int i = 0; i < N; i++) {
942 if (m_types[i]->QualifiedName() == name) {
943 return m_types[i];
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700944 }
Christopher Wileye6dee912015-09-22 14:50:23 -0700945 }
946 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700947}
948
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700949const Type* JavaTypeNamespace::Find(const char* package,
950 const char* name) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700951 string s;
952 if (package != nullptr && *package != '\0') {
953 s += package;
954 s += '.';
955 }
956 s += name;
957 return Find(s);
958}
959
960static string normalize_generic(const string& s) {
961 string r;
962 int N = s.size();
963 for (int i = 0; i < N; i++) {
964 char c = s[i];
965 if (!isspace(c)) {
966 r += c;
967 }
968 }
969 return r;
970}
971
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700972bool JavaTypeNamespace::AddParcelableType(user_data_type* p,
973 const std::string& filename) {
974 Type* type = new UserDataType(p->package ? p->package : "", p->name.data,
975 false, p->parcelable, filename, p->name.lineno);
976 return Add(type);
977}
978
979bool JavaTypeNamespace::AddBinderType(interface_type* b,
980 const std::string& filename) {
981 Type* type = new InterfaceType(b->package ? b->package : "",
982 b->name.data, false, b->oneway,
983 filename, b->name.lineno);
984 // for interfaces, also add the stub and proxy types
985 Type* stub = new Type(b->package ? b->package : "",
986 string{b->name.data} + ".Stub",
987 Type::GENERATED, false, false,
988 filename, b->name.lineno);
989 Type* proxy = new Type(b->package ? b->package : "",
990 string{b->name.data} + ".Stub.Proxy",
991 Type::GENERATED, false, false,
992 filename, b->name.lineno);
993
994 bool success = true;
995 success &= Add(type);
996 success &= Add(stub);
997 success &= Add(proxy);
998 return success;
999}
1000
1001const Type* JavaTypeNamespace::Search(const string& name) {
Christopher Wileye6dee912015-09-22 14:50:23 -07001002 // an exact match wins
Christopher Wiley8f6816e2015-09-22 17:03:47 -07001003 const Type* result = Find(name);
Christopher Wileye6dee912015-09-22 14:50:23 -07001004 if (result != NULL) {
1005 return result;
1006 }
1007
1008 // try the class names
1009 // our language doesn't allow you to not specify outer classes
1010 // when referencing an inner class. that could be changed, and this
1011 // would be the place to do it, but I don't think the complexity in
1012 // scoping rules is worth it.
1013 int N = m_types.size();
1014 for (int i = 0; i < N; i++) {
1015 if (m_types[i]->Name() == name) {
1016 return m_types[i];
1017 }
1018 }
1019
1020 // we got to here and it's not a generic, give up
1021 if (name.find('<') == name.npos) {
1022 return NULL;
1023 }
1024
1025 // remove any whitespace
1026 string normalized = normalize_generic(name);
1027
1028 // find the part before the '<', find a generic for it
1029 ssize_t baseIndex = normalized.find('<');
1030 string base(normalized.c_str(), baseIndex);
1031 const Generic* g = search_generic(base);
1032 if (g == NULL) {
1033 return NULL;
1034 }
1035
1036 // For each of the args, do a recursive search on it. We don't allow
1037 // generics within generics like Java does, because we're really limiting
1038 // them to just built-in container classes, at least for now. Our syntax
1039 // ensures this right now as well.
Christopher Wiley8f6816e2015-09-22 17:03:47 -07001040 vector<const Type*> args;
Christopher Wileye6dee912015-09-22 14:50:23 -07001041 size_t start = baseIndex + 1;
1042 size_t end = start;
1043 while (normalized[start] != '\0') {
1044 end = normalized.find(',', start);
1045 if (end == normalized.npos) {
1046 end = normalized.find('>', start);
1047 }
1048 string s(normalized.c_str() + start, end - start);
Christopher Wiley8f6816e2015-09-22 17:03:47 -07001049 const Type* t = this->Search(s);
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001050 if (t == NULL) {
Christopher Wiley84c1eac2015-09-23 13:29:28 -07001051 LOG(ERROR) << "internal error";
Christopher Wileye6dee912015-09-22 14:50:23 -07001052 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001053 }
Christopher Wileye6dee912015-09-22 14:50:23 -07001054 args.push_back(t);
1055 start = end + 1;
1056 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001057
Christopher Wileye6dee912015-09-22 14:50:23 -07001058 // construct a GenericType, add it to our name set so they always get
1059 // the same object, and return it.
1060 result = make_generic_type(g->package, g->name, args);
1061 if (result == NULL) {
Christopher Wiley84c1eac2015-09-23 13:29:28 -07001062 LOG(ERROR) << "internal error";
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001063 return NULL;
Christopher Wileye6dee912015-09-22 14:50:23 -07001064 }
1065
1066 this->Add(result);
1067 return this->Find(result->QualifiedName());
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001068}
1069
Christopher Wiley84c1eac2015-09-23 13:29:28 -07001070const JavaTypeNamespace::Generic* JavaTypeNamespace::search_generic(
1071 const string& name) const {
Christopher Wileye6dee912015-09-22 14:50:23 -07001072 int N = m_generics.size();
1073
1074 // first exact match
1075 for (int i = 0; i < N; i++) {
1076 const Generic& g = m_generics[i];
1077 if (g.qualified == name) {
1078 return &g;
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001079 }
Christopher Wileye6dee912015-09-22 14:50:23 -07001080 }
1081
1082 // then name match
1083 for (int i = 0; i < N; i++) {
1084 const Generic& g = m_generics[i];
1085 if (g.name == name) {
1086 return &g;
1087 }
1088 }
1089
1090 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001091}
1092
Christopher Wiley84c1eac2015-09-23 13:29:28 -07001093void JavaTypeNamespace::Dump() const {
Christopher Wileye6dee912015-09-22 14:50:23 -07001094 int n = m_types.size();
1095 for (int i = 0; i < n; i++) {
Christopher Wiley8f6816e2015-09-22 17:03:47 -07001096 const Type* t = m_types[i];
Christopher Wileye6dee912015-09-22 14:50:23 -07001097 printf("type: package=%s name=%s qualifiedName=%s\n", t->Package().c_str(),
1098 t->Name().c_str(), t->QualifiedName().c_str());
1099 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001100}
Christopher Wileyfdeb0f42015-09-11 15:38:22 -07001101
1102} // namespace aidl
1103} // namespace android