Type.cpp revision 8d3ac0c6112e02e3a705fd4f9d82e523f10b4287
1c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Type.h"
2c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
3881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include "Formatter.h"
48d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber#include "ScalarType.h"
5881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
6881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include <android-base/logging.h>
7881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
8c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
9c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
10c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberType::Type() {}
11c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberType::~Type() {}
12c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
135345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huberbool Type::isScope() const {
145345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber    return false;
155345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber}
165345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber
17a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huberbool Type::isInterface() const {
18a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber    return false;
19a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber}
20a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber
218d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isEnum() const {
228d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return false;
238d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
248d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
258d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isTypeDef() const {
268d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return false;
278d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
288d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
29737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberconst ScalarType *Type::resolveToScalarType() const {
30737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    return NULL;
31737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber}
32737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
338d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isValidEnumStorageType() const {
348d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    const ScalarType *scalarType = resolveToScalarType();
358d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
368d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    if (scalarType == NULL) {
378d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        return false;
388d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    }
398d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
408d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return scalarType->isValidEnumStorageType();
418d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
428d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
43881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstd::string Type::getCppType(StorageMode, std::string *) const {
44881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
45881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return std::string();
46881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
47881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
48881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriter(
49881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &,
50881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
51881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
52881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
53881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
54881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode) const {
55881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
56881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
57881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
58881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbedded(
59881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &,
60881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
61881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
62881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
63881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
64881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
65881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode,
66881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
67881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &) const {
68881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
69881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
70881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
71881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::handleError(Formatter &out, ErrorMode mode) const {
72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
73881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Ignore:
74881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
75881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out << "/* _aidl_err ignored! */\n\n";
76881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
77881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
78881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
79881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Goto:
80881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
81881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out << "if (_aidl_err != ::android::OK) { goto _aidl_error; }\n\n";
82881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
83881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
84881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
85881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Break:
86881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
87881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out << "if (_aidl_err != ::android::OK) { break; }\n\n";
88881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
89881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
90737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
91737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        case ErrorMode_Return:
92737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        {
93737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            out << "if (_aidl_err != ::android::OK) { return _aidl_err; }\n\n";
94737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            break;
95737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        }
96881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
97881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
98881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
99881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::handleError2(Formatter &out, ErrorMode mode) const {
100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Goto:
102881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out << "goto _aidl_error;\n";
104881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
106737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
107881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Break:
108881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
109881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out << "break;\n";
110881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
111881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
112737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
113881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Ignore:
114881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
115881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out << "/* ignoring _aidl_error! */";
116881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
117881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
118737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
119737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        case ErrorMode_Return:
120737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        {
121737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            out << "return _aidl_err;\n";
122737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            break;
123737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        }
124881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
125881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
126881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
127881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbeddedForTypeName(
128881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &out,
129881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &name,
130881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool nameIsPointer,
131881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parcelObj,
132881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool parcelObjIsPointer,
133881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool isReader,
134881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode mode,
135881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parentName,
136881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &offsetText,
137881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &typeName,
138881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &childName) const {
139881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string parcelObjDeref =
140881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObjIsPointer ? ("*" + parcelObj) : parcelObj;
141881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
142881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string parcelObjPointer =
143881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObjIsPointer ? parcelObj : ("&" + parcelObj);
144881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
145881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
146881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string namePointer = nameIsPointer ? name : ("&" + name);
147881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
148881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << "_aidl_err = ";
149881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
150881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (isReader) {
151881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << "const_cast<"
152881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << typeName
153881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << " *>("
154881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << namePointer
155881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << ")->readEmbeddedFromParcel(\n";
156881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    } else {
157881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << nameDeref
158881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << "writeEmbeddedToParcel(\n";
159881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
160881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
161881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.indent();
162881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.indent();
163881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
164881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << (isReader ? parcelObjDeref : parcelObjPointer)
165881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << ",\n"
166881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << parentName
167881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << ",\n"
168881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << offsetText;
169881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
170881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (!childName.empty()) {
171881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << ", &"
172881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << childName;
173881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
174881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
175881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << ");\n\n";
176881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
177881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
178881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
179881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
180881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    handleError(out, mode);
181881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
182881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
183881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDeclarations(Formatter &) const {
184881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
185881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
186881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
187881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDefinitions(
188881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &, const std::string) const {
189881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
190881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
191881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
192881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::needsEmbeddedReadWrite() const {
193881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return false;
194881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
195881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
196881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::resultNeedsDeref() const {
197881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return false;
198881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
199881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
200881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstd::string Type::getCppType(std::string *extra) const {
201881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return getCppType(StorageMode_Stack, extra);
202881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
203881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
204881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstd::string Type::getCppResultType(std::string *extra) const {
205881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return getCppType(StorageMode_Result, extra);
206881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
207881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
208881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstd::string Type::getCppArgumentType(std::string *extra) const {
209881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return getCppType(StorageMode_Argument, extra);
210881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
211881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
212c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
213c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
214