blob: 7ae5757da77e8d1f2265b22f18b493f638b4c7d1 [file] [log] [blame]
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001#include "Type.h"
2
David 'Digit' Turnera3372982014-03-04 16:43:41 +01003#include <sys/types.h>
4
Christopher Wileyfdeb0f42015-09-11 15:38:22 -07005namespace android {
6namespace aidl {
7
The Android Open Source Project46c012c2008-10-21 07:00:00 -07008Namespace NAMES;
9
10Type* VOID_TYPE;
11Type* BOOLEAN_TYPE;
12Type* BYTE_TYPE;
13Type* CHAR_TYPE;
14Type* INT_TYPE;
15Type* LONG_TYPE;
16Type* FLOAT_TYPE;
17Type* DOUBLE_TYPE;
18Type* STRING_TYPE;
Joe Onoratoc596cfe2011-08-30 17:24:17 -070019Type* OBJECT_TYPE;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070020Type* CHAR_SEQUENCE_TYPE;
21Type* TEXT_UTILS_TYPE;
22Type* REMOTE_EXCEPTION_TYPE;
23Type* RUNTIME_EXCEPTION_TYPE;
24Type* IBINDER_TYPE;
25Type* IINTERFACE_TYPE;
26Type* BINDER_NATIVE_TYPE;
27Type* BINDER_PROXY_TYPE;
28Type* PARCEL_TYPE;
29Type* PARCELABLE_INTERFACE_TYPE;
Joe Onoratoc596cfe2011-08-30 17:24:17 -070030Type* CONTEXT_TYPE;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070031Type* MAP_TYPE;
32Type* LIST_TYPE;
33Type* CLASSLOADER_TYPE;
34
35Expression* NULL_VALUE;
36Expression* THIS_VALUE;
37Expression* SUPER_VALUE;
38Expression* TRUE_VALUE;
39Expression* FALSE_VALUE;
40
Christopher Wileye6dee912015-09-22 14:50:23 -070041void register_base_types() {
42 VOID_TYPE = new BasicType("void", "XXX", "XXX", "XXX", "XXX", "XXX");
43 NAMES.Add(VOID_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070044
Christopher Wileye6dee912015-09-22 14:50:23 -070045 BOOLEAN_TYPE = new BooleanType();
46 NAMES.Add(BOOLEAN_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070047
Christopher Wileye6dee912015-09-22 14:50:23 -070048 BYTE_TYPE = new BasicType("byte", "writeByte", "readByte", "writeByteArray",
49 "createByteArray", "readByteArray");
50 NAMES.Add(BYTE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070051
Christopher Wileye6dee912015-09-22 14:50:23 -070052 CHAR_TYPE = new CharType();
53 NAMES.Add(CHAR_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070054
Christopher Wileye6dee912015-09-22 14:50:23 -070055 INT_TYPE = new BasicType("int", "writeInt", "readInt", "writeIntArray",
56 "createIntArray", "readIntArray");
57 NAMES.Add(INT_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070058
Christopher Wileye6dee912015-09-22 14:50:23 -070059 LONG_TYPE = new BasicType("long", "writeLong", "readLong", "writeLongArray",
60 "createLongArray", "readLongArray");
61 NAMES.Add(LONG_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070062
Christopher Wileye6dee912015-09-22 14:50:23 -070063 FLOAT_TYPE =
64 new BasicType("float", "writeFloat", "readFloat", "writeFloatArray",
65 "createFloatArray", "readFloatArray");
66 NAMES.Add(FLOAT_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070067
Christopher Wileye6dee912015-09-22 14:50:23 -070068 DOUBLE_TYPE =
69 new BasicType("double", "writeDouble", "readDouble", "writeDoubleArray",
70 "createDoubleArray", "readDoubleArray");
71 NAMES.Add(DOUBLE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070072
Christopher Wileye6dee912015-09-22 14:50:23 -070073 STRING_TYPE = new StringType();
74 NAMES.Add(STRING_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070075
Christopher Wileye6dee912015-09-22 14:50:23 -070076 OBJECT_TYPE = new Type("java.lang", "Object", Type::BUILT_IN, false, false);
77 NAMES.Add(OBJECT_TYPE);
Joe Onoratoc596cfe2011-08-30 17:24:17 -070078
Christopher Wileye6dee912015-09-22 14:50:23 -070079 CHAR_SEQUENCE_TYPE = new CharSequenceType();
80 NAMES.Add(CHAR_SEQUENCE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070081
Christopher Wileye6dee912015-09-22 14:50:23 -070082 MAP_TYPE = new MapType();
83 NAMES.Add(MAP_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070084
Christopher Wileye6dee912015-09-22 14:50:23 -070085 LIST_TYPE = new ListType();
86 NAMES.Add(LIST_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070087
Christopher Wileye6dee912015-09-22 14:50:23 -070088 TEXT_UTILS_TYPE =
89 new Type("android.text", "TextUtils", Type::BUILT_IN, false, false);
90 NAMES.Add(TEXT_UTILS_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070091
Christopher Wileye6dee912015-09-22 14:50:23 -070092 REMOTE_EXCEPTION_TYPE = new RemoteExceptionType();
93 NAMES.Add(REMOTE_EXCEPTION_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070094
Christopher Wileye6dee912015-09-22 14:50:23 -070095 RUNTIME_EXCEPTION_TYPE = new RuntimeExceptionType();
96 NAMES.Add(RUNTIME_EXCEPTION_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070097
Christopher Wileye6dee912015-09-22 14:50:23 -070098 IBINDER_TYPE = new IBinderType();
99 NAMES.Add(IBINDER_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700100
Christopher Wileye6dee912015-09-22 14:50:23 -0700101 IINTERFACE_TYPE = new IInterfaceType();
102 NAMES.Add(IINTERFACE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700103
Christopher Wileye6dee912015-09-22 14:50:23 -0700104 BINDER_NATIVE_TYPE = new BinderType();
105 NAMES.Add(BINDER_NATIVE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700106
Christopher Wileye6dee912015-09-22 14:50:23 -0700107 BINDER_PROXY_TYPE = new BinderProxyType();
108 NAMES.Add(BINDER_PROXY_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700109
Christopher Wileye6dee912015-09-22 14:50:23 -0700110 PARCEL_TYPE = new ParcelType();
111 NAMES.Add(PARCEL_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700112
Christopher Wileye6dee912015-09-22 14:50:23 -0700113 PARCELABLE_INTERFACE_TYPE = new ParcelableInterfaceType();
114 NAMES.Add(PARCELABLE_INTERFACE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700115
Christopher Wileye6dee912015-09-22 14:50:23 -0700116 CONTEXT_TYPE =
117 new Type("android.content", "Context", Type::BUILT_IN, false, false);
118 NAMES.Add(CONTEXT_TYPE);
Joe Onoratoc596cfe2011-08-30 17:24:17 -0700119
Christopher Wileye6dee912015-09-22 14:50:23 -0700120 CLASSLOADER_TYPE = new ClassLoaderType();
121 NAMES.Add(CLASSLOADER_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700122
Christopher Wileye6dee912015-09-22 14:50:23 -0700123 NULL_VALUE = new LiteralExpression("null");
124 THIS_VALUE = new LiteralExpression("this");
125 SUPER_VALUE = new LiteralExpression("super");
126 TRUE_VALUE = new LiteralExpression("true");
127 FALSE_VALUE = new LiteralExpression("false");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700128
Christopher Wileye6dee912015-09-22 14:50:23 -0700129 NAMES.AddGenericType("java.util", "List", 1);
130 NAMES.AddGenericType("java.util", "Map", 2);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700131}
132
Christopher Wileye6dee912015-09-22 14:50:23 -0700133static Type* make_generic_type(const string& package, const string& name,
134 const vector<Type*>& args) {
135 if (package == "java.util" && name == "List") {
136 return new GenericListType("java.util", "List", args);
137 }
138 return NULL;
139 // return new GenericType(package, name, args);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700140}
141
142// ================================================================
143
Casey Dahlin88868fc2015-09-01 13:21:26 -0700144Type::Type(const string& name, int kind, bool canWriteToParcel, bool canBeOut)
Christopher Wileye6dee912015-09-22 14:50:23 -0700145 : m_package(),
146 m_name(name),
147 m_declFile(""),
148 m_declLine(-1),
149 m_kind(kind),
150 m_canWriteToParcel(canWriteToParcel),
151 m_canBeOut(canBeOut) {
152 m_qualifiedName = name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700153}
154
Christopher Wileye6dee912015-09-22 14:50:23 -0700155Type::Type(const string& package, const string& name, int kind,
156 bool canWriteToParcel, bool canBeOut, const string& declFile,
157 int declLine)
158 : m_package(package),
159 m_name(name),
160 m_declFile(declFile),
161 m_declLine(declLine),
162 m_kind(kind),
163 m_canWriteToParcel(canWriteToParcel),
164 m_canBeOut(canBeOut) {
165 if (package.length() > 0) {
166 m_qualifiedName = package;
167 m_qualifiedName += '.';
168 }
169 m_qualifiedName += name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700170}
171
Christopher Wileye6dee912015-09-22 14:50:23 -0700172Type::~Type() {}
173
174string Type::HumanReadableKind() const {
175 switch (Kind()) {
176 case INTERFACE:
177 return "an interface";
178 case USERDATA:
179 return "a user data";
180 default:
181 return "ERROR";
182 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700183}
184
Christopher Wileye6dee912015-09-22 14:50:23 -0700185bool Type::CanBeArray() const { return false; }
186
187string Type::ImportType() const { return m_qualifiedName; }
188
189string Type::CreatorName() const { return ""; }
190
191string Type::InstantiableName() const { return QualifiedName(); }
192
193void Type::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
194 int flags) {
195 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%sn", __FILE__,
196 __LINE__, m_qualifiedName.c_str());
197 addTo->Add(new LiteralExpression("/* WriteToParcel error " + m_qualifiedName +
198 " */"));
Christopher Wileyf690be52015-09-14 15:19:10 -0700199}
200
Christopher Wileye6dee912015-09-22 14:50:23 -0700201void Type::CreateFromParcel(StatementBlock* addTo, Variable* v,
202 Variable* parcel, Variable**) {
203 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
204 __LINE__, m_qualifiedName.c_str());
205 addTo->Add(new LiteralExpression("/* CreateFromParcel error " +
206 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700207}
208
Christopher Wileye6dee912015-09-22 14:50:23 -0700209void Type::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
210 Variable**) {
211 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
212 __LINE__, m_qualifiedName.c_str());
213 addTo->Add(new LiteralExpression("/* ReadFromParcel error " +
214 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700215}
216
Christopher Wileye6dee912015-09-22 14:50:23 -0700217void Type::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
218 Variable* parcel, int flags) {
219 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
220 __LINE__, m_qualifiedName.c_str());
221 addTo->Add(new LiteralExpression("/* WriteArrayToParcel error " +
222 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700223}
224
Christopher Wileye6dee912015-09-22 14:50:23 -0700225void Type::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
226 Variable* parcel, Variable**) {
227 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
228 __LINE__, m_qualifiedName.c_str());
229 addTo->Add(new LiteralExpression("/* CreateArrayFromParcel error " +
230 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700231}
232
Christopher Wileye6dee912015-09-22 14:50:23 -0700233void Type::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
234 Variable* parcel, Variable**) {
235 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
236 __LINE__, m_qualifiedName.c_str());
237 addTo->Add(new LiteralExpression("/* ReadArrayFromParcel error " +
238 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700239}
240
Christopher Wileye6dee912015-09-22 14:50:23 -0700241void Type::SetQualifiedName(const string& qualified) {
242 m_qualifiedName = qualified;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700243}
244
Christopher Wileye6dee912015-09-22 14:50:23 -0700245Expression* Type::BuildWriteToParcelFlags(int flags) {
246 if (flags == 0) {
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700247 return new LiteralExpression("0");
Christopher Wileye6dee912015-09-22 14:50:23 -0700248 }
249 if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0) {
250 return new FieldVariable(PARCELABLE_INTERFACE_TYPE,
251 "PARCELABLE_WRITE_RETURN_VALUE");
252 }
253 return new LiteralExpression("0");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700254}
255
256// ================================================================
257
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700258BasicType::BasicType(const string& name, const string& marshallParcel,
Christopher Wileye6dee912015-09-22 14:50:23 -0700259 const string& unmarshallParcel,
260 const string& writeArrayParcel,
261 const string& createArrayParcel,
262 const string& readArrayParcel)
263 : Type(name, BUILT_IN, true, false),
264 m_marshallParcel(marshallParcel),
265 m_unmarshallParcel(unmarshallParcel),
266 m_writeArrayParcel(writeArrayParcel),
267 m_createArrayParcel(createArrayParcel),
268 m_readArrayParcel(readArrayParcel) {}
269
270void BasicType::WriteToParcel(StatementBlock* addTo, Variable* v,
271 Variable* parcel, int flags) {
272 addTo->Add(new MethodCall(parcel, m_marshallParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700273}
274
Christopher Wileye6dee912015-09-22 14:50:23 -0700275void BasicType::CreateFromParcel(StatementBlock* addTo, Variable* v,
276 Variable* parcel, Variable**) {
277 addTo->Add(new Assignment(v, new MethodCall(parcel, m_unmarshallParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700278}
279
Christopher Wileye6dee912015-09-22 14:50:23 -0700280bool BasicType::CanBeArray() const { return true; }
281
282void BasicType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
283 Variable* parcel, int flags) {
284 addTo->Add(new MethodCall(parcel, m_writeArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700285}
286
Christopher Wileye6dee912015-09-22 14:50:23 -0700287void BasicType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
288 Variable* parcel, Variable**) {
289 addTo->Add(new Assignment(v, new MethodCall(parcel, m_createArrayParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700290}
291
Christopher Wileye6dee912015-09-22 14:50:23 -0700292void BasicType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
293 Variable* parcel, Variable**) {
294 addTo->Add(new MethodCall(parcel, m_readArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700295}
296
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700297// ================================================================
298
Christopher Wileye6dee912015-09-22 14:50:23 -0700299BooleanType::BooleanType() : Type("boolean", BUILT_IN, true, false) {}
300
301void BooleanType::WriteToParcel(StatementBlock* addTo, Variable* v,
302 Variable* parcel, int flags) {
303 addTo->Add(new MethodCall(
304 parcel, "writeInt", 1,
305 new Ternary(v, new LiteralExpression("1"), new LiteralExpression("0"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700306}
307
Christopher Wileye6dee912015-09-22 14:50:23 -0700308void BooleanType::CreateFromParcel(StatementBlock* addTo, Variable* v,
309 Variable* parcel, Variable**) {
310 addTo->Add(
311 new Assignment(v, new Comparison(new LiteralExpression("0"), "!=",
312 new MethodCall(parcel, "readInt"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700313}
314
Christopher Wileye6dee912015-09-22 14:50:23 -0700315bool BooleanType::CanBeArray() const { return true; }
316
317void BooleanType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
318 Variable* parcel, int flags) {
319 addTo->Add(new MethodCall(parcel, "writeBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700320}
321
Christopher Wileye6dee912015-09-22 14:50:23 -0700322void BooleanType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
323 Variable* parcel, Variable**) {
324 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBooleanArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700325}
326
Christopher Wileye6dee912015-09-22 14:50:23 -0700327void BooleanType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
328 Variable* parcel, Variable**) {
329 addTo->Add(new MethodCall(parcel, "readBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700330}
331
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700332// ================================================================
333
Christopher Wileye6dee912015-09-22 14:50:23 -0700334CharType::CharType() : Type("char", BUILT_IN, true, false) {}
335
336void CharType::WriteToParcel(StatementBlock* addTo, Variable* v,
337 Variable* parcel, int flags) {
338 addTo->Add(new MethodCall(parcel, "writeInt", 1, new Cast(INT_TYPE, v)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700339}
340
Christopher Wileye6dee912015-09-22 14:50:23 -0700341void CharType::CreateFromParcel(StatementBlock* addTo, Variable* v,
342 Variable* parcel, Variable**) {
343 addTo->Add(new Assignment(v, new MethodCall(parcel, "readInt"), this));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700344}
345
Christopher Wileye6dee912015-09-22 14:50:23 -0700346bool CharType::CanBeArray() const { return true; }
347
348void CharType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
349 Variable* parcel, int flags) {
350 addTo->Add(new MethodCall(parcel, "writeCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700351}
352
Christopher Wileye6dee912015-09-22 14:50:23 -0700353void CharType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
354 Variable* parcel, Variable**) {
355 addTo->Add(new Assignment(v, new MethodCall(parcel, "createCharArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700356}
357
Christopher Wileye6dee912015-09-22 14:50:23 -0700358void CharType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
359 Variable* parcel, Variable**) {
360 addTo->Add(new MethodCall(parcel, "readCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700361}
362
363// ================================================================
364
Christopher Wileye6dee912015-09-22 14:50:23 -0700365StringType::StringType() : Type("java.lang", "String", BUILT_IN, true, false) {}
366
367string StringType::CreatorName() const {
368 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700369}
370
Christopher Wileye6dee912015-09-22 14:50:23 -0700371void StringType::WriteToParcel(StatementBlock* addTo, Variable* v,
372 Variable* parcel, int flags) {
373 addTo->Add(new MethodCall(parcel, "writeString", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700374}
375
Christopher Wileye6dee912015-09-22 14:50:23 -0700376void StringType::CreateFromParcel(StatementBlock* addTo, Variable* v,
377 Variable* parcel, Variable**) {
378 addTo->Add(new Assignment(v, new MethodCall(parcel, "readString")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700379}
380
Christopher Wileye6dee912015-09-22 14:50:23 -0700381bool StringType::CanBeArray() const { return true; }
382
383void StringType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
384 Variable* parcel, int flags) {
385 addTo->Add(new MethodCall(parcel, "writeStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700386}
387
Christopher Wileye6dee912015-09-22 14:50:23 -0700388void StringType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
389 Variable* parcel, Variable**) {
390 addTo->Add(new Assignment(v, new MethodCall(parcel, "createStringArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700391}
392
Christopher Wileye6dee912015-09-22 14:50:23 -0700393void StringType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
394 Variable* parcel, Variable**) {
395 addTo->Add(new MethodCall(parcel, "readStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700396}
397
398// ================================================================
399
400CharSequenceType::CharSequenceType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700401 : Type("java.lang", "CharSequence", BUILT_IN, true, false) {}
402
403string CharSequenceType::CreatorName() const {
404 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700405}
406
Christopher Wileye6dee912015-09-22 14:50:23 -0700407void CharSequenceType::WriteToParcel(StatementBlock* addTo, Variable* v,
408 Variable* parcel, int flags) {
409 // if (v != null) {
410 // parcel.writeInt(1);
411 // v.writeToParcel(parcel);
412 // } else {
413 // parcel.writeInt(0);
414 // }
415 IfStatement* elsepart = new IfStatement();
416 elsepart->statements->Add(
417 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
418 IfStatement* ifpart = new IfStatement;
419 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
420 ifpart->elseif = elsepart;
421 ifpart->statements->Add(
422 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
423 ifpart->statements->Add(new MethodCall(TEXT_UTILS_TYPE, "writeToParcel", 3, v,
424 parcel,
425 BuildWriteToParcelFlags(flags)));
426
427 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700428}
429
Christopher Wileye6dee912015-09-22 14:50:23 -0700430void CharSequenceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
431 Variable* parcel, Variable**) {
432 // if (0 != parcel.readInt()) {
433 // v = TextUtils.createFromParcel(parcel)
434 // } else {
435 // v = null;
436 // }
437 IfStatement* elsepart = new IfStatement();
438 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700439
Christopher Wileye6dee912015-09-22 14:50:23 -0700440 IfStatement* ifpart = new IfStatement();
441 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
442 new MethodCall(parcel, "readInt"));
443 ifpart->elseif = elsepart;
444 ifpart->statements->Add(new Assignment(
445 v, new MethodCall(TEXT_UTILS_TYPE,
446 "CHAR_SEQUENCE_CREATOR.createFromParcel", 1, parcel)));
447
448 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700449}
450
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700451// ================================================================
452
453RemoteExceptionType::RemoteExceptionType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700454 : Type("android.os", "RemoteException", BUILT_IN, false, false) {}
455
456void RemoteExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
457 Variable* parcel, int flags) {
458 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700459}
460
Christopher Wileye6dee912015-09-22 14:50:23 -0700461void RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
462 Variable* parcel, Variable**) {
463 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700464}
465
466// ================================================================
467
468RuntimeExceptionType::RuntimeExceptionType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700469 : Type("java.lang", "RuntimeException", BUILT_IN, false, false) {}
470
471void RuntimeExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
472 Variable* parcel, int flags) {
473 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700474}
475
Christopher Wileye6dee912015-09-22 14:50:23 -0700476void RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
477 Variable* parcel, Variable**) {
478 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700479}
480
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700481// ================================================================
482
483IBinderType::IBinderType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700484 : Type("android.os", "IBinder", BUILT_IN, true, false) {}
485
486void IBinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
487 Variable* parcel, int flags) {
488 addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700489}
490
Christopher Wileye6dee912015-09-22 14:50:23 -0700491void IBinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
492 Variable* parcel, Variable**) {
493 addTo->Add(new Assignment(v, new MethodCall(parcel, "readStrongBinder")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700494}
495
Christopher Wileye6dee912015-09-22 14:50:23 -0700496void IBinderType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
497 Variable* parcel, int flags) {
498 addTo->Add(new MethodCall(parcel, "writeBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700499}
500
Christopher Wileye6dee912015-09-22 14:50:23 -0700501void IBinderType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
502 Variable* parcel, Variable**) {
503 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBinderArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700504}
505
Christopher Wileye6dee912015-09-22 14:50:23 -0700506void IBinderType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
507 Variable* parcel, Variable**) {
508 addTo->Add(new MethodCall(parcel, "readBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700509}
510
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700511// ================================================================
512
513IInterfaceType::IInterfaceType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700514 : Type("android.os", "IInterface", BUILT_IN, false, false) {}
515
516void IInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
517 Variable* parcel, int flags) {
518 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700519}
520
Christopher Wileye6dee912015-09-22 14:50:23 -0700521void IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
522 Variable* parcel, Variable**) {
523 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700524}
525
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700526// ================================================================
527
528BinderType::BinderType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700529 : Type("android.os", "Binder", BUILT_IN, false, false) {}
530
531void BinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
532 Variable* parcel, int flags) {
533 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700534}
535
Christopher Wileye6dee912015-09-22 14:50:23 -0700536void BinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
537 Variable* parcel, Variable**) {
538 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700539}
540
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700541// ================================================================
542
543BinderProxyType::BinderProxyType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700544 : Type("android.os", "BinderProxy", BUILT_IN, false, false) {}
545
546void BinderProxyType::WriteToParcel(StatementBlock* addTo, Variable* v,
547 Variable* parcel, int flags) {
548 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700549}
550
Christopher Wileye6dee912015-09-22 14:50:23 -0700551void BinderProxyType::CreateFromParcel(StatementBlock* addTo, Variable* v,
552 Variable* parcel, Variable**) {
553 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700554}
555
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700556// ================================================================
557
558ParcelType::ParcelType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700559 : Type("android.os", "Parcel", BUILT_IN, false, false) {}
560
561void ParcelType::WriteToParcel(StatementBlock* addTo, Variable* v,
562 Variable* parcel, int flags) {
563 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700564}
565
Christopher Wileye6dee912015-09-22 14:50:23 -0700566void ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v,
567 Variable* parcel, Variable**) {
568 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700569}
570
571// ================================================================
572
573ParcelableInterfaceType::ParcelableInterfaceType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700574 : Type("android.os", "Parcelable", BUILT_IN, false, false) {}
575
576void ParcelableInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
577 Variable* parcel, int flags) {
578 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700579}
580
Christopher Wileye6dee912015-09-22 14:50:23 -0700581void ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo,
582 Variable* v, Variable* parcel,
583 Variable**) {
584 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700585}
586
587// ================================================================
588
Christopher Wileye6dee912015-09-22 14:50:23 -0700589MapType::MapType() : Type("java.util", "Map", BUILT_IN, true, true) {}
590
591void MapType::WriteToParcel(StatementBlock* addTo, Variable* v,
592 Variable* parcel, int flags) {
593 addTo->Add(new MethodCall(parcel, "writeMap", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700594}
595
Christopher Wileye6dee912015-09-22 14:50:23 -0700596static void EnsureClassLoader(StatementBlock* addTo, Variable** cl) {
597 // We don't want to look up the class loader once for every
598 // collection argument, so ensure we do it at most once per method.
599 if (*cl == NULL) {
600 *cl = new Variable(CLASSLOADER_TYPE, "cl");
601 addTo->Add(new VariableDeclaration(
602 *cl, new LiteralExpression("this.getClass().getClassLoader()"),
603 CLASSLOADER_TYPE));
604 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700605}
606
Christopher Wileye6dee912015-09-22 14:50:23 -0700607void MapType::CreateFromParcel(StatementBlock* addTo, Variable* v,
608 Variable* parcel, Variable** cl) {
609 EnsureClassLoader(addTo, cl);
610 addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, *cl)));
Elliott Hughes15f8da22011-07-13 12:10:30 -0700611}
612
Christopher Wileye6dee912015-09-22 14:50:23 -0700613void MapType::ReadFromParcel(StatementBlock* addTo, Variable* v,
614 Variable* parcel, Variable** cl) {
615 EnsureClassLoader(addTo, cl);
616 addTo->Add(new MethodCall(parcel, "readMap", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700617}
618
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700619// ================================================================
620
Christopher Wileye6dee912015-09-22 14:50:23 -0700621ListType::ListType() : Type("java.util", "List", BUILT_IN, true, true) {}
622
623string ListType::InstantiableName() const { return "java.util.ArrayList"; }
624
625void ListType::WriteToParcel(StatementBlock* addTo, Variable* v,
626 Variable* parcel, int flags) {
627 addTo->Add(new MethodCall(parcel, "writeList", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700628}
629
Christopher Wileye6dee912015-09-22 14:50:23 -0700630void ListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
631 Variable* parcel, Variable** cl) {
632 EnsureClassLoader(addTo, cl);
633 addTo->Add(
634 new Assignment(v, new MethodCall(parcel, "readArrayList", 1, *cl)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700635}
636
Christopher Wileye6dee912015-09-22 14:50:23 -0700637void ListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
638 Variable* parcel, Variable** cl) {
639 EnsureClassLoader(addTo, cl);
640 addTo->Add(new MethodCall(parcel, "readList", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700641}
642
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700643// ================================================================
644
Joe Onoratobaaf9c82011-10-09 22:31:16 -0700645UserDataType::UserDataType(const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700646 bool builtIn, bool canWriteToParcel,
647 const string& declFile, int declLine)
648 : Type(package, name, builtIn ? BUILT_IN : USERDATA, canWriteToParcel, true,
649 declFile, declLine) {}
650
651string UserDataType::CreatorName() const {
652 return QualifiedName() + ".CREATOR";
Joe Onorato44050522011-10-09 17:38:20 -0700653}
654
Christopher Wileye6dee912015-09-22 14:50:23 -0700655void UserDataType::WriteToParcel(StatementBlock* addTo, Variable* v,
656 Variable* parcel, int flags) {
657 // if (v != null) {
658 // parcel.writeInt(1);
659 // v.writeToParcel(parcel);
660 // } else {
661 // parcel.writeInt(0);
662 // }
663 IfStatement* elsepart = new IfStatement();
664 elsepart->statements->Add(
665 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
666 IfStatement* ifpart = new IfStatement;
667 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
668 ifpart->elseif = elsepart;
669 ifpart->statements->Add(
670 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
671 ifpart->statements->Add(new MethodCall(v, "writeToParcel", 2, parcel,
672 BuildWriteToParcelFlags(flags)));
673
674 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700675}
676
Christopher Wileye6dee912015-09-22 14:50:23 -0700677void UserDataType::CreateFromParcel(StatementBlock* addTo, Variable* v,
678 Variable* parcel, Variable**) {
679 // if (0 != parcel.readInt()) {
680 // v = CLASS.CREATOR.createFromParcel(parcel)
681 // } else {
682 // v = null;
683 // }
684 IfStatement* elsepart = new IfStatement();
685 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700686
Christopher Wileye6dee912015-09-22 14:50:23 -0700687 IfStatement* ifpart = new IfStatement();
688 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
689 new MethodCall(parcel, "readInt"));
690 ifpart->elseif = elsepart;
691 ifpart->statements->Add(new Assignment(
692 v, new MethodCall(v->type, "CREATOR.createFromParcel", 1, parcel)));
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::ReadFromParcel(StatementBlock* addTo, Variable* v,
698 Variable* parcel, Variable**) {
699 // TODO: really, we don't need to have this extra check, but we
700 // don't have two separate marshalling code paths
701 // if (0 != parcel.readInt()) {
702 // v.readFromParcel(parcel)
703 // }
704 IfStatement* ifpart = new IfStatement();
705 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
706 new MethodCall(parcel, "readInt"));
707 ifpart->statements->Add(new MethodCall(v, "readFromParcel", 1, parcel));
708 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700709}
710
Christopher Wileye6dee912015-09-22 14:50:23 -0700711bool UserDataType::CanBeArray() const { return true; }
712
713void UserDataType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
714 Variable* parcel, int flags) {
715 addTo->Add(new MethodCall(parcel, "writeTypedArray", 2, v,
716 BuildWriteToParcelFlags(flags)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700717}
718
Christopher Wileye6dee912015-09-22 14:50:23 -0700719void UserDataType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
720 Variable* parcel, Variable**) {
721 string creator = v->type->QualifiedName() + ".CREATOR";
722 addTo->Add(new Assignment(v, new MethodCall(parcel, "createTypedArray", 1,
723 new LiteralExpression(creator))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700724}
725
Christopher Wileye6dee912015-09-22 14:50:23 -0700726void UserDataType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
727 Variable* parcel, Variable**) {
728 string creator = v->type->QualifiedName() + ".CREATOR";
729 addTo->Add(new MethodCall(parcel, "readTypedArray", 2, v,
730 new LiteralExpression(creator)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700731}
732
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700733// ================================================================
734
735InterfaceType::InterfaceType(const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700736 bool builtIn, bool oneway, const string& declFile,
737 int declLine)
738 : Type(package, name, builtIn ? BUILT_IN : INTERFACE, true, false, declFile,
739 declLine),
740 m_oneway(oneway) {}
741
742bool InterfaceType::OneWay() const { return m_oneway; }
743
744void InterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
745 Variable* parcel, int flags) {
746 // parcel.writeStrongBinder(v != null ? v.asBinder() : null);
747 addTo->Add(
748 new MethodCall(parcel, "writeStrongBinder", 1,
749 new Ternary(new Comparison(v, "!=", NULL_VALUE),
750 new MethodCall(v, "asBinder"), NULL_VALUE)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700751}
752
Christopher Wileye6dee912015-09-22 14:50:23 -0700753void InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
754 Variable* parcel, Variable**) {
755 // v = Interface.asInterface(parcel.readStrongBinder());
756 string type = v->type->QualifiedName();
757 type += ".Stub";
758 addTo->Add(new Assignment(
759 v, new MethodCall(NAMES.Find(type), "asInterface", 1,
760 new MethodCall(parcel, "readStrongBinder"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700761}
762
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700763// ================================================================
764
765GenericType::GenericType(const string& package, const string& name,
766 const vector<Type*>& args)
Christopher Wileye6dee912015-09-22 14:50:23 -0700767 : Type(package, name, BUILT_IN, true, true) {
768 m_args = args;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700769
Christopher Wileye6dee912015-09-22 14:50:23 -0700770 m_importName = package + '.' + name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700771
Christopher Wileye6dee912015-09-22 14:50:23 -0700772 string gen = "<";
773 int N = args.size();
774 for (int i = 0; i < N; i++) {
775 Type* t = args[i];
776 gen += t->QualifiedName();
777 if (i != N - 1) {
778 gen += ',';
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700779 }
Christopher Wileye6dee912015-09-22 14:50:23 -0700780 }
781 gen += '>';
782 m_genericArguments = gen;
783 SetQualifiedName(m_importName + gen);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700784}
785
Christopher Wileye6dee912015-09-22 14:50:23 -0700786const vector<Type*>& GenericType::GenericArgumentTypes() const {
787 return m_args;
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700788}
789
Christopher Wileye6dee912015-09-22 14:50:23 -0700790string GenericType::GenericArguments() const { return m_genericArguments; }
791
792string GenericType::ImportType() const { return m_importName; }
793
794void GenericType::WriteToParcel(StatementBlock* addTo, Variable* v,
795 Variable* parcel, int flags) {
796 fprintf(stderr, "implement GenericType::WriteToParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700797}
798
Christopher Wileye6dee912015-09-22 14:50:23 -0700799void GenericType::CreateFromParcel(StatementBlock* addTo, Variable* v,
800 Variable* parcel, Variable**) {
801 fprintf(stderr, "implement GenericType::CreateFromParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700802}
803
Christopher Wileye6dee912015-09-22 14:50:23 -0700804void GenericType::ReadFromParcel(StatementBlock* addTo, Variable* v,
805 Variable* parcel, Variable**) {
806 fprintf(stderr, "implement GenericType::ReadFromParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700807}
808
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700809// ================================================================
810
811GenericListType::GenericListType(const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700812 const vector<Type*>& args)
813 : GenericType(package, name, args), m_creator(args[0]->CreatorName()) {}
814
815string GenericListType::CreatorName() const {
816 return "android.os.Parcel.arrayListCreator";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700817}
818
Christopher Wileye6dee912015-09-22 14:50:23 -0700819string GenericListType::InstantiableName() const {
820 return "java.util.ArrayList" + GenericArguments();
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700821}
822
Christopher Wileye6dee912015-09-22 14:50:23 -0700823void GenericListType::WriteToParcel(StatementBlock* addTo, Variable* v,
824 Variable* parcel, int flags) {
825 if (m_creator == STRING_TYPE->CreatorName()) {
826 addTo->Add(new MethodCall(parcel, "writeStringList", 1, v));
827 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
828 addTo->Add(new MethodCall(parcel, "writeBinderList", 1, v));
829 } else {
830 // parcel.writeTypedListXX(arg);
831 addTo->Add(new MethodCall(parcel, "writeTypedList", 1, v));
832 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700833}
834
Christopher Wileye6dee912015-09-22 14:50:23 -0700835void GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
836 Variable* parcel, Variable**) {
837 if (m_creator == STRING_TYPE->CreatorName()) {
838 addTo->Add(
839 new Assignment(v, new MethodCall(parcel, "createStringArrayList", 0)));
840 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
841 addTo->Add(
842 new Assignment(v, new MethodCall(parcel, "createBinderArrayList", 0)));
843 } else {
844 // v = _data.readTypedArrayList(XXX.creator);
845 addTo->Add(
846 new Assignment(v, new MethodCall(parcel, "createTypedArrayList", 1,
847 new LiteralExpression(m_creator))));
848 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700849}
850
Christopher Wileye6dee912015-09-22 14:50:23 -0700851void GenericListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
852 Variable* parcel, Variable**) {
853 if (m_creator == STRING_TYPE->CreatorName()) {
854 addTo->Add(new MethodCall(parcel, "readStringList", 1, v));
855 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
856 addTo->Add(new MethodCall(parcel, "readBinderList", 1, v));
857 } else {
858 // v = _data.readTypedList(v, XXX.creator);
859 addTo->Add(new MethodCall(parcel, "readTypedList", 2, v,
860 new LiteralExpression(m_creator)));
861 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700862}
863
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700864// ================================================================
865
866ClassLoaderType::ClassLoaderType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700867 : Type("java.lang", "ClassLoader", BUILT_IN, false, false) {}
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700868
869// ================================================================
870
Christopher Wileye6dee912015-09-22 14:50:23 -0700871Namespace::Namespace() {}
872
873Namespace::~Namespace() {
874 int N = m_types.size();
875 for (int i = 0; i < N; i++) {
876 delete m_types[i];
877 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700878}
879
Christopher Wileye6dee912015-09-22 14:50:23 -0700880void Namespace::Add(Type* type) {
881 Type* t = Find(type->QualifiedName());
882 if (t == NULL) {
883 m_types.push_back(type);
884 }
885}
886
887void Namespace::AddGenericType(const string& package, const string& name,
888 int args) {
889 Generic g;
890 g.package = package;
891 g.name = name;
892 g.qualified = package + '.' + name;
893 g.args = args;
894 m_generics.push_back(g);
895}
896
897Type* Namespace::Find(const string& name) const {
898 int N = m_types.size();
899 for (int i = 0; i < N; i++) {
900 if (m_types[i]->QualifiedName() == name) {
901 return m_types[i];
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700902 }
Christopher Wileye6dee912015-09-22 14:50:23 -0700903 }
904 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700905}
906
Christopher Wileye6dee912015-09-22 14:50:23 -0700907Type* Namespace::Find(const char* package, const char* name) const {
908 string s;
909 if (package != nullptr && *package != '\0') {
910 s += package;
911 s += '.';
912 }
913 s += name;
914 return Find(s);
915}
916
917static string normalize_generic(const string& s) {
918 string r;
919 int N = s.size();
920 for (int i = 0; i < N; i++) {
921 char c = s[i];
922 if (!isspace(c)) {
923 r += c;
924 }
925 }
926 return r;
927}
928
929Type* Namespace::Search(const string& name) {
930 // an exact match wins
931 Type* result = Find(name);
932 if (result != NULL) {
933 return result;
934 }
935
936 // try the class names
937 // our language doesn't allow you to not specify outer classes
938 // when referencing an inner class. that could be changed, and this
939 // would be the place to do it, but I don't think the complexity in
940 // scoping rules is worth it.
941 int N = m_types.size();
942 for (int i = 0; i < N; i++) {
943 if (m_types[i]->Name() == name) {
944 return m_types[i];
945 }
946 }
947
948 // we got to here and it's not a generic, give up
949 if (name.find('<') == name.npos) {
950 return NULL;
951 }
952
953 // remove any whitespace
954 string normalized = normalize_generic(name);
955
956 // find the part before the '<', find a generic for it
957 ssize_t baseIndex = normalized.find('<');
958 string base(normalized.c_str(), baseIndex);
959 const Generic* g = search_generic(base);
960 if (g == NULL) {
961 return NULL;
962 }
963
964 // For each of the args, do a recursive search on it. We don't allow
965 // generics within generics like Java does, because we're really limiting
966 // them to just built-in container classes, at least for now. Our syntax
967 // ensures this right now as well.
968 vector<Type*> args;
969 size_t start = baseIndex + 1;
970 size_t end = start;
971 while (normalized[start] != '\0') {
972 end = normalized.find(',', start);
973 if (end == normalized.npos) {
974 end = normalized.find('>', start);
975 }
976 string s(normalized.c_str() + start, end - start);
977 Type* t = this->Search(s);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700978 if (t == NULL) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700979 // maybe we should print a warning here?
980 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700981 }
Christopher Wileye6dee912015-09-22 14:50:23 -0700982 args.push_back(t);
983 start = end + 1;
984 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700985
Christopher Wileye6dee912015-09-22 14:50:23 -0700986 // construct a GenericType, add it to our name set so they always get
987 // the same object, and return it.
988 result = make_generic_type(g->package, g->name, args);
989 if (result == NULL) {
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700990 return NULL;
Christopher Wileye6dee912015-09-22 14:50:23 -0700991 }
992
993 this->Add(result);
994 return this->Find(result->QualifiedName());
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700995}
996
Christopher Wileye6dee912015-09-22 14:50:23 -0700997const Namespace::Generic* Namespace::search_generic(const string& name) const {
998 int N = m_generics.size();
999
1000 // first exact match
1001 for (int i = 0; i < N; i++) {
1002 const Generic& g = m_generics[i];
1003 if (g.qualified == name) {
1004 return &g;
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001005 }
Christopher Wileye6dee912015-09-22 14:50:23 -07001006 }
1007
1008 // then name match
1009 for (int i = 0; i < N; i++) {
1010 const Generic& g = m_generics[i];
1011 if (g.name == name) {
1012 return &g;
1013 }
1014 }
1015
1016 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001017}
1018
Christopher Wileye6dee912015-09-22 14:50:23 -07001019void Namespace::Dump() const {
1020 int n = m_types.size();
1021 for (int i = 0; i < n; i++) {
1022 Type* t = m_types[i];
1023 printf("type: package=%s name=%s qualifiedName=%s\n", t->Package().c_str(),
1024 t->Name().c_str(), t->QualifiedName().c_str());
1025 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001026}
Christopher Wileyfdeb0f42015-09-11 15:38:22 -07001027
1028} // namespace aidl
1029} // namespace android