blob: ae3dcda242809090a1c646f87b569ec767a49417 [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
The Android Open Source Project46c012c2008-10-21 07:00:00 -070027Expression* NULL_VALUE;
28Expression* THIS_VALUE;
29Expression* SUPER_VALUE;
30Expression* TRUE_VALUE;
31Expression* FALSE_VALUE;
32
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070033static Type* make_generic_type(const JavaTypeNamespace* types,
34 const string& package, const string& name,
Christopher Wiley8f6816e2015-09-22 17:03:47 -070035 const vector<const Type*>& args) {
Christopher Wileye6dee912015-09-22 14:50:23 -070036 if (package == "java.util" && name == "List") {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070037 return new GenericListType(types, "java.util", "List", args);
Christopher Wileye6dee912015-09-22 14:50:23 -070038 }
39 return NULL;
40 // return new GenericType(package, name, args);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070041}
42
43// ================================================================
44
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070045Type::Type(const JavaTypeNamespace* types, const string& name, int kind,
46 bool canWriteToParcel, bool canBeOut)
47 : m_types(types),
48 m_package(),
Christopher Wileye6dee912015-09-22 14:50:23 -070049 m_name(name),
50 m_declFile(""),
51 m_declLine(-1),
52 m_kind(kind),
53 m_canWriteToParcel(canWriteToParcel),
54 m_canBeOut(canBeOut) {
55 m_qualifiedName = name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070056}
57
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070058Type::Type(const JavaTypeNamespace* types, const string& package,
59 const string& name, int kind, bool canWriteToParcel, bool canBeOut,
60 const string& declFile, int declLine)
61 : m_types(types),
62 m_package(package),
Christopher Wileye6dee912015-09-22 14:50:23 -070063 m_name(name),
64 m_declFile(declFile),
65 m_declLine(declLine),
66 m_kind(kind),
67 m_canWriteToParcel(canWriteToParcel),
68 m_canBeOut(canBeOut) {
69 if (package.length() > 0) {
70 m_qualifiedName = package;
71 m_qualifiedName += '.';
72 }
73 m_qualifiedName += name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070074}
75
Christopher Wileye6dee912015-09-22 14:50:23 -070076Type::~Type() {}
77
78string Type::HumanReadableKind() const {
79 switch (Kind()) {
80 case INTERFACE:
81 return "an interface";
82 case USERDATA:
83 return "a user data";
84 default:
85 return "ERROR";
86 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -070087}
88
Christopher Wileye6dee912015-09-22 14:50:23 -070089bool Type::CanBeArray() const { return false; }
90
91string Type::ImportType() const { return m_qualifiedName; }
92
93string Type::CreatorName() const { return ""; }
94
95string Type::InstantiableName() const { return QualifiedName(); }
96
97void Type::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -070098 int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -070099 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%sn", __FILE__,
100 __LINE__, m_qualifiedName.c_str());
101 addTo->Add(new LiteralExpression("/* WriteToParcel error " + m_qualifiedName +
102 " */"));
Christopher Wileyf690be52015-09-14 15:19:10 -0700103}
104
Christopher Wileye6dee912015-09-22 14:50:23 -0700105void Type::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700106 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700107 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
108 __LINE__, m_qualifiedName.c_str());
109 addTo->Add(new LiteralExpression("/* CreateFromParcel error " +
110 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700111}
112
Christopher Wileye6dee912015-09-22 14:50:23 -0700113void Type::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700114 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700115 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
116 __LINE__, m_qualifiedName.c_str());
117 addTo->Add(new LiteralExpression("/* ReadFromParcel error " +
118 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700119}
120
Christopher Wileye6dee912015-09-22 14:50:23 -0700121void Type::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700122 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700123 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
124 __LINE__, m_qualifiedName.c_str());
125 addTo->Add(new LiteralExpression("/* WriteArrayToParcel error " +
126 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700127}
128
Christopher Wileye6dee912015-09-22 14:50:23 -0700129void Type::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700130 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700131 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
132 __LINE__, m_qualifiedName.c_str());
133 addTo->Add(new LiteralExpression("/* CreateArrayFromParcel error " +
134 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700135}
136
Christopher Wileye6dee912015-09-22 14:50:23 -0700137void Type::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700138 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700139 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
140 __LINE__, m_qualifiedName.c_str());
141 addTo->Add(new LiteralExpression("/* ReadArrayFromParcel error " +
142 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700143}
144
Christopher Wileye6dee912015-09-22 14:50:23 -0700145void Type::SetQualifiedName(const string& qualified) {
146 m_qualifiedName = qualified;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700147}
148
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700149Expression* Type::BuildWriteToParcelFlags(int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700150 if (flags == 0) {
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700151 return new LiteralExpression("0");
Christopher Wileye6dee912015-09-22 14:50:23 -0700152 }
153 if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0) {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700154 return new FieldVariable(m_types->ParcelableInterfaceType(),
Christopher Wileye6dee912015-09-22 14:50:23 -0700155 "PARCELABLE_WRITE_RETURN_VALUE");
156 }
157 return new LiteralExpression("0");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700158}
159
160// ================================================================
161
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700162BasicType::BasicType(const JavaTypeNamespace* types, const string& name,
163 const string& marshallParcel,
Christopher Wileye6dee912015-09-22 14:50:23 -0700164 const string& unmarshallParcel,
165 const string& writeArrayParcel,
166 const string& createArrayParcel,
167 const string& readArrayParcel)
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700168 : Type(types, name, BUILT_IN, true, false),
Christopher Wileye6dee912015-09-22 14:50:23 -0700169 m_marshallParcel(marshallParcel),
170 m_unmarshallParcel(unmarshallParcel),
171 m_writeArrayParcel(writeArrayParcel),
172 m_createArrayParcel(createArrayParcel),
173 m_readArrayParcel(readArrayParcel) {}
174
175void BasicType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700176 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700177 addTo->Add(new MethodCall(parcel, m_marshallParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700178}
179
Christopher Wileye6dee912015-09-22 14:50:23 -0700180void BasicType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700181 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700182 addTo->Add(new Assignment(v, new MethodCall(parcel, m_unmarshallParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700183}
184
Christopher Wileye6dee912015-09-22 14:50:23 -0700185bool BasicType::CanBeArray() const { return true; }
186
187void BasicType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700188 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700189 addTo->Add(new MethodCall(parcel, m_writeArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700190}
191
Christopher Wileye6dee912015-09-22 14:50:23 -0700192void BasicType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700193 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700194 addTo->Add(new Assignment(v, new MethodCall(parcel, m_createArrayParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700195}
196
Christopher Wileye6dee912015-09-22 14:50:23 -0700197void BasicType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700198 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700199 addTo->Add(new MethodCall(parcel, m_readArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700200}
201
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700202// ================================================================
203
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700204BooleanType::BooleanType(const JavaTypeNamespace* types)
205 : Type(types, "boolean", BUILT_IN, true, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700206
207void BooleanType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700208 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700209 addTo->Add(new MethodCall(
210 parcel, "writeInt", 1,
211 new Ternary(v, new LiteralExpression("1"), new LiteralExpression("0"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700212}
213
Christopher Wileye6dee912015-09-22 14:50:23 -0700214void BooleanType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700215 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700216 addTo->Add(
217 new Assignment(v, new Comparison(new LiteralExpression("0"), "!=",
218 new MethodCall(parcel, "readInt"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700219}
220
Christopher Wileye6dee912015-09-22 14:50:23 -0700221bool BooleanType::CanBeArray() const { return true; }
222
223void BooleanType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700224 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700225 addTo->Add(new MethodCall(parcel, "writeBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700226}
227
Christopher Wileye6dee912015-09-22 14:50:23 -0700228void BooleanType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700229 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700230 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBooleanArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700231}
232
Christopher Wileye6dee912015-09-22 14:50:23 -0700233void BooleanType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700234 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700235 addTo->Add(new MethodCall(parcel, "readBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700236}
237
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700238// ================================================================
239
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700240CharType::CharType(const JavaTypeNamespace* types)
241 : Type(types, "char", BUILT_IN, true, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700242
243void CharType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700244 Variable* parcel, int flags) const {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700245 addTo->Add(
246 new MethodCall(parcel, "writeInt", 1, new Cast(m_types->IntType(), v)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700247}
248
Christopher Wileye6dee912015-09-22 14:50:23 -0700249void CharType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700250 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700251 addTo->Add(new Assignment(v, new MethodCall(parcel, "readInt"), this));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700252}
253
Christopher Wileye6dee912015-09-22 14:50:23 -0700254bool CharType::CanBeArray() const { return true; }
255
256void CharType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700257 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700258 addTo->Add(new MethodCall(parcel, "writeCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700259}
260
Christopher Wileye6dee912015-09-22 14:50:23 -0700261void CharType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700262 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700263 addTo->Add(new Assignment(v, new MethodCall(parcel, "createCharArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700264}
265
Christopher Wileye6dee912015-09-22 14:50:23 -0700266void CharType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700267 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700268 addTo->Add(new MethodCall(parcel, "readCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700269}
270
271// ================================================================
272
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700273StringType::StringType(const JavaTypeNamespace* types)
274 : Type(types, "java.lang", "String", BUILT_IN, true, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700275
276string StringType::CreatorName() const {
277 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700278}
279
Christopher Wileye6dee912015-09-22 14:50:23 -0700280void StringType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700281 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700282 addTo->Add(new MethodCall(parcel, "writeString", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700283}
284
Christopher Wileye6dee912015-09-22 14:50:23 -0700285void StringType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700286 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700287 addTo->Add(new Assignment(v, new MethodCall(parcel, "readString")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700288}
289
Christopher Wileye6dee912015-09-22 14:50:23 -0700290bool StringType::CanBeArray() const { return true; }
291
292void StringType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700293 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700294 addTo->Add(new MethodCall(parcel, "writeStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700295}
296
Christopher Wileye6dee912015-09-22 14:50:23 -0700297void StringType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700298 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700299 addTo->Add(new Assignment(v, new MethodCall(parcel, "createStringArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700300}
301
Christopher Wileye6dee912015-09-22 14:50:23 -0700302void StringType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700303 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700304 addTo->Add(new MethodCall(parcel, "readStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700305}
306
307// ================================================================
308
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700309CharSequenceType::CharSequenceType(const JavaTypeNamespace* types)
310 : Type(types, "java.lang", "CharSequence", BUILT_IN, true, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700311
312string CharSequenceType::CreatorName() const {
313 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700314}
315
Christopher Wileye6dee912015-09-22 14:50:23 -0700316void CharSequenceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700317 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700318 // if (v != null) {
319 // parcel.writeInt(1);
320 // v.writeToParcel(parcel);
321 // } else {
322 // parcel.writeInt(0);
323 // }
324 IfStatement* elsepart = new IfStatement();
325 elsepart->statements->Add(
326 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
327 IfStatement* ifpart = new IfStatement;
328 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
329 ifpart->elseif = elsepart;
330 ifpart->statements->Add(
331 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700332 ifpart->statements->Add(new MethodCall(m_types->TextUtilsType(),
333 "writeToParcel", 3, v, parcel,
Christopher Wileye6dee912015-09-22 14:50:23 -0700334 BuildWriteToParcelFlags(flags)));
335
336 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700337}
338
Christopher Wileye6dee912015-09-22 14:50:23 -0700339void CharSequenceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700340 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700341 // if (0 != parcel.readInt()) {
342 // v = TextUtils.createFromParcel(parcel)
343 // } else {
344 // v = null;
345 // }
346 IfStatement* elsepart = new IfStatement();
347 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700348
Christopher Wileye6dee912015-09-22 14:50:23 -0700349 IfStatement* ifpart = new IfStatement();
350 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
351 new MethodCall(parcel, "readInt"));
352 ifpart->elseif = elsepart;
353 ifpart->statements->Add(new Assignment(
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700354 v, new MethodCall(m_types->TextUtilsType(),
Christopher Wileye6dee912015-09-22 14:50:23 -0700355 "CHAR_SEQUENCE_CREATOR.createFromParcel", 1, parcel)));
356
357 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700358}
359
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700360// ================================================================
361
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700362RemoteExceptionType::RemoteExceptionType(const JavaTypeNamespace* types)
363 : Type(types, "android.os", "RemoteException", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700364
365void RemoteExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700366 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700367 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700368}
369
Christopher Wileye6dee912015-09-22 14:50:23 -0700370void RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700371 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700372 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700373}
374
375// ================================================================
376
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700377RuntimeExceptionType::RuntimeExceptionType(const JavaTypeNamespace* types)
378 : Type(types, "java.lang", "RuntimeException", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700379
380void RuntimeExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700381 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700382 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700383}
384
Christopher Wileye6dee912015-09-22 14:50:23 -0700385void RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700386 Variable* parcel,
387 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700388 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700389}
390
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700391// ================================================================
392
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700393IBinderType::IBinderType(const JavaTypeNamespace* types)
394 : Type(types, "android.os", "IBinder", BUILT_IN, true, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700395
396void IBinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700397 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700398 addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700399}
400
Christopher Wileye6dee912015-09-22 14:50:23 -0700401void IBinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700402 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700403 addTo->Add(new Assignment(v, new MethodCall(parcel, "readStrongBinder")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700404}
405
Christopher Wileye6dee912015-09-22 14:50:23 -0700406void IBinderType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700407 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700408 addTo->Add(new MethodCall(parcel, "writeBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700409}
410
Christopher Wileye6dee912015-09-22 14:50:23 -0700411void IBinderType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700412 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700413 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBinderArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700414}
415
Christopher Wileye6dee912015-09-22 14:50:23 -0700416void IBinderType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700417 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700418 addTo->Add(new MethodCall(parcel, "readBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700419}
420
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700421// ================================================================
422
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700423IInterfaceType::IInterfaceType(const JavaTypeNamespace* types)
424 : Type(types, "android.os", "IInterface", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700425
426void IInterfaceType::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 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700429}
430
Christopher Wileye6dee912015-09-22 14:50:23 -0700431void IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700432 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700433 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700434}
435
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700436// ================================================================
437
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700438BinderType::BinderType(const JavaTypeNamespace* types)
439 : Type(types, "android.os", "Binder", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700440
441void BinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700442 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700443 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700444}
445
Christopher Wileye6dee912015-09-22 14:50:23 -0700446void BinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700447 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700448 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700449}
450
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700451// ================================================================
452
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700453BinderProxyType::BinderProxyType(const JavaTypeNamespace* types)
454 : Type(types, "android.os", "BinderProxy", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700455
456void BinderProxyType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700457 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700458 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 BinderProxyType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700462 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700463 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700464}
465
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700466// ================================================================
467
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700468ParcelType::ParcelType(const JavaTypeNamespace* types)
469 : Type(types, "android.os", "Parcel", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700470
471void ParcelType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700472 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700473 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 ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700477 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700478 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700479}
480
481// ================================================================
482
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700483ParcelableInterfaceType::ParcelableInterfaceType(const JavaTypeNamespace* types)
484 : Type(types, "android.os", "Parcelable", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700485
486void ParcelableInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700487 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700488 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700489}
490
Christopher Wileye6dee912015-09-22 14:50:23 -0700491void ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo,
492 Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700493 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700494 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700495}
496
497// ================================================================
498
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700499MapType::MapType(const JavaTypeNamespace* types)
500 : Type(types, "java.util", "Map", BUILT_IN, true, true) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700501
502void MapType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700503 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700504 addTo->Add(new MethodCall(parcel, "writeMap", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700505}
506
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700507static void EnsureClassLoader(StatementBlock* addTo, Variable** cl,
508 const JavaTypeNamespace* types) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700509 // We don't want to look up the class loader once for every
510 // collection argument, so ensure we do it at most once per method.
511 if (*cl == NULL) {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700512 *cl = new Variable(types->ClassLoaderType(), "cl");
Christopher Wileye6dee912015-09-22 14:50:23 -0700513 addTo->Add(new VariableDeclaration(
514 *cl, new LiteralExpression("this.getClass().getClassLoader()"),
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700515 types->ClassLoaderType()));
Christopher Wileye6dee912015-09-22 14:50:23 -0700516 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700517}
518
Christopher Wileye6dee912015-09-22 14:50:23 -0700519void MapType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700520 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700521 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700522 addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, *cl)));
Elliott Hughes15f8da22011-07-13 12:10:30 -0700523}
524
Christopher Wileye6dee912015-09-22 14:50:23 -0700525void MapType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700526 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700527 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700528 addTo->Add(new MethodCall(parcel, "readMap", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700529}
530
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700531// ================================================================
532
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700533ListType::ListType(const JavaTypeNamespace* types)
534 : Type(types, "java.util", "List", BUILT_IN, true, true) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700535
536string ListType::InstantiableName() const { return "java.util.ArrayList"; }
537
538void ListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700539 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700540 addTo->Add(new MethodCall(parcel, "writeList", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700541}
542
Christopher Wileye6dee912015-09-22 14:50:23 -0700543void ListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700544 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700545 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700546 addTo->Add(
547 new Assignment(v, new MethodCall(parcel, "readArrayList", 1, *cl)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700548}
549
Christopher Wileye6dee912015-09-22 14:50:23 -0700550void ListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700551 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700552 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700553 addTo->Add(new MethodCall(parcel, "readList", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700554}
555
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700556// ================================================================
557
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700558UserDataType::UserDataType(const JavaTypeNamespace* types,
559 const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700560 bool builtIn, bool canWriteToParcel,
561 const string& declFile, int declLine)
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700562 : Type(types, package, name, builtIn ? BUILT_IN : USERDATA,
563 canWriteToParcel, true, declFile, declLine) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700564
565string UserDataType::CreatorName() const {
566 return QualifiedName() + ".CREATOR";
Joe Onorato44050522011-10-09 17:38:20 -0700567}
568
Christopher Wileye6dee912015-09-22 14:50:23 -0700569void UserDataType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700570 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700571 // if (v != null) {
572 // parcel.writeInt(1);
573 // v.writeToParcel(parcel);
574 // } else {
575 // parcel.writeInt(0);
576 // }
577 IfStatement* elsepart = new IfStatement();
578 elsepart->statements->Add(
579 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
580 IfStatement* ifpart = new IfStatement;
581 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
582 ifpart->elseif = elsepart;
583 ifpart->statements->Add(
584 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
585 ifpart->statements->Add(new MethodCall(v, "writeToParcel", 2, parcel,
586 BuildWriteToParcelFlags(flags)));
587
588 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700589}
590
Christopher Wileye6dee912015-09-22 14:50:23 -0700591void UserDataType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700592 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700593 // if (0 != parcel.readInt()) {
594 // v = CLASS.CREATOR.createFromParcel(parcel)
595 // } else {
596 // v = null;
597 // }
598 IfStatement* elsepart = new IfStatement();
599 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700600
Christopher Wileye6dee912015-09-22 14:50:23 -0700601 IfStatement* ifpart = new IfStatement();
602 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
603 new MethodCall(parcel, "readInt"));
604 ifpart->elseif = elsepart;
605 ifpart->statements->Add(new Assignment(
606 v, new MethodCall(v->type, "CREATOR.createFromParcel", 1, parcel)));
607
608 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700609}
610
Christopher Wileye6dee912015-09-22 14:50:23 -0700611void UserDataType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700612 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700613 // TODO: really, we don't need to have this extra check, but we
614 // don't have two separate marshalling code paths
615 // if (0 != parcel.readInt()) {
616 // v.readFromParcel(parcel)
617 // }
618 IfStatement* ifpart = new IfStatement();
619 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
620 new MethodCall(parcel, "readInt"));
621 ifpart->statements->Add(new MethodCall(v, "readFromParcel", 1, parcel));
622 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700623}
624
Christopher Wileye6dee912015-09-22 14:50:23 -0700625bool UserDataType::CanBeArray() const { return true; }
626
627void UserDataType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700628 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700629 addTo->Add(new MethodCall(parcel, "writeTypedArray", 2, v,
630 BuildWriteToParcelFlags(flags)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700631}
632
Christopher Wileye6dee912015-09-22 14:50:23 -0700633void UserDataType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700634 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700635 string creator = v->type->QualifiedName() + ".CREATOR";
636 addTo->Add(new Assignment(v, new MethodCall(parcel, "createTypedArray", 1,
637 new LiteralExpression(creator))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700638}
639
Christopher Wileye6dee912015-09-22 14:50:23 -0700640void UserDataType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700641 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700642 string creator = v->type->QualifiedName() + ".CREATOR";
643 addTo->Add(new MethodCall(parcel, "readTypedArray", 2, v,
644 new LiteralExpression(creator)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700645}
646
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700647// ================================================================
648
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700649InterfaceType::InterfaceType(const JavaTypeNamespace* types,
650 const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700651 bool builtIn, bool oneway, const string& declFile,
652 int declLine)
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700653 : Type(types, package, name, builtIn ? BUILT_IN : INTERFACE, true, false,
654 declFile, declLine),
Christopher Wileye6dee912015-09-22 14:50:23 -0700655 m_oneway(oneway) {}
656
657bool InterfaceType::OneWay() const { return m_oneway; }
658
659void InterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700660 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700661 // parcel.writeStrongBinder(v != null ? v.asBinder() : null);
662 addTo->Add(
663 new MethodCall(parcel, "writeStrongBinder", 1,
664 new Ternary(new Comparison(v, "!=", NULL_VALUE),
665 new MethodCall(v, "asBinder"), NULL_VALUE)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700666}
667
Christopher Wileye6dee912015-09-22 14:50:23 -0700668void InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700669 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700670 // v = Interface.asInterface(parcel.readStrongBinder());
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700671 string stub_type = v->type->QualifiedName() + ".Stub";
Christopher Wileye6dee912015-09-22 14:50:23 -0700672 addTo->Add(new Assignment(
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700673 v, new MethodCall(m_types->Find(stub_type), "asInterface", 1,
Christopher Wileye6dee912015-09-22 14:50:23 -0700674 new MethodCall(parcel, "readStrongBinder"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700675}
676
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700677// ================================================================
678
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700679GenericType::GenericType(const JavaTypeNamespace* types, const string& package,
680 const string& name, const vector<const Type*>& args)
681 : Type(types, package, name, BUILT_IN, true, true) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700682 m_args = args;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700683
Christopher Wileye6dee912015-09-22 14:50:23 -0700684 m_importName = package + '.' + name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700685
Christopher Wileye6dee912015-09-22 14:50:23 -0700686 string gen = "<";
687 int N = args.size();
688 for (int i = 0; i < N; i++) {
Christopher Wiley8f6816e2015-09-22 17:03:47 -0700689 const Type* t = args[i];
Christopher Wileye6dee912015-09-22 14:50:23 -0700690 gen += t->QualifiedName();
691 if (i != N - 1) {
692 gen += ',';
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700693 }
Christopher Wileye6dee912015-09-22 14:50:23 -0700694 }
695 gen += '>';
696 m_genericArguments = gen;
697 SetQualifiedName(m_importName + gen);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700698}
699
Christopher Wiley8f6816e2015-09-22 17:03:47 -0700700const vector<const Type*>& GenericType::GenericArgumentTypes() const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700701 return m_args;
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700702}
703
Christopher Wileye6dee912015-09-22 14:50:23 -0700704string GenericType::GenericArguments() const { return m_genericArguments; }
705
706string GenericType::ImportType() const { return m_importName; }
707
708void GenericType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700709 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700710 fprintf(stderr, "implement GenericType::WriteToParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700711}
712
Christopher Wileye6dee912015-09-22 14:50:23 -0700713void GenericType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700714 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700715 fprintf(stderr, "implement GenericType::CreateFromParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700716}
717
Christopher Wileye6dee912015-09-22 14:50:23 -0700718void GenericType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700719 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700720 fprintf(stderr, "implement GenericType::ReadFromParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700721}
722
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700723// ================================================================
724
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700725GenericListType::GenericListType(const JavaTypeNamespace* types,
726 const string& package, const string& name,
Christopher Wiley8f6816e2015-09-22 17:03:47 -0700727 const vector<const Type*>& args)
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700728 : GenericType(types, package, name, args),
729 m_creator(args[0]->CreatorName()) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700730
731string GenericListType::CreatorName() const {
732 return "android.os.Parcel.arrayListCreator";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700733}
734
Christopher Wileye6dee912015-09-22 14:50:23 -0700735string GenericListType::InstantiableName() const {
736 return "java.util.ArrayList" + GenericArguments();
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700737}
738
Christopher Wileye6dee912015-09-22 14:50:23 -0700739void GenericListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700740 Variable* parcel, int flags) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700741 if (m_creator == m_types->StringType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700742 addTo->Add(new MethodCall(parcel, "writeStringList", 1, v));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700743 } else if (m_creator == m_types->IBinderType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700744 addTo->Add(new MethodCall(parcel, "writeBinderList", 1, v));
745 } else {
746 // parcel.writeTypedListXX(arg);
747 addTo->Add(new MethodCall(parcel, "writeTypedList", 1, v));
748 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700749}
750
Christopher Wileye6dee912015-09-22 14:50:23 -0700751void GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700752 Variable* parcel, Variable**) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700753 if (m_creator == m_types->StringType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700754 addTo->Add(
755 new Assignment(v, new MethodCall(parcel, "createStringArrayList", 0)));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700756 } else if (m_creator == m_types->IBinderType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700757 addTo->Add(
758 new Assignment(v, new MethodCall(parcel, "createBinderArrayList", 0)));
759 } else {
760 // v = _data.readTypedArrayList(XXX.creator);
761 addTo->Add(
762 new Assignment(v, new MethodCall(parcel, "createTypedArrayList", 1,
763 new LiteralExpression(m_creator))));
764 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700765}
766
Christopher Wileye6dee912015-09-22 14:50:23 -0700767void GenericListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700768 Variable* parcel, Variable**) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700769 if (m_creator == m_types->StringType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700770 addTo->Add(new MethodCall(parcel, "readStringList", 1, v));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700771 } else if (m_creator == m_types->IBinderType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700772 addTo->Add(new MethodCall(parcel, "readBinderList", 1, v));
773 } else {
774 // v = _data.readTypedList(v, XXX.creator);
775 addTo->Add(new MethodCall(parcel, "readTypedList", 2, v,
776 new LiteralExpression(m_creator)));
777 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700778}
779
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700780// ================================================================
781
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700782ClassLoaderType::ClassLoaderType(const JavaTypeNamespace* types)
783 : Type(types, "java.lang", "ClassLoader", BUILT_IN, false, false) {}
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700784
785// ================================================================
786
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700787JavaTypeNamespace::JavaTypeNamespace() {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700788 Add(new BasicType(this, "void", "XXX", "XXX", "XXX", "XXX", "XXX"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700789
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700790 m_bool_type = new BooleanType(this);
791 Add(m_bool_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700792
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700793 Add(new BasicType(this, "byte", "writeByte", "readByte", "writeByteArray",
794 "createByteArray", "readByteArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700795
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700796 Add(new CharType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700797
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700798 m_int_type = new BasicType(this, "int", "writeInt", "readInt",
799 "writeIntArray", "createIntArray", "readIntArray");
800 Add(m_int_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700801
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700802 Add(new BasicType(this, "long", "writeLong", "readLong", "writeLongArray",
803 "createLongArray", "readLongArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700804
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700805 Add(new BasicType(this, "float", "writeFloat", "readFloat", "writeFloatArray",
806 "createFloatArray", "readFloatArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700807
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700808 Add(new BasicType(this, "double", "writeDouble", "readDouble",
809 "writeDoubleArray", "createDoubleArray",
810 "readDoubleArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700811
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700812 m_string_type = new class StringType(this);
813 Add(m_string_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700814
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700815 Add(new Type(this, "java.lang", "Object", Type::BUILT_IN, false, false));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700816
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700817 Add(new CharSequenceType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700818
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700819 Add(new MapType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700820
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700821 Add(new ListType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700822
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700823 m_text_utils_type =
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700824 new Type(this, "android.text", "TextUtils", Type::BUILT_IN, false, false);
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700825 Add(m_text_utils_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700826
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700827 m_remote_exception_type = new class RemoteExceptionType(this);
828 Add(m_remote_exception_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700829
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700830 m_runtime_exception_type = new class RuntimeExceptionType(this);
831 Add(m_runtime_exception_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700832
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700833 m_ibinder_type = new class IBinderType(this);
834 Add(m_ibinder_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700835
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700836 m_iinterface_type = new class IInterfaceType(this);
837 Add(m_iinterface_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700838
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700839 m_binder_native_type = new class BinderType(this);
840 Add(m_binder_native_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700841
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700842 m_binder_proxy_type = new class BinderProxyType(this);
843 Add(m_binder_proxy_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700844
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700845 m_parcel_type = new class ParcelType(this);
846 Add(m_parcel_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700847
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700848 m_parcelable_interface_type = new class ParcelableInterfaceType(this);
849 Add(m_parcelable_interface_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700850
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700851 m_context_type = new class Type(this, "android.content", "Context",
852 Type::BUILT_IN, false, false);
853 Add(m_context_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700854
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700855 m_classloader_type = new class ClassLoaderType(this);
856 Add(m_classloader_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700857
858 NULL_VALUE = new LiteralExpression("null");
859 THIS_VALUE = new LiteralExpression("this");
860 SUPER_VALUE = new LiteralExpression("super");
861 TRUE_VALUE = new LiteralExpression("true");
862 FALSE_VALUE = new LiteralExpression("false");
863
864 AddGenericType("java.util", "List", 1);
865 AddGenericType("java.util", "Map", 2);
866}
Christopher Wileye6dee912015-09-22 14:50:23 -0700867
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700868JavaTypeNamespace::~JavaTypeNamespace() {
Christopher Wileye6dee912015-09-22 14:50:23 -0700869 int N = m_types.size();
870 for (int i = 0; i < N; i++) {
871 delete m_types[i];
872 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700873}
874
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700875bool JavaTypeNamespace::Add(const Type* type) {
876 const Type* existing = Find(type->QualifiedName());
877 if (!existing) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700878 m_types.push_back(type);
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700879 return true;
Christopher Wileye6dee912015-09-22 14:50:23 -0700880 }
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700881
882 if (existing->Kind() == Type::BUILT_IN) {
883 fprintf(stderr, "%s:%d attempt to redefine built in class %s\n",
884 type->DeclFile().c_str(), type->DeclLine(),
885 type->QualifiedName().c_str());
886 return false;
887 }
888
889 if (type->Kind() != existing->Kind()) {
890 fprintf(stderr, "%s:%d attempt to redefine %s as %s,\n",
891 type->DeclFile().c_str(), type->DeclLine(),
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700892 type->QualifiedName().c_str(), type->HumanReadableKind().c_str());
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700893 fprintf(stderr, "%s:%d previously defined here as %s.\n",
894 existing->DeclFile().c_str(), existing->DeclLine(),
895 existing->HumanReadableKind().c_str());
896 return false;
897 }
898
899 return true;
Christopher Wileye6dee912015-09-22 14:50:23 -0700900}
901
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700902void JavaTypeNamespace::AddGenericType(const string& package,
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700903 const string& name, int args) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700904 Generic g;
905 g.package = package;
906 g.name = name;
907 g.qualified = package + '.' + name;
908 g.args = args;
909 m_generics.push_back(g);
910}
911
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700912const Type* JavaTypeNamespace::Find(const string& name) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700913 int N = m_types.size();
914 for (int i = 0; i < N; i++) {
915 if (m_types[i]->QualifiedName() == name) {
916 return m_types[i];
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700917 }
Christopher Wileye6dee912015-09-22 14:50:23 -0700918 }
919 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700920}
921
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700922const Type* JavaTypeNamespace::Find(const char* package,
923 const char* name) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700924 string s;
925 if (package != nullptr && *package != '\0') {
926 s += package;
927 s += '.';
928 }
929 s += name;
930 return Find(s);
931}
932
933static string normalize_generic(const string& s) {
934 string r;
935 int N = s.size();
936 for (int i = 0; i < N; i++) {
937 char c = s[i];
938 if (!isspace(c)) {
939 r += c;
940 }
941 }
942 return r;
943}
944
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700945bool JavaTypeNamespace::AddParcelableType(user_data_type* p,
946 const std::string& filename) {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700947 Type* type =
948 new UserDataType(this, p->package ? p->package : "", p->name.data, false,
949 p->parcelable, filename, p->name.lineno);
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700950 return Add(type);
951}
952
953bool JavaTypeNamespace::AddBinderType(interface_type* b,
954 const std::string& filename) {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700955 // for interfaces, add the stub, proxy, and interface types.
956 Type* type =
957 new InterfaceType(this, b->package ? b->package : "", b->name.data, false,
958 b->oneway, filename, b->name.lineno);
959 Type* stub = new Type(this, b->package ? b->package : "",
960 string{b->name.data} + ".Stub", Type::GENERATED, false,
961 false, filename, b->name.lineno);
962 Type* proxy = new Type(this, b->package ? b->package : "",
963 string{b->name.data} + ".Stub.Proxy", Type::GENERATED,
964 false, false, filename, b->name.lineno);
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700965
966 bool success = true;
967 success &= Add(type);
968 success &= Add(stub);
969 success &= Add(proxy);
970 return success;
971}
972
973const Type* JavaTypeNamespace::Search(const string& name) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700974 // an exact match wins
Christopher Wiley8f6816e2015-09-22 17:03:47 -0700975 const Type* result = Find(name);
Christopher Wileye6dee912015-09-22 14:50:23 -0700976 if (result != NULL) {
977 return result;
978 }
979
980 // try the class names
981 // our language doesn't allow you to not specify outer classes
982 // when referencing an inner class. that could be changed, and this
983 // would be the place to do it, but I don't think the complexity in
984 // scoping rules is worth it.
985 int N = m_types.size();
986 for (int i = 0; i < N; i++) {
987 if (m_types[i]->Name() == name) {
988 return m_types[i];
989 }
990 }
991
992 // we got to here and it's not a generic, give up
993 if (name.find('<') == name.npos) {
994 return NULL;
995 }
996
997 // remove any whitespace
998 string normalized = normalize_generic(name);
999
1000 // find the part before the '<', find a generic for it
1001 ssize_t baseIndex = normalized.find('<');
1002 string base(normalized.c_str(), baseIndex);
1003 const Generic* g = search_generic(base);
1004 if (g == NULL) {
1005 return NULL;
1006 }
1007
1008 // For each of the args, do a recursive search on it. We don't allow
1009 // generics within generics like Java does, because we're really limiting
1010 // them to just built-in container classes, at least for now. Our syntax
1011 // ensures this right now as well.
Christopher Wiley8f6816e2015-09-22 17:03:47 -07001012 vector<const Type*> args;
Christopher Wileye6dee912015-09-22 14:50:23 -07001013 size_t start = baseIndex + 1;
1014 size_t end = start;
1015 while (normalized[start] != '\0') {
1016 end = normalized.find(',', start);
1017 if (end == normalized.npos) {
1018 end = normalized.find('>', start);
1019 }
1020 string s(normalized.c_str() + start, end - start);
Christopher Wiley8f6816e2015-09-22 17:03:47 -07001021 const Type* t = this->Search(s);
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001022 if (t == NULL) {
Christopher Wiley84c1eac2015-09-23 13:29:28 -07001023 LOG(ERROR) << "internal error";
Christopher Wileye6dee912015-09-22 14:50:23 -07001024 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001025 }
Christopher Wileye6dee912015-09-22 14:50:23 -07001026 args.push_back(t);
1027 start = end + 1;
1028 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001029
Christopher Wileye6dee912015-09-22 14:50:23 -07001030 // construct a GenericType, add it to our name set so they always get
1031 // the same object, and return it.
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -07001032 result = make_generic_type(this, g->package, g->name, args);
Christopher Wileye6dee912015-09-22 14:50:23 -07001033 if (result == NULL) {
Christopher Wiley84c1eac2015-09-23 13:29:28 -07001034 LOG(ERROR) << "internal error";
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001035 return NULL;
Christopher Wileye6dee912015-09-22 14:50:23 -07001036 }
1037
Christopher Wiley60b02ae2015-09-23 16:35:18 -07001038 Add(result);
1039 return Find(result->QualifiedName());
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001040}
1041
Christopher Wiley84c1eac2015-09-23 13:29:28 -07001042const JavaTypeNamespace::Generic* JavaTypeNamespace::search_generic(
1043 const string& name) const {
Christopher Wileye6dee912015-09-22 14:50:23 -07001044 int N = m_generics.size();
1045
1046 // first exact match
1047 for (int i = 0; i < N; i++) {
1048 const Generic& g = m_generics[i];
1049 if (g.qualified == name) {
1050 return &g;
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001051 }
Christopher Wileye6dee912015-09-22 14:50:23 -07001052 }
1053
1054 // then name match
1055 for (int i = 0; i < N; i++) {
1056 const Generic& g = m_generics[i];
1057 if (g.name == name) {
1058 return &g;
1059 }
1060 }
1061
1062 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001063}
1064
Christopher Wiley84c1eac2015-09-23 13:29:28 -07001065void JavaTypeNamespace::Dump() const {
Christopher Wileye6dee912015-09-22 14:50:23 -07001066 int n = m_types.size();
1067 for (int i = 0; i < n; i++) {
Christopher Wiley8f6816e2015-09-22 17:03:47 -07001068 const Type* t = m_types[i];
Christopher Wileye6dee912015-09-22 14:50:23 -07001069 printf("type: package=%s name=%s qualifiedName=%s\n", t->Package().c_str(),
1070 t->Name().c_str(), t->QualifiedName().c_str());
1071 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001072}
Christopher Wileyfdeb0f42015-09-11 15:38:22 -07001073
1074} // namespace aidl
1075} // namespace android