EnumType.cpp revision 19ca75ae47df5cd9447b232c31c5df1d110e85d9
11aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber/* 21aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Copyright (C) 2016 The Android Open Source Project 31aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * 41aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 51aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * you may not use this file except in compliance with the License. 61aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * You may obtain a copy of the License at 71aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * 81aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 91aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * 101aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Unless required by applicable law or agreed to in writing, software 111aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 121aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * See the License for the specific language governing permissions and 141aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * limitations under the License. 151aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber */ 161aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber 17c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "EnumType.h" 18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 19c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Formatter.h" 201c8580863620f425188e86ec60b90cf269b5201cIliyan Malchev#include <inttypes.h> 21881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include "ScalarType.h" 22c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 23737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber#include <android-base/logging.h> 24737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 25c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android { 26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 27c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberEnumType::EnumType( 289ed827c8cd6e8eddb1ad9987ab9413c1de8a27dfAndreas Huber const char *localName, 299ed827c8cd6e8eddb1ad9987ab9413c1de8a27dfAndreas Huber std::vector<EnumValue *> *values, 309ed827c8cd6e8eddb1ad9987ab9413c1de8a27dfAndreas Huber Type *storageType) 319ed827c8cd6e8eddb1ad9987ab9413c1de8a27dfAndreas Huber : NamedType(localName), 329ed827c8cd6e8eddb1ad9987ab9413c1de8a27dfAndreas Huber mValues(values), 33881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber mStorageType( 34881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber storageType != NULL 35881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ? storageType 36881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber : new ScalarType(ScalarType::KIND_INT32)) { 37c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} 38c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 398d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberconst Type *EnumType::storageType() const { 408d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber return mStorageType; 418d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber} 428d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 438d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberconst std::vector<EnumValue *> &EnumType::values() const { 448d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber return *mValues; 458d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber} 468d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 47737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberconst ScalarType *EnumType::resolveToScalarType() const { 48737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber return mStorageType->resolveToScalarType(); 49737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber} 50737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 518d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool EnumType::isEnum() const { 528d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber return true; 538d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber} 548d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 55881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstd::string EnumType::getCppType(StorageMode, std::string *extra) const { 56881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber extra->clear(); 57881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 580e00de41d11a83ce3becb0dbd20b799acceb19a7Andreas Huber return fullName(); 59881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 60881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 612831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string EnumType::getJavaType() const { 622831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return mStorageType->resolveToScalarType()->getJavaType(); 632831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 642831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 652831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string EnumType::getJavaSuffix() const { 662831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return mStorageType->resolveToScalarType()->getJavaSuffix(); 672831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 682831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 69881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid EnumType::emitReaderWriter( 70881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 71881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 73881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 74881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 75881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode) const { 76737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber const ScalarType *scalarType = mStorageType->resolveToScalarType(); 77737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber CHECK(scalarType != NULL); 78737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 79737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber scalarType->emitReaderWriterWithCast( 80737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber out, 81737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber name, 82737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber parcelObj, 83737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber parcelObjIsPointer, 84737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber isReader, 85737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber mode, 86737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber true /* needsCast */); 87881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 88881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 8985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid EnumType::emitJavaFieldReaderWriter( 9085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 9185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &blobName, 9285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName, 9385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &offset, 9485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const { 9585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber return mStorageType->emitJavaFieldReaderWriter( 9685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out, blobName, fieldName, offset, isReader); 9785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 9885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 99881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t EnumType::emitTypeDeclarations(Formatter &out) const { 100737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber const ScalarType *scalarType = mStorageType->resolveToScalarType(); 101737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber CHECK(scalarType != NULL); 102737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber std::string extra; 104881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "enum class " 1060e00de41d11a83ce3becb0dbd20b799acceb19a7Andreas Huber << localName() 107881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << " : " 108737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber << ((Type *)scalarType)->getCppType(&extra) 109881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << " {\n"; 110881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 111881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out.indent(); 112881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1138d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber std::vector<const EnumType *> chain; 114864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang getTypeChain(&chain); 1158d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 1168d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber for (auto it = chain.rbegin(); it != chain.rend(); ++it) { 1178d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber const auto &type = *it; 1188d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 1198d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber for (const auto &entry : type->values()) { 1208d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber out << entry->name(); 1218d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 1225788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong const char *value = entry->cppValue(scalarType->getKind()); 1238d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber if (value != NULL) { 1248d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber out << " = " << value; 1258d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber } 1268d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 1275788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong out << ","; 1285788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong 1295788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong const char *comment = entry->comment(); 1305788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong if (comment != NULL && strcmp(comment, value) != 0) { 1315788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong out << " // " << comment; 1325788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong } 1335788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong 1345788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong out << "\n"; 1358d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber } 136881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 137881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 138881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out.unindent(); 139881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "};\n\n"; 140881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 141881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return OK; 142881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 143881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1442831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber// Attempt to convert enum value literals into their signed equivalents, 1452831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber// i.e. if an enum value is stored in typeName 'byte', the value "192" 1462831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber// will be converted to the output "-64". 1472831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstatic bool MakeSignedIntegerValue( 1482831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &typeName, const char *value, std::string *output) { 1492831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber output->clear(); 1502831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 1512831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber char *end; 1522831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber long long x = strtoll(value, &end, 10); 1532831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 1542831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber if (end > value && *end == '\0' && errno != ERANGE) { 1552831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber char out[32]; 1562831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber if (typeName == "byte") { 1572831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber sprintf(out, "%d", (int)(int8_t)x); 1582831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } else if (typeName == "short") { 1592831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber sprintf(out, "%d", (int)(int16_t)x); 1602831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } else if (typeName == "int") { 1612831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber sprintf(out, "%d", (int)(int32_t)x); 1622831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } else { 1632831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber assert(typeName == "long"); 1641c8580863620f425188e86ec60b90cf269b5201cIliyan Malchev sprintf(out, "%" PRId64 "L", (int64_t)x); 1652831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } 1662831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 1672831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber *output = out; 1682831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return true; 1692831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } 1702831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 1712831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return false; 1722831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 1732831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 17485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstatus_t EnumType::emitJavaTypeDeclarations(Formatter &out, bool) const { 1752831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const ScalarType *scalarType = mStorageType->resolveToScalarType(); 1762831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber CHECK(scalarType != NULL); 1772831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 1782831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << "public final class " 1792831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << localName() 1802831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << " {\n"; 1812831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 1822831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out.indent(); 1832831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 1842831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string typeName = scalarType->getJavaType(); 1852831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 1862831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber std::vector<const EnumType *> chain; 187864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang getTypeChain(&chain); 1882831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 1892831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber for (auto it = chain.rbegin(); it != chain.rend(); ++it) { 1902831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const auto &type = *it; 1912831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 1922831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber for (const auto &entry : type->values()) { 1932831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << "public static final " 1942831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << typeName 1952831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << " " 1962831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << entry->name(); 1972831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 19819ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong const char *value = entry->javaValue(scalarType->getKind()); 1992831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber if (value != NULL) { 2002831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << " = "; 2012831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 2022831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber std::string convertedValue; 2032831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber if (MakeSignedIntegerValue(typeName, value, &convertedValue)) { 2042831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << convertedValue; 2052831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } else { 2062831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber // The value is not an integer, but some other string, 2072831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber // hopefully referring to some other enum name. 2082831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << value; 2092831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } 2102831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } 2112831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 21219ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong out << ";"; 21319ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong 21419ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong const char *comment = entry->comment(); 21519ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong if (comment != NULL && strcmp(comment, value) != 0) { 21619ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong out << " // " << comment; 21719ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong } 21819ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong 21919ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong out << "\n"; 2202831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } 2212831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } 2222831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 2232831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out.unindent(); 2242831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << "};\n\n"; 2252831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 2262831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return OK; 2272831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 2282831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 2295158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t EnumType::emitVtsTypeDeclarations(Formatter &out) const { 230864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang out << "name: \"" << localName() << "\"\n" 2315158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang << "type: TYPE_ENUM\n" 2325158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang << "enum_value: {\n"; 2335158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang out.indent(); 234864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 235864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang std::vector<const EnumType *> chain; 236864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang getTypeChain(&chain); 237864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 238864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang for (auto it = chain.rbegin(); it != chain.rend(); ++it) { 239864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang const auto &type = *it; 240864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 241864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang for (const auto &entry : type->values()) { 242864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang out << "enumerator: \"" << entry->name() << "\"\n"; 243864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 244864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang const char *value = entry->value(); 245864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang if (value != NULL) { 246864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang out << "value: " << value << "\n"; 247864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang } 248864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang } 2495158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang } 250864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 2515158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang out.unindent(); 2525158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang out << "}\n"; 2535158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang return OK; 2545158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang} 2555158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 256864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t EnumType::emitVtsAttributeType(Formatter &out) const { 257199335277986f45bef3aaf8787d57b4c3c6b6b9aZhuoyao Zhang out << "type: TYPE_ENUM\n" 258199335277986f45bef3aaf8787d57b4c3c6b6b9aZhuoyao Zhang << "predefined_type: \"" 259199335277986f45bef3aaf8787d57b4c3c6b6b9aZhuoyao Zhang << localName() 260199335277986f45bef3aaf8787d57b4c3c6b6b9aZhuoyao Zhang << "\"\n"; 2615158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang return OK; 2625158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang} 2635158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 264864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangvoid EnumType::getTypeChain(std::vector<const EnumType *> *out) const { 265864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang out->clear(); 266864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang const EnumType *type = this; 267864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang for (;;) { 268864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang out->push_back(type); 269864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 270864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang const Type *superType = type->storageType(); 271864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang if (superType == NULL || !superType->isEnum()) { 272864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang break; 273864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang } 274864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 275864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang type = static_cast<const EnumType *>(superType); 276864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang } 277864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang} 278864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 27985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid EnumType::getAlignmentAndSize(size_t *align, size_t *size) const { 28085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber mStorageType->getAlignmentAndSize(align, size); 28185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 28285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 28331629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber//////////////////////////////////////////////////////////////////////////////// 28431629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 2855788697381666844eeb23e04e5c6f83ec6ec8b44Yifan HongEnumValue::EnumValue(const char *name, const ConstantExpression *value) 28631629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber : mName(name), 28731629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber mValue(value) { 28831629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber} 28931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 29031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberstd::string EnumValue::name() const { 29131629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber return mName; 29231629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber} 29331629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 29431629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberconst char *EnumValue::value() const { 2955788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong return mValue ? mValue->value() : nullptr; 2965788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong} 2975788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong 2985788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hongconst char *EnumValue::cppValue(ScalarType::Kind castKind) const { 2995788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong return mValue ? mValue->cppValue(castKind) : nullptr; 3005788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong} 30119ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hongconst char *EnumValue::javaValue(ScalarType::Kind castKind) const { 30219ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong return mValue ? mValue->javaValue(castKind) : nullptr; 30319ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong} 3045788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong 3055788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hongconst char *EnumValue::comment() const { 3065788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong return mValue ? mValue->description() : nullptr; 30731629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber} 30831629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 309c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} // namespace android 310c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 311