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