blob: cffdf443ed80ddab6c0c74cc9ec8ee1e5d423243 [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 -070027Type* VOID_TYPE;
28Type* BOOLEAN_TYPE;
29Type* BYTE_TYPE;
30Type* CHAR_TYPE;
31Type* INT_TYPE;
32Type* LONG_TYPE;
33Type* FLOAT_TYPE;
34Type* DOUBLE_TYPE;
35Type* STRING_TYPE;
Joe Onoratoc596cfe2011-08-30 17:24:17 -070036Type* OBJECT_TYPE;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070037Type* CHAR_SEQUENCE_TYPE;
38Type* TEXT_UTILS_TYPE;
39Type* REMOTE_EXCEPTION_TYPE;
40Type* RUNTIME_EXCEPTION_TYPE;
41Type* IBINDER_TYPE;
42Type* IINTERFACE_TYPE;
43Type* BINDER_NATIVE_TYPE;
44Type* BINDER_PROXY_TYPE;
45Type* PARCEL_TYPE;
46Type* PARCELABLE_INTERFACE_TYPE;
Joe Onoratoc596cfe2011-08-30 17:24:17 -070047Type* CONTEXT_TYPE;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070048Type* MAP_TYPE;
49Type* LIST_TYPE;
50Type* CLASSLOADER_TYPE;
51
52Expression* NULL_VALUE;
53Expression* THIS_VALUE;
54Expression* SUPER_VALUE;
55Expression* TRUE_VALUE;
56Expression* FALSE_VALUE;
57
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070058static Type* make_generic_type(const JavaTypeNamespace* types,
59 const string& package, const string& name,
Christopher Wiley8f6816e2015-09-22 17:03:47 -070060 const vector<const Type*>& args) {
Christopher Wileye6dee912015-09-22 14:50:23 -070061 if (package == "java.util" && name == "List") {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070062 return new GenericListType(types, "java.util", "List", args);
Christopher Wileye6dee912015-09-22 14:50:23 -070063 }
64 return NULL;
65 // return new GenericType(package, name, args);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070066}
67
68// ================================================================
69
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070070Type::Type(const JavaTypeNamespace* types, const string& name, int kind,
71 bool canWriteToParcel, bool canBeOut)
72 : m_types(types),
73 m_package(),
Christopher Wileye6dee912015-09-22 14:50:23 -070074 m_name(name),
75 m_declFile(""),
76 m_declLine(-1),
77 m_kind(kind),
78 m_canWriteToParcel(canWriteToParcel),
79 m_canBeOut(canBeOut) {
80 m_qualifiedName = name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070081}
82
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070083Type::Type(const JavaTypeNamespace* types, const string& package,
84 const string& name, int kind, bool canWriteToParcel, bool canBeOut,
85 const string& declFile, int declLine)
86 : m_types(types),
87 m_package(package),
Christopher Wileye6dee912015-09-22 14:50:23 -070088 m_name(name),
89 m_declFile(declFile),
90 m_declLine(declLine),
91 m_kind(kind),
92 m_canWriteToParcel(canWriteToParcel),
93 m_canBeOut(canBeOut) {
94 if (package.length() > 0) {
95 m_qualifiedName = package;
96 m_qualifiedName += '.';
97 }
98 m_qualifiedName += name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070099}
100
Christopher Wileye6dee912015-09-22 14:50:23 -0700101Type::~Type() {}
102
103string Type::HumanReadableKind() const {
104 switch (Kind()) {
105 case INTERFACE:
106 return "an interface";
107 case USERDATA:
108 return "a user data";
109 default:
110 return "ERROR";
111 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700112}
113
Christopher Wileye6dee912015-09-22 14:50:23 -0700114bool Type::CanBeArray() const { return false; }
115
116string Type::ImportType() const { return m_qualifiedName; }
117
118string Type::CreatorName() const { return ""; }
119
120string Type::InstantiableName() const { return QualifiedName(); }
121
122void Type::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700123 int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700124 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%sn", __FILE__,
125 __LINE__, m_qualifiedName.c_str());
126 addTo->Add(new LiteralExpression("/* WriteToParcel error " + m_qualifiedName +
127 " */"));
Christopher Wileyf690be52015-09-14 15:19:10 -0700128}
129
Christopher Wileye6dee912015-09-22 14:50:23 -0700130void Type::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700131 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700132 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
133 __LINE__, m_qualifiedName.c_str());
134 addTo->Add(new LiteralExpression("/* CreateFromParcel error " +
135 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700136}
137
Christopher Wileye6dee912015-09-22 14:50:23 -0700138void Type::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700139 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700140 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
141 __LINE__, m_qualifiedName.c_str());
142 addTo->Add(new LiteralExpression("/* ReadFromParcel error " +
143 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700144}
145
Christopher Wileye6dee912015-09-22 14:50:23 -0700146void Type::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700147 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700148 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
149 __LINE__, m_qualifiedName.c_str());
150 addTo->Add(new LiteralExpression("/* WriteArrayToParcel error " +
151 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700152}
153
Christopher Wileye6dee912015-09-22 14:50:23 -0700154void Type::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700155 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700156 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
157 __LINE__, m_qualifiedName.c_str());
158 addTo->Add(new LiteralExpression("/* CreateArrayFromParcel error " +
159 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700160}
161
Christopher Wileye6dee912015-09-22 14:50:23 -0700162void Type::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700163 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700164 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
165 __LINE__, m_qualifiedName.c_str());
166 addTo->Add(new LiteralExpression("/* ReadArrayFromParcel error " +
167 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700168}
169
Christopher Wileye6dee912015-09-22 14:50:23 -0700170void Type::SetQualifiedName(const string& qualified) {
171 m_qualifiedName = qualified;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700172}
173
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700174Expression* Type::BuildWriteToParcelFlags(int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700175 if (flags == 0) {
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700176 return new LiteralExpression("0");
Christopher Wileye6dee912015-09-22 14:50:23 -0700177 }
178 if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0) {
179 return new FieldVariable(PARCELABLE_INTERFACE_TYPE,
180 "PARCELABLE_WRITE_RETURN_VALUE");
181 }
182 return new LiteralExpression("0");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700183}
184
185// ================================================================
186
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700187BasicType::BasicType(const JavaTypeNamespace* types, const string& name,
188 const string& marshallParcel,
Christopher Wileye6dee912015-09-22 14:50:23 -0700189 const string& unmarshallParcel,
190 const string& writeArrayParcel,
191 const string& createArrayParcel,
192 const string& readArrayParcel)
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700193 : Type(types, name, BUILT_IN, true, false),
Christopher Wileye6dee912015-09-22 14:50:23 -0700194 m_marshallParcel(marshallParcel),
195 m_unmarshallParcel(unmarshallParcel),
196 m_writeArrayParcel(writeArrayParcel),
197 m_createArrayParcel(createArrayParcel),
198 m_readArrayParcel(readArrayParcel) {}
199
200void BasicType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700201 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700202 addTo->Add(new MethodCall(parcel, m_marshallParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700203}
204
Christopher Wileye6dee912015-09-22 14:50:23 -0700205void BasicType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700206 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700207 addTo->Add(new Assignment(v, new MethodCall(parcel, m_unmarshallParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700208}
209
Christopher Wileye6dee912015-09-22 14:50:23 -0700210bool BasicType::CanBeArray() const { return true; }
211
212void BasicType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700213 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700214 addTo->Add(new MethodCall(parcel, m_writeArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700215}
216
Christopher Wileye6dee912015-09-22 14:50:23 -0700217void BasicType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700218 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700219 addTo->Add(new Assignment(v, new MethodCall(parcel, m_createArrayParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700220}
221
Christopher Wileye6dee912015-09-22 14:50:23 -0700222void BasicType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700223 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700224 addTo->Add(new MethodCall(parcel, m_readArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700225}
226
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700227// ================================================================
228
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700229BooleanType::BooleanType(const JavaTypeNamespace* types)
230 : Type(types, "boolean", BUILT_IN, true, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700231
232void BooleanType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700233 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700234 addTo->Add(new MethodCall(
235 parcel, "writeInt", 1,
236 new Ternary(v, new LiteralExpression("1"), new LiteralExpression("0"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700237}
238
Christopher Wileye6dee912015-09-22 14:50:23 -0700239void BooleanType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700240 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700241 addTo->Add(
242 new Assignment(v, new Comparison(new LiteralExpression("0"), "!=",
243 new MethodCall(parcel, "readInt"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700244}
245
Christopher Wileye6dee912015-09-22 14:50:23 -0700246bool BooleanType::CanBeArray() const { return true; }
247
248void BooleanType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700249 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700250 addTo->Add(new MethodCall(parcel, "writeBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700251}
252
Christopher Wileye6dee912015-09-22 14:50:23 -0700253void BooleanType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700254 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700255 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBooleanArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700256}
257
Christopher Wileye6dee912015-09-22 14:50:23 -0700258void BooleanType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700259 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700260 addTo->Add(new MethodCall(parcel, "readBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700261}
262
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700263// ================================================================
264
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700265CharType::CharType(const JavaTypeNamespace* types)
266 : Type(types, "char", BUILT_IN, true, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700267
268void CharType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700269 Variable* parcel, int flags) const {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700270 addTo->Add(
271 new MethodCall(parcel, "writeInt", 1, new Cast(m_types->IntType(), v)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700272}
273
Christopher Wileye6dee912015-09-22 14:50:23 -0700274void CharType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700275 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700276 addTo->Add(new Assignment(v, new MethodCall(parcel, "readInt"), this));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700277}
278
Christopher Wileye6dee912015-09-22 14:50:23 -0700279bool CharType::CanBeArray() const { return true; }
280
281void CharType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700282 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700283 addTo->Add(new MethodCall(parcel, "writeCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700284}
285
Christopher Wileye6dee912015-09-22 14:50:23 -0700286void CharType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700287 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700288 addTo->Add(new Assignment(v, new MethodCall(parcel, "createCharArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700289}
290
Christopher Wileye6dee912015-09-22 14:50:23 -0700291void CharType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700292 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700293 addTo->Add(new MethodCall(parcel, "readCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700294}
295
296// ================================================================
297
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700298StringType::StringType(const JavaTypeNamespace* types)
299 : Type(types, "java.lang", "String", BUILT_IN, true, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700300
301string StringType::CreatorName() const {
302 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700303}
304
Christopher Wileye6dee912015-09-22 14:50:23 -0700305void StringType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700306 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700307 addTo->Add(new MethodCall(parcel, "writeString", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700308}
309
Christopher Wileye6dee912015-09-22 14:50:23 -0700310void StringType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700311 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700312 addTo->Add(new Assignment(v, new MethodCall(parcel, "readString")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700313}
314
Christopher Wileye6dee912015-09-22 14:50:23 -0700315bool StringType::CanBeArray() const { return true; }
316
317void StringType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700318 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700319 addTo->Add(new MethodCall(parcel, "writeStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700320}
321
Christopher Wileye6dee912015-09-22 14:50:23 -0700322void StringType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700323 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700324 addTo->Add(new Assignment(v, new MethodCall(parcel, "createStringArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700325}
326
Christopher Wileye6dee912015-09-22 14:50:23 -0700327void StringType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700328 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700329 addTo->Add(new MethodCall(parcel, "readStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700330}
331
332// ================================================================
333
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700334CharSequenceType::CharSequenceType(const JavaTypeNamespace* types)
335 : Type(types, "java.lang", "CharSequence", BUILT_IN, true, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700336
337string CharSequenceType::CreatorName() const {
338 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700339}
340
Christopher Wileye6dee912015-09-22 14:50:23 -0700341void CharSequenceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700342 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700343 // if (v != null) {
344 // parcel.writeInt(1);
345 // v.writeToParcel(parcel);
346 // } else {
347 // parcel.writeInt(0);
348 // }
349 IfStatement* elsepart = new IfStatement();
350 elsepart->statements->Add(
351 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
352 IfStatement* ifpart = new IfStatement;
353 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
354 ifpart->elseif = elsepart;
355 ifpart->statements->Add(
356 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
357 ifpart->statements->Add(new MethodCall(TEXT_UTILS_TYPE, "writeToParcel", 3, v,
358 parcel,
359 BuildWriteToParcelFlags(flags)));
360
361 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700362}
363
Christopher Wileye6dee912015-09-22 14:50:23 -0700364void CharSequenceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700365 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700366 // if (0 != parcel.readInt()) {
367 // v = TextUtils.createFromParcel(parcel)
368 // } else {
369 // v = null;
370 // }
371 IfStatement* elsepart = new IfStatement();
372 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700373
Christopher Wileye6dee912015-09-22 14:50:23 -0700374 IfStatement* ifpart = new IfStatement();
375 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
376 new MethodCall(parcel, "readInt"));
377 ifpart->elseif = elsepart;
378 ifpart->statements->Add(new Assignment(
379 v, new MethodCall(TEXT_UTILS_TYPE,
380 "CHAR_SEQUENCE_CREATOR.createFromParcel", 1, parcel)));
381
382 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700383}
384
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700385// ================================================================
386
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700387RemoteExceptionType::RemoteExceptionType(const JavaTypeNamespace* types)
388 : Type(types, "android.os", "RemoteException", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700389
390void RemoteExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700391 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700392 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700393}
394
Christopher Wileye6dee912015-09-22 14:50:23 -0700395void RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700396 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700397 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700398}
399
400// ================================================================
401
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700402RuntimeExceptionType::RuntimeExceptionType(const JavaTypeNamespace* types)
403 : Type(types, "java.lang", "RuntimeException", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700404
405void RuntimeExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700406 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700407 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700408}
409
Christopher Wileye6dee912015-09-22 14:50:23 -0700410void RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700411 Variable* parcel,
412 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700413 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700414}
415
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700416// ================================================================
417
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700418IBinderType::IBinderType(const JavaTypeNamespace* types)
419 : Type(types, "android.os", "IBinder", BUILT_IN, true, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700420
421void IBinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700422 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700423 addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700424}
425
Christopher Wileye6dee912015-09-22 14:50:23 -0700426void IBinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700427 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700428 addTo->Add(new Assignment(v, new MethodCall(parcel, "readStrongBinder")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700429}
430
Christopher Wileye6dee912015-09-22 14:50:23 -0700431void IBinderType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700432 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700433 addTo->Add(new MethodCall(parcel, "writeBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700434}
435
Christopher Wileye6dee912015-09-22 14:50:23 -0700436void IBinderType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700437 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700438 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBinderArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700439}
440
Christopher Wileye6dee912015-09-22 14:50:23 -0700441void IBinderType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700442 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700443 addTo->Add(new MethodCall(parcel, "readBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700444}
445
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700446// ================================================================
447
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700448IInterfaceType::IInterfaceType(const JavaTypeNamespace* types)
449 : Type(types, "android.os", "IInterface", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700450
451void IInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700452 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700453 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700454}
455
Christopher Wileye6dee912015-09-22 14:50:23 -0700456void IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700457 Variable* parcel, Variable**) 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
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700461// ================================================================
462
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700463BinderType::BinderType(const JavaTypeNamespace* types)
464 : Type(types, "android.os", "Binder", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700465
466void BinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700467 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700468 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700469}
470
Christopher Wileye6dee912015-09-22 14:50:23 -0700471void BinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700472 Variable* parcel, Variable**) 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
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700476// ================================================================
477
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700478BinderProxyType::BinderProxyType(const JavaTypeNamespace* types)
479 : Type(types, "android.os", "BinderProxy", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700480
481void BinderProxyType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700482 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700483 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700484}
485
Christopher Wileye6dee912015-09-22 14:50:23 -0700486void BinderProxyType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700487 Variable* parcel, Variable**) 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
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700491// ================================================================
492
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700493ParcelType::ParcelType(const JavaTypeNamespace* types)
494 : Type(types, "android.os", "Parcel", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700495
496void ParcelType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700497 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700498 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700499}
500
Christopher Wileye6dee912015-09-22 14:50:23 -0700501void ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700502 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700503 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700504}
505
506// ================================================================
507
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700508ParcelableInterfaceType::ParcelableInterfaceType(const JavaTypeNamespace* types)
509 : Type(types, "android.os", "Parcelable", BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700510
511void ParcelableInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700512 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700513 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700514}
515
Christopher Wileye6dee912015-09-22 14:50:23 -0700516void ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo,
517 Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700518 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700519 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700520}
521
522// ================================================================
523
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700524MapType::MapType(const JavaTypeNamespace* types)
525 : Type(types, "java.util", "Map", BUILT_IN, true, true) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700526
527void MapType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700528 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700529 addTo->Add(new MethodCall(parcel, "writeMap", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700530}
531
Christopher Wileye6dee912015-09-22 14:50:23 -0700532static void EnsureClassLoader(StatementBlock* addTo, Variable** cl) {
533 // We don't want to look up the class loader once for every
534 // collection argument, so ensure we do it at most once per method.
535 if (*cl == NULL) {
536 *cl = new Variable(CLASSLOADER_TYPE, "cl");
537 addTo->Add(new VariableDeclaration(
538 *cl, new LiteralExpression("this.getClass().getClassLoader()"),
539 CLASSLOADER_TYPE));
540 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700541}
542
Christopher Wileye6dee912015-09-22 14:50:23 -0700543void MapType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700544 Variable* parcel, Variable** cl) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700545 EnsureClassLoader(addTo, cl);
546 addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, *cl)));
Elliott Hughes15f8da22011-07-13 12:10:30 -0700547}
548
Christopher Wileye6dee912015-09-22 14:50:23 -0700549void MapType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700550 Variable* parcel, Variable** cl) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700551 EnsureClassLoader(addTo, cl);
552 addTo->Add(new MethodCall(parcel, "readMap", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700553}
554
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700555// ================================================================
556
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700557ListType::ListType(const JavaTypeNamespace* types)
558 : Type(types, "java.util", "List", BUILT_IN, true, true) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700559
560string ListType::InstantiableName() const { return "java.util.ArrayList"; }
561
562void ListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700563 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700564 addTo->Add(new MethodCall(parcel, "writeList", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700565}
566
Christopher Wileye6dee912015-09-22 14:50:23 -0700567void ListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700568 Variable* parcel, Variable** cl) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700569 EnsureClassLoader(addTo, cl);
570 addTo->Add(
571 new Assignment(v, new MethodCall(parcel, "readArrayList", 1, *cl)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700572}
573
Christopher Wileye6dee912015-09-22 14:50:23 -0700574void ListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700575 Variable* parcel, Variable** cl) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700576 EnsureClassLoader(addTo, cl);
577 addTo->Add(new MethodCall(parcel, "readList", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700578}
579
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700580// ================================================================
581
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700582UserDataType::UserDataType(const JavaTypeNamespace* types,
583 const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700584 bool builtIn, bool canWriteToParcel,
585 const string& declFile, int declLine)
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700586 : Type(types, package, name, builtIn ? BUILT_IN : USERDATA,
587 canWriteToParcel, true, declFile, declLine) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700588
589string UserDataType::CreatorName() const {
590 return QualifiedName() + ".CREATOR";
Joe Onorato44050522011-10-09 17:38:20 -0700591}
592
Christopher Wileye6dee912015-09-22 14:50:23 -0700593void UserDataType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700594 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700595 // if (v != null) {
596 // parcel.writeInt(1);
597 // v.writeToParcel(parcel);
598 // } else {
599 // parcel.writeInt(0);
600 // }
601 IfStatement* elsepart = new IfStatement();
602 elsepart->statements->Add(
603 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
604 IfStatement* ifpart = new IfStatement;
605 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
606 ifpart->elseif = elsepart;
607 ifpart->statements->Add(
608 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
609 ifpart->statements->Add(new MethodCall(v, "writeToParcel", 2, parcel,
610 BuildWriteToParcelFlags(flags)));
611
612 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700613}
614
Christopher Wileye6dee912015-09-22 14:50:23 -0700615void UserDataType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700616 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700617 // if (0 != parcel.readInt()) {
618 // v = CLASS.CREATOR.createFromParcel(parcel)
619 // } else {
620 // v = null;
621 // }
622 IfStatement* elsepart = new IfStatement();
623 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700624
Christopher Wileye6dee912015-09-22 14:50:23 -0700625 IfStatement* ifpart = new IfStatement();
626 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
627 new MethodCall(parcel, "readInt"));
628 ifpart->elseif = elsepart;
629 ifpart->statements->Add(new Assignment(
630 v, new MethodCall(v->type, "CREATOR.createFromParcel", 1, parcel)));
631
632 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700633}
634
Christopher Wileye6dee912015-09-22 14:50:23 -0700635void UserDataType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700636 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700637 // TODO: really, we don't need to have this extra check, but we
638 // don't have two separate marshalling code paths
639 // if (0 != parcel.readInt()) {
640 // v.readFromParcel(parcel)
641 // }
642 IfStatement* ifpart = new IfStatement();
643 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
644 new MethodCall(parcel, "readInt"));
645 ifpart->statements->Add(new MethodCall(v, "readFromParcel", 1, parcel));
646 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700647}
648
Christopher Wileye6dee912015-09-22 14:50:23 -0700649bool UserDataType::CanBeArray() const { return true; }
650
651void UserDataType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700652 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700653 addTo->Add(new MethodCall(parcel, "writeTypedArray", 2, v,
654 BuildWriteToParcelFlags(flags)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700655}
656
Christopher Wileye6dee912015-09-22 14:50:23 -0700657void UserDataType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700658 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700659 string creator = v->type->QualifiedName() + ".CREATOR";
660 addTo->Add(new Assignment(v, new MethodCall(parcel, "createTypedArray", 1,
661 new LiteralExpression(creator))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700662}
663
Christopher Wileye6dee912015-09-22 14:50:23 -0700664void UserDataType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700665 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700666 string creator = v->type->QualifiedName() + ".CREATOR";
667 addTo->Add(new MethodCall(parcel, "readTypedArray", 2, v,
668 new LiteralExpression(creator)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700669}
670
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700671// ================================================================
672
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700673InterfaceType::InterfaceType(const JavaTypeNamespace* types,
674 const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700675 bool builtIn, bool oneway, const string& declFile,
676 int declLine)
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700677 : Type(types, package, name, builtIn ? BUILT_IN : INTERFACE, true, false,
678 declFile, declLine),
Christopher Wileye6dee912015-09-22 14:50:23 -0700679 m_oneway(oneway) {}
680
681bool InterfaceType::OneWay() const { return m_oneway; }
682
683void InterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700684 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700685 // parcel.writeStrongBinder(v != null ? v.asBinder() : null);
686 addTo->Add(
687 new MethodCall(parcel, "writeStrongBinder", 1,
688 new Ternary(new Comparison(v, "!=", NULL_VALUE),
689 new MethodCall(v, "asBinder"), NULL_VALUE)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700690}
691
Christopher Wileye6dee912015-09-22 14:50:23 -0700692void InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700693 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700694 // v = Interface.asInterface(parcel.readStrongBinder());
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700695 string stub_type = v->type->QualifiedName() + ".Stub";
Christopher Wileye6dee912015-09-22 14:50:23 -0700696 addTo->Add(new Assignment(
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700697 v, new MethodCall(m_types->Find(stub_type), "asInterface", 1,
Christopher Wileye6dee912015-09-22 14:50:23 -0700698 new MethodCall(parcel, "readStrongBinder"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700699}
700
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700701// ================================================================
702
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700703GenericType::GenericType(const JavaTypeNamespace* types, const string& package,
704 const string& name, const vector<const Type*>& args)
705 : Type(types, package, name, BUILT_IN, true, true) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700706 m_args = args;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700707
Christopher Wileye6dee912015-09-22 14:50:23 -0700708 m_importName = package + '.' + name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700709
Christopher Wileye6dee912015-09-22 14:50:23 -0700710 string gen = "<";
711 int N = args.size();
712 for (int i = 0; i < N; i++) {
Christopher Wiley8f6816e2015-09-22 17:03:47 -0700713 const Type* t = args[i];
Christopher Wileye6dee912015-09-22 14:50:23 -0700714 gen += t->QualifiedName();
715 if (i != N - 1) {
716 gen += ',';
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700717 }
Christopher Wileye6dee912015-09-22 14:50:23 -0700718 }
719 gen += '>';
720 m_genericArguments = gen;
721 SetQualifiedName(m_importName + gen);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700722}
723
Christopher Wiley8f6816e2015-09-22 17:03:47 -0700724const vector<const Type*>& GenericType::GenericArgumentTypes() const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700725 return m_args;
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700726}
727
Christopher Wileye6dee912015-09-22 14:50:23 -0700728string GenericType::GenericArguments() const { return m_genericArguments; }
729
730string GenericType::ImportType() const { return m_importName; }
731
732void GenericType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700733 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700734 fprintf(stderr, "implement GenericType::WriteToParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700735}
736
Christopher Wileye6dee912015-09-22 14:50:23 -0700737void GenericType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700738 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700739 fprintf(stderr, "implement GenericType::CreateFromParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700740}
741
Christopher Wileye6dee912015-09-22 14:50:23 -0700742void GenericType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700743 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700744 fprintf(stderr, "implement GenericType::ReadFromParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700745}
746
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700747// ================================================================
748
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700749GenericListType::GenericListType(const JavaTypeNamespace* types,
750 const string& package, const string& name,
Christopher Wiley8f6816e2015-09-22 17:03:47 -0700751 const vector<const Type*>& args)
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700752 : GenericType(types, package, name, args),
753 m_creator(args[0]->CreatorName()) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700754
755string GenericListType::CreatorName() const {
756 return "android.os.Parcel.arrayListCreator";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700757}
758
Christopher Wileye6dee912015-09-22 14:50:23 -0700759string GenericListType::InstantiableName() const {
760 return "java.util.ArrayList" + GenericArguments();
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700761}
762
Christopher Wileye6dee912015-09-22 14:50:23 -0700763void GenericListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700764 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700765 if (m_creator == STRING_TYPE->CreatorName()) {
766 addTo->Add(new MethodCall(parcel, "writeStringList", 1, v));
767 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
768 addTo->Add(new MethodCall(parcel, "writeBinderList", 1, v));
769 } else {
770 // parcel.writeTypedListXX(arg);
771 addTo->Add(new MethodCall(parcel, "writeTypedList", 1, v));
772 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700773}
774
Christopher Wileye6dee912015-09-22 14:50:23 -0700775void GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700776 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700777 if (m_creator == STRING_TYPE->CreatorName()) {
778 addTo->Add(
779 new Assignment(v, new MethodCall(parcel, "createStringArrayList", 0)));
780 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
781 addTo->Add(
782 new Assignment(v, new MethodCall(parcel, "createBinderArrayList", 0)));
783 } else {
784 // v = _data.readTypedArrayList(XXX.creator);
785 addTo->Add(
786 new Assignment(v, new MethodCall(parcel, "createTypedArrayList", 1,
787 new LiteralExpression(m_creator))));
788 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700789}
790
Christopher Wileye6dee912015-09-22 14:50:23 -0700791void GenericListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700792 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700793 if (m_creator == STRING_TYPE->CreatorName()) {
794 addTo->Add(new MethodCall(parcel, "readStringList", 1, v));
795 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
796 addTo->Add(new MethodCall(parcel, "readBinderList", 1, v));
797 } else {
798 // v = _data.readTypedList(v, XXX.creator);
799 addTo->Add(new MethodCall(parcel, "readTypedList", 2, v,
800 new LiteralExpression(m_creator)));
801 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700802}
803
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700804// ================================================================
805
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700806ClassLoaderType::ClassLoaderType(const JavaTypeNamespace* types)
807 : Type(types, "java.lang", "ClassLoader", BUILT_IN, false, false) {}
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700808
809// ================================================================
810
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700811JavaTypeNamespace::JavaTypeNamespace() {
812 VOID_TYPE = new BasicType(this, "void", "XXX", "XXX", "XXX", "XXX", "XXX");
813 Add(VOID_TYPE);
814
815 BOOLEAN_TYPE = new BooleanType(this);
816 Add(BOOLEAN_TYPE);
817
818 BYTE_TYPE =
819 new BasicType(this, "byte", "writeByte", "readByte", "writeByteArray",
820 "createByteArray", "readByteArray");
821 Add(BYTE_TYPE);
822
823 CHAR_TYPE = new CharType(this);
824 Add(CHAR_TYPE);
825
826 INT_TYPE = new BasicType(this, "int", "writeInt", "readInt", "writeIntArray",
827 "createIntArray", "readIntArray");
828 Add(INT_TYPE);
829 m_int_type = INT_TYPE;
830
831 LONG_TYPE =
832 new BasicType(this, "long", "writeLong", "readLong", "writeLongArray",
833 "createLongArray", "readLongArray");
834 Add(LONG_TYPE);
835
836 FLOAT_TYPE =
837 new BasicType(this, "float", "writeFloat", "readFloat", "writeFloatArray",
838 "createFloatArray", "readFloatArray");
839 Add(FLOAT_TYPE);
840
841 DOUBLE_TYPE =
842 new BasicType(this, "double", "writeDouble", "readDouble",
843 "writeDoubleArray", "createDoubleArray", "readDoubleArray");
844 Add(DOUBLE_TYPE);
845
846 STRING_TYPE = new StringType(this);
847 Add(STRING_TYPE);
848
849 OBJECT_TYPE =
850 new Type(this, "java.lang", "Object", Type::BUILT_IN, false, false);
851 Add(OBJECT_TYPE);
852
853 CHAR_SEQUENCE_TYPE = new CharSequenceType(this);
854 Add(CHAR_SEQUENCE_TYPE);
855
856 MAP_TYPE = new MapType(this);
857 Add(MAP_TYPE);
858
859 LIST_TYPE = new ListType(this);
860 Add(LIST_TYPE);
861
862 TEXT_UTILS_TYPE =
863 new Type(this, "android.text", "TextUtils", Type::BUILT_IN, false, false);
864 Add(TEXT_UTILS_TYPE);
865
866 REMOTE_EXCEPTION_TYPE = new RemoteExceptionType(this);
867 Add(REMOTE_EXCEPTION_TYPE);
868
869 RUNTIME_EXCEPTION_TYPE = new RuntimeExceptionType(this);
870 Add(RUNTIME_EXCEPTION_TYPE);
871
872 IBINDER_TYPE = new IBinderType(this);
873 Add(IBINDER_TYPE);
874
875 IINTERFACE_TYPE = new IInterfaceType(this);
876 Add(IINTERFACE_TYPE);
877
878 BINDER_NATIVE_TYPE = new BinderType(this);
879 Add(BINDER_NATIVE_TYPE);
880
881 BINDER_PROXY_TYPE = new BinderProxyType(this);
882 Add(BINDER_PROXY_TYPE);
883
884 PARCEL_TYPE = new ParcelType(this);
885 Add(PARCEL_TYPE);
886
887 PARCELABLE_INTERFACE_TYPE = new ParcelableInterfaceType(this);
888 Add(PARCELABLE_INTERFACE_TYPE);
889
890 CONTEXT_TYPE = new Type(this, "android.content", "Context", Type::BUILT_IN,
891 false, false);
892 Add(CONTEXT_TYPE);
893
894 CLASSLOADER_TYPE = new ClassLoaderType(this);
895 Add(CLASSLOADER_TYPE);
896
897 NULL_VALUE = new LiteralExpression("null");
898 THIS_VALUE = new LiteralExpression("this");
899 SUPER_VALUE = new LiteralExpression("super");
900 TRUE_VALUE = new LiteralExpression("true");
901 FALSE_VALUE = new LiteralExpression("false");
902
903 AddGenericType("java.util", "List", 1);
904 AddGenericType("java.util", "Map", 2);
905}
Christopher Wileye6dee912015-09-22 14:50:23 -0700906
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700907JavaTypeNamespace::~JavaTypeNamespace() {
Christopher Wileye6dee912015-09-22 14:50:23 -0700908 int N = m_types.size();
909 for (int i = 0; i < N; i++) {
910 delete m_types[i];
911 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700912}
913
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700914bool JavaTypeNamespace::Add(const Type* type) {
915 const Type* existing = Find(type->QualifiedName());
916 if (!existing) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700917 m_types.push_back(type);
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700918 return true;
Christopher Wileye6dee912015-09-22 14:50:23 -0700919 }
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700920
921 if (existing->Kind() == Type::BUILT_IN) {
922 fprintf(stderr, "%s:%d attempt to redefine built in class %s\n",
923 type->DeclFile().c_str(), type->DeclLine(),
924 type->QualifiedName().c_str());
925 return false;
926 }
927
928 if (type->Kind() != existing->Kind()) {
929 fprintf(stderr, "%s:%d attempt to redefine %s as %s,\n",
930 type->DeclFile().c_str(), type->DeclLine(),
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700931 type->QualifiedName().c_str(), type->HumanReadableKind().c_str());
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700932 fprintf(stderr, "%s:%d previously defined here as %s.\n",
933 existing->DeclFile().c_str(), existing->DeclLine(),
934 existing->HumanReadableKind().c_str());
935 return false;
936 }
937
938 return true;
Christopher Wileye6dee912015-09-22 14:50:23 -0700939}
940
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700941void JavaTypeNamespace::AddGenericType(const string& package,
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700942 const string& name, int args) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700943 Generic g;
944 g.package = package;
945 g.name = name;
946 g.qualified = package + '.' + name;
947 g.args = args;
948 m_generics.push_back(g);
949}
950
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700951const Type* JavaTypeNamespace::Find(const string& name) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700952 int N = m_types.size();
953 for (int i = 0; i < N; i++) {
954 if (m_types[i]->QualifiedName() == name) {
955 return m_types[i];
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700956 }
Christopher Wileye6dee912015-09-22 14:50:23 -0700957 }
958 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700959}
960
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700961const Type* JavaTypeNamespace::Find(const char* package,
962 const char* name) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700963 string s;
964 if (package != nullptr && *package != '\0') {
965 s += package;
966 s += '.';
967 }
968 s += name;
969 return Find(s);
970}
971
972static string normalize_generic(const string& s) {
973 string r;
974 int N = s.size();
975 for (int i = 0; i < N; i++) {
976 char c = s[i];
977 if (!isspace(c)) {
978 r += c;
979 }
980 }
981 return r;
982}
983
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700984bool JavaTypeNamespace::AddParcelableType(user_data_type* p,
985 const std::string& filename) {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700986 Type* type =
987 new UserDataType(this, p->package ? p->package : "", p->name.data, false,
988 p->parcelable, filename, p->name.lineno);
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700989 return Add(type);
990}
991
992bool JavaTypeNamespace::AddBinderType(interface_type* b,
993 const std::string& filename) {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700994 // for interfaces, add the stub, proxy, and interface types.
995 Type* type =
996 new InterfaceType(this, b->package ? b->package : "", b->name.data, false,
997 b->oneway, filename, b->name.lineno);
998 Type* stub = new Type(this, b->package ? b->package : "",
999 string{b->name.data} + ".Stub", Type::GENERATED, false,
1000 false, filename, b->name.lineno);
1001 Type* proxy = new Type(this, b->package ? b->package : "",
1002 string{b->name.data} + ".Stub.Proxy", Type::GENERATED,
1003 false, false, filename, b->name.lineno);
Christopher Wiley84c1eac2015-09-23 13:29:28 -07001004
1005 bool success = true;
1006 success &= Add(type);
1007 success &= Add(stub);
1008 success &= Add(proxy);
1009 return success;
1010}
1011
1012const Type* JavaTypeNamespace::Search(const string& name) {
Christopher Wileye6dee912015-09-22 14:50:23 -07001013 // an exact match wins
Christopher Wiley8f6816e2015-09-22 17:03:47 -07001014 const Type* result = Find(name);
Christopher Wileye6dee912015-09-22 14:50:23 -07001015 if (result != NULL) {
1016 return result;
1017 }
1018
1019 // try the class names
1020 // our language doesn't allow you to not specify outer classes
1021 // when referencing an inner class. that could be changed, and this
1022 // would be the place to do it, but I don't think the complexity in
1023 // scoping rules is worth it.
1024 int N = m_types.size();
1025 for (int i = 0; i < N; i++) {
1026 if (m_types[i]->Name() == name) {
1027 return m_types[i];
1028 }
1029 }
1030
1031 // we got to here and it's not a generic, give up
1032 if (name.find('<') == name.npos) {
1033 return NULL;
1034 }
1035
1036 // remove any whitespace
1037 string normalized = normalize_generic(name);
1038
1039 // find the part before the '<', find a generic for it
1040 ssize_t baseIndex = normalized.find('<');
1041 string base(normalized.c_str(), baseIndex);
1042 const Generic* g = search_generic(base);
1043 if (g == NULL) {
1044 return NULL;
1045 }
1046
1047 // For each of the args, do a recursive search on it. We don't allow
1048 // generics within generics like Java does, because we're really limiting
1049 // them to just built-in container classes, at least for now. Our syntax
1050 // ensures this right now as well.
Christopher Wiley8f6816e2015-09-22 17:03:47 -07001051 vector<const Type*> args;
Christopher Wileye6dee912015-09-22 14:50:23 -07001052 size_t start = baseIndex + 1;
1053 size_t end = start;
1054 while (normalized[start] != '\0') {
1055 end = normalized.find(',', start);
1056 if (end == normalized.npos) {
1057 end = normalized.find('>', start);
1058 }
1059 string s(normalized.c_str() + start, end - start);
Christopher Wiley8f6816e2015-09-22 17:03:47 -07001060 const Type* t = this->Search(s);
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001061 if (t == NULL) {
Christopher Wiley84c1eac2015-09-23 13:29:28 -07001062 LOG(ERROR) << "internal error";
Christopher Wileye6dee912015-09-22 14:50:23 -07001063 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001064 }
Christopher Wileye6dee912015-09-22 14:50:23 -07001065 args.push_back(t);
1066 start = end + 1;
1067 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001068
Christopher Wileye6dee912015-09-22 14:50:23 -07001069 // construct a GenericType, add it to our name set so they always get
1070 // the same object, and return it.
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -07001071 result = make_generic_type(this, g->package, g->name, args);
Christopher Wileye6dee912015-09-22 14:50:23 -07001072 if (result == NULL) {
Christopher Wiley84c1eac2015-09-23 13:29:28 -07001073 LOG(ERROR) << "internal error";
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001074 return NULL;
Christopher Wileye6dee912015-09-22 14:50:23 -07001075 }
1076
1077 this->Add(result);
1078 return this->Find(result->QualifiedName());
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001079}
1080
Christopher Wiley84c1eac2015-09-23 13:29:28 -07001081const JavaTypeNamespace::Generic* JavaTypeNamespace::search_generic(
1082 const string& name) const {
Christopher Wileye6dee912015-09-22 14:50:23 -07001083 int N = m_generics.size();
1084
1085 // first exact match
1086 for (int i = 0; i < N; i++) {
1087 const Generic& g = m_generics[i];
1088 if (g.qualified == name) {
1089 return &g;
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001090 }
Christopher Wileye6dee912015-09-22 14:50:23 -07001091 }
1092
1093 // then name match
1094 for (int i = 0; i < N; i++) {
1095 const Generic& g = m_generics[i];
1096 if (g.name == name) {
1097 return &g;
1098 }
1099 }
1100
1101 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001102}
1103
Christopher Wiley84c1eac2015-09-23 13:29:28 -07001104void JavaTypeNamespace::Dump() const {
Christopher Wileye6dee912015-09-22 14:50:23 -07001105 int n = m_types.size();
1106 for (int i = 0; i < n; i++) {
Christopher Wiley8f6816e2015-09-22 17:03:47 -07001107 const Type* t = m_types[i];
Christopher Wileye6dee912015-09-22 14:50:23 -07001108 printf("type: package=%s name=%s qualifiedName=%s\n", t->Package().c_str(),
1109 t->Name().c_str(), t->QualifiedName().c_str());
1110 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001111}
Christopher Wileyfdeb0f42015-09-11 15:38:22 -07001112
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -07001113const Type* JavaTypeNamespace::IntType() const { return m_int_type; }
1114
Christopher Wileyfdeb0f42015-09-11 15:38:22 -07001115} // namespace aidl
1116} // namespace android