EnumType.cpp revision fd3f250dfb0f1a990c29a76de184830e6dd9e883
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 19cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov#include <hidl-util/Formatter.h> 20cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov#include <inttypes.h> 21e8ee6a005bee05611c9ac6b4d29850a191152021Timur Iskhakov#include <iostream> 22cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov#include <unordered_map> 23cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 24019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber#include "Annotation.h" 25505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov#include "Location.h" 26881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include "ScalarType.h" 27c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 28c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android { 29c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 30505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur IskhakovEnumType::EnumType(const char* localName, const Location& location, 31505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov const Reference<Type>& storageType, Scope* parent) 32dbaed3317411232962d25666de60799b4dcfce98Timur Iskhakov : Scope(localName, location, parent), 33dbaed3317411232962d25666de60799b4dcfce98Timur Iskhakov mValues(), 34dbaed3317411232962d25666de60799b4dcfce98Timur Iskhakov mStorageType(storageType), 35dbaed3317411232962d25666de60799b4dcfce98Timur Iskhakov mBitfieldType(new BitFieldType(parent)) { 36dbaed3317411232962d25666de60799b4dcfce98Timur Iskhakov mBitfieldType->setElementType(Reference<Type>(this, Location())); 37c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} 38c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 398d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberconst Type *EnumType::storageType() const { 40b3f8bcb56965177f8064679150497b6e586df2eeTimur Iskhakov return mStorageType.get(); 418d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber} 428d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 438d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberconst std::vector<EnumValue *> &EnumType::values() const { 44f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return mValues; 45f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong} 46f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 47cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakovvoid EnumType::addValue(EnumValue* value) { 48f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(value != nullptr); 49cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov mValues.push_back(value); 50cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov} 51f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 52cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakovstatus_t EnumType::resolveInheritance() { 53cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov const EnumType* prevType = nullptr; 54cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov EnumValue* prevValue = nullptr; 55cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 56cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov for (const auto* type : superTypeChain()) { 57cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov if (!type->values().empty()) { 58cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov prevType = type; 59cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov prevValue = type->values().back(); 60f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong break; 61f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } 62f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } 63f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 64cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov for (auto* value : mValues) { 65cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov value->autofill(prevType, prevValue, mStorageType->resolveToScalarType()); 66cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov prevType = this; 67cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov prevValue = value; 68cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov } 69cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 70cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov return Scope::resolveInheritance(); 71cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov} 72cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 73b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakovstd::vector<const Reference<Type>*> EnumType::getReferences() const { 74b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov return {&mStorageType}; 7533431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov} 76cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 77b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakovstd::vector<const ConstantExpression*> EnumType::getConstantExpressions() const { 78b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov std::vector<const ConstantExpression*> ret; 79891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov for (const auto* value : mValues) { 80891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov ret.push_back(value->constExpr()); 81cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov } 82891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov return ret; 83cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov} 84cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 85cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakovstatus_t EnumType::validate() const { 86a15f8091d2d4312a16edfcebccb13b3ea4782c29Timur Iskhakov CHECK(getSubTypes().empty()); 87a15f8091d2d4312a16edfcebccb13b3ea4782c29Timur Iskhakov 88cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov if (!isElidableType() || !mStorageType->isValidEnumStorageType()) { 89cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov std::cerr << "ERROR: Invalid enum storage type (" << (mStorageType)->typeName() 90cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov << ") specified at " << mStorageType.location() << "\n"; 91cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov return UNKNOWN_ERROR; 92cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov } 93cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 9433431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov status_t err = validateUniqueNames(); 95cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov if (err != OK) return err; 96cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 97cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov return Scope::validate(); 98cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov} 99cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 100cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakovstatus_t EnumType::validateUniqueNames() const { 101cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov std::unordered_map<std::string, const EnumType*> registeredValueNames; 102cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov for (const auto* type : superTypeChain()) { 103cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov for (const auto* enumValue : type->mValues) { 104cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov // No need to check super value uniqueness 105cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov registeredValueNames[enumValue->name()] = type; 106cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov } 107cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov } 108cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 109cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov for (const auto* value : mValues) { 110cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov auto registered = registeredValueNames.find(value->name()); 111cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 112cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov if (registered != registeredValueNames.end()) { 113cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov const EnumType* definedInType = registered->second; 114cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 115cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov if (definedInType == this) { 116cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov // Defined in this enum 117cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov std::cerr << "ERROR: Redefinition of value '" << value->name() << "'"; 118cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov } else { 119cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov // Defined in super enum 120ec123f3609c91fb5b1361466aedd8e2591c6bf83Timur Iskhakov std::cerr << "ERROR: Redefinition of value '" << value->name() 121ec123f3609c91fb5b1361466aedd8e2591c6bf83Timur Iskhakov << "' defined in enum '" << definedInType->fullName() << "'"; 122cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov } 123cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov std::cerr << " at " << value->location() << "\n"; 124cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov return UNKNOWN_ERROR; 125cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov } 126cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 127cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov registeredValueNames[value->name()] = this; 128cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov } 129cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 130cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov return OK; 1318d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber} 1328d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 1339df5244c1dd4508cc2e25f8a04d363903912d19cSteven Morelandbool EnumType::isElidableType() const { 1349df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland return mStorageType->isElidableType(); 1359df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland} 1369df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland 137737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberconst ScalarType *EnumType::resolveToScalarType() const { 138737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber return mStorageType->resolveToScalarType(); 139737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber} 140737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 14130bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Morelandstd::string EnumType::typeName() const { 14230bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland return "enum " + localName(); 14330bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland} 14430bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland 1458d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool EnumType::isEnum() const { 1468d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber return true; 1478d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber} 1488d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 149c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hongbool EnumType::canCheckEquality() const { 150c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong return true; 151c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong} 152c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong 153979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string EnumType::getCppType(StorageMode, 154e30ee9b06ac578006161e84633db91289f889068Steven Moreland bool /* specifyNamespaces */) const { 155e30ee9b06ac578006161e84633db91289f889068Steven Moreland return fullName(); 156881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 157881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1584ed1347cd29e6e07acad368891bb03078c798abaYifan Hongstd::string EnumType::getJavaType(bool forInitializer) const { 1594ed1347cd29e6e07acad368891bb03078c798abaYifan Hong return mStorageType->resolveToScalarType()->getJavaType(forInitializer); 1602831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 1612831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 1622831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string EnumType::getJavaSuffix() const { 1632831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return mStorageType->resolveToScalarType()->getJavaSuffix(); 1642831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 1652831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 166a3558b3b273695b31fbe1025339956966cde39c4Andreas Huberstd::string EnumType::getJavaWrapperType() const { 167a3558b3b273695b31fbe1025339956966cde39c4Andreas Huber return mStorageType->resolveToScalarType()->getJavaWrapperType(); 168a3558b3b273695b31fbe1025339956966cde39c4Andreas Huber} 169a3558b3b273695b31fbe1025339956966cde39c4Andreas Huber 170c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhangstd::string EnumType::getVtsType() const { 171c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang return "TYPE_ENUM"; 172c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang} 173c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang 17463f399021d053453704d41845d4ebcc06fe01738Timur IskhakovBitFieldType::BitFieldType(Scope* parent) : TemplatedType(parent) {} 17563f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov 17624e605b5194d969a1558d94896d69cc554881e46Timur Iskhakovconst BitFieldType* EnumType::getBitfieldType() const { 177dbaed3317411232962d25666de60799b4dcfce98Timur Iskhakov return mBitfieldType; 178e45b5303e072043679483a70606f6c00dde17382Yifan Hong} 179e45b5303e072043679483a70606f6c00dde17382Yifan Hong 180f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan HongLocalIdentifier *EnumType::lookupIdentifier(const std::string &name) const { 181f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov std::vector<const EnumType*> chain = typeChain(); 182f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong for (auto it = chain.begin(); it != chain.end(); ++it) { 183f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong const auto &type = *it; 184f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong for(EnumValue *v : type->values()) { 185f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong if(v->name() == name) { 186f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return v; 187f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } 188f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } 189f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } 190f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return nullptr; 191f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong} 192f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 193881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid EnumType::emitReaderWriter( 194881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 195881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 196881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 197881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 198881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 199881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode) const { 200737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber const ScalarType *scalarType = mStorageType->resolveToScalarType(); 201737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber CHECK(scalarType != NULL); 202737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 203737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber scalarType->emitReaderWriterWithCast( 204737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber out, 205737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber name, 206737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber parcelObj, 207737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber parcelObjIsPointer, 208737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber isReader, 209737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber mode, 210737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber true /* needsCast */); 211881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 212881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 21385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid EnumType::emitJavaFieldReaderWriter( 21485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 2154c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber size_t depth, 216709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber const std::string &parcelName, 21785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &blobName, 21885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName, 21985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &offset, 22085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const { 22185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber return mStorageType->emitJavaFieldReaderWriter( 222709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber out, depth, parcelName, blobName, fieldName, offset, isReader); 22385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 22485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 225881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t EnumType::emitTypeDeclarations(Formatter &out) const { 226737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber const ScalarType *scalarType = mStorageType->resolveToScalarType(); 227e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber CHECK(scalarType != nullptr); 228737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 2293b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong const std::string storageType = scalarType->getCppStackType(); 230881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 231881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "enum class " 2320e00de41d11a83ce3becb0dbd20b799acceb19a7Andreas Huber << localName() 233881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << " : " 234e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber << storageType 235881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << " {\n"; 236881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 237881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out.indent(); 238881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 239f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov std::vector<const EnumType*> chain = typeChain(); 2408d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 2418d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber for (auto it = chain.rbegin(); it != chain.rend(); ++it) { 2428d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber const auto &type = *it; 2438d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 2448d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber for (const auto &entry : type->values()) { 2458d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber out << entry->name(); 2468d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 247fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hong std::string value = entry->cppValue(scalarType->getKind()); 248f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(!value.empty()); // use autofilled values for c++. 249f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong out << " = " << value; 2508d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 2515788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong out << ","; 2525788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong 253fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hong std::string comment = entry->comment(); 254505e56125eba2ce327892646eed799419240e59dTimur Iskhakov if (!comment.empty()) { 2555788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong out << " // " << comment; 2565788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong } 2575788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong 2585788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong out << "\n"; 2598d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber } 260881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 261881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 262881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out.unindent(); 263881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "};\n\n"; 264881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 265881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return OK; 266881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 267881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 268fd3f250dfb0f1a990c29a76de184830e6dd9e883Timur Iskhakovvoid EnumType::emitTypeForwardDeclaration(Formatter& out) const { 269fd3f250dfb0f1a990c29a76de184830e6dd9e883Timur Iskhakov const ScalarType* scalarType = mStorageType->resolveToScalarType(); 270fd3f250dfb0f1a990c29a76de184830e6dd9e883Timur Iskhakov const std::string storageType = scalarType->getCppStackType(); 271fd3f250dfb0f1a990c29a76de184830e6dd9e883Timur Iskhakov 272fd3f250dfb0f1a990c29a76de184830e6dd9e883Timur Iskhakov out << "enum class " << localName() << " : " << storageType << ";\n"; 273fd3f250dfb0f1a990c29a76de184830e6dd9e883Timur Iskhakov} 274fd3f250dfb0f1a990c29a76de184830e6dd9e883Timur Iskhakov 2752820f8a2b8f1d525e7ea5eaed50ba600c0186ccfJayant Chowdharyvoid EnumType::emitEnumBitwiseOperator( 2762820f8a2b8f1d525e7ea5eaed50ba600c0186ccfJayant Chowdhary Formatter &out, 277c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong bool lhsIsEnum, 278c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong bool rhsIsEnum, 2792820f8a2b8f1d525e7ea5eaed50ba600c0186ccfJayant Chowdhary const std::string &op) const { 280e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber const ScalarType *scalarType = mStorageType->resolveToScalarType(); 281e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber CHECK(scalarType != nullptr); 282e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 2833b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong const std::string storageType = scalarType->getCppStackType(); 284e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 285c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "constexpr " 286c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << storageType 2872820f8a2b8f1d525e7ea5eaed50ba600c0186ccfJayant Chowdhary << " operator" 2882820f8a2b8f1d525e7ea5eaed50ba600c0186ccfJayant Chowdhary << op 289c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << "(const " 290c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << (lhsIsEnum ? fullName() : storageType) 291c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << " lhs, const " 292c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << (rhsIsEnum ? fullName() : storageType) 293c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << " rhs) {\n"; 294e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 29533223ca2a9b8126d357e0986905fa35c0970a30eYifan Hong out.indent([&] { 296c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "return static_cast<" 297c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << storageType 298c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << ">("; 299e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 300c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong if (lhsIsEnum) { 301c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "static_cast<" 302c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << storageType 303c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << ">(lhs)"; 304c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong } else { 305c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "lhs"; 306c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong } 307c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << " " << op << " "; 308c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong if (rhsIsEnum) { 309c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "static_cast<" 310c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << storageType 311c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << ">(rhs)"; 312c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong } else { 313c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "rhs"; 314c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong } 315c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << ");\n"; 316c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong }); 317e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 318c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "}\n\n"; 319c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 320e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 321c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongvoid EnumType::emitBitFieldBitwiseAssignmentOperator( 322c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong Formatter &out, 323c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &op) const { 324c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const ScalarType *scalarType = mStorageType->resolveToScalarType(); 325c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong CHECK(scalarType != nullptr); 326e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 327c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string storageType = scalarType->getCppStackType(); 328c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 329c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "constexpr " << storageType << " &operator" << op << "=(" 330c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << storageType << "& v, const " << fullName() << " e) {\n"; 331c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 33233223ca2a9b8126d357e0986905fa35c0970a30eYifan Hong out.indent([&] { 333c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "v " << op << "= static_cast<" << storageType << ">(e);\n"; 334c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "return v;\n"; 335c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong }); 336e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 337e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber out << "}\n\n"; 338e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber} 339e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 340e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huberstatus_t EnumType::emitGlobalTypeDeclarations(Formatter &out) const { 341c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitEnumBitwiseOperator(out, true /* lhsIsEnum */, true /* rhsIsEnum */, "|"); 342c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitEnumBitwiseOperator(out, false /* lhsIsEnum */, true /* rhsIsEnum */, "|"); 343c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitEnumBitwiseOperator(out, true /* lhsIsEnum */, false /* rhsIsEnum */, "|"); 344c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitEnumBitwiseOperator(out, true /* lhsIsEnum */, true /* rhsIsEnum */, "&"); 345c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitEnumBitwiseOperator(out, false /* lhsIsEnum */, true /* rhsIsEnum */, "&"); 346c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitEnumBitwiseOperator(out, true /* lhsIsEnum */, false /* rhsIsEnum */, "&"); 347c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 348c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitBitFieldBitwiseAssignmentOperator(out, "|"); 349c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitBitFieldBitwiseAssignmentOperator(out, "&"); 350e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 351870d1a7ccd70bd710128993de401278614d1975eYifan Hong // toString for bitfields, equivalent to dumpBitfield in Java 352f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong out << "template<typename>\n" 353f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong << "std::string toString(" 354f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong << resolveToScalarType()->getCppArgumentType() 355f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong << " o);\n"; 356f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong out << "template<>\n" 357f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong << "std::string toString<" << getCppStackType() << ">(" 358f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong << resolveToScalarType()->getCppArgumentType() 359f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong << " o);\n\n"; 360f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong 361870d1a7ccd70bd710128993de401278614d1975eYifan Hong // toString for enum itself 362870d1a7ccd70bd710128993de401278614d1975eYifan Hong out << "std::string toString(" 363f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong << getCppArgumentType() 364870d1a7ccd70bd710128993de401278614d1975eYifan Hong << " o);\n\n"; 365f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong 366f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong return OK; 367f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong} 368f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong 3698c90cc59bf93bd0c08970b4488067a33015d4a1cChih-Hung Hsiehstatus_t EnumType::emitTypeDefinitions(Formatter& out, const std::string& /* prefix */) const { 370f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong const ScalarType *scalarType = mStorageType->resolveToScalarType(); 371f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong CHECK(scalarType != NULL); 372f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong 373f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong out << "template<>\n" 374f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong << "std::string toString<" << getCppStackType() << ">(" 375870d1a7ccd70bd710128993de401278614d1975eYifan Hong << scalarType->getCppArgumentType() 376f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong << " o) "; 377f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong out.block([&] { 378f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong // include toHexString for scalar types 379f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong out << "using ::android::hardware::details::toHexString;\n" 380870d1a7ccd70bd710128993de401278614d1975eYifan Hong << "std::string os;\n" 381870d1a7ccd70bd710128993de401278614d1975eYifan Hong << getBitfieldType()->getCppStackType() << " flipped = 0;\n" 382870d1a7ccd70bd710128993de401278614d1975eYifan Hong << "bool first = true;\n"; 383f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong for (EnumValue *value : values()) { 384870d1a7ccd70bd710128993de401278614d1975eYifan Hong std::string valueName = fullName() + "::" + value->name(); 385870d1a7ccd70bd710128993de401278614d1975eYifan Hong out.sIf("(o & " + valueName + ")" + 386870d1a7ccd70bd710128993de401278614d1975eYifan Hong " == static_cast<" + scalarType->getCppStackType() + 387870d1a7ccd70bd710128993de401278614d1975eYifan Hong ">(" + valueName + ")", [&] { 388870d1a7ccd70bd710128993de401278614d1975eYifan Hong out << "os += (first ? \"\" : \" | \");\n" 389870d1a7ccd70bd710128993de401278614d1975eYifan Hong << "os += \"" << value->name() << "\";\n" 390f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong << "first = false;\n" 391870d1a7ccd70bd710128993de401278614d1975eYifan Hong << "flipped |= " << valueName << ";\n"; 392f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong }).endl(); 393f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong } 394870d1a7ccd70bd710128993de401278614d1975eYifan Hong // put remaining bits 395870d1a7ccd70bd710128993de401278614d1975eYifan Hong out.sIf("o != flipped", [&] { 396870d1a7ccd70bd710128993de401278614d1975eYifan Hong out << "os += (first ? \"\" : \" | \");\n"; 397870d1a7ccd70bd710128993de401278614d1975eYifan Hong scalarType->emitHexDump(out, "os", "o & (~flipped)"); 398870d1a7ccd70bd710128993de401278614d1975eYifan Hong }); 399f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong out << "os += \" (\";\n"; 400f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong scalarType->emitHexDump(out, "os", "o"); 401f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong out << "os += \")\";\n"; 402f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong 403f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong out << "return os;\n"; 404f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong }).endl().endl(); 405f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong 406870d1a7ccd70bd710128993de401278614d1975eYifan Hong out << "std::string toString(" 407870d1a7ccd70bd710128993de401278614d1975eYifan Hong << getCppArgumentType() 408870d1a7ccd70bd710128993de401278614d1975eYifan Hong << " o) "; 409870d1a7ccd70bd710128993de401278614d1975eYifan Hong 410870d1a7ccd70bd710128993de401278614d1975eYifan Hong out.block([&] { 411870d1a7ccd70bd710128993de401278614d1975eYifan Hong out << "using ::android::hardware::details::toHexString;\n"; 412870d1a7ccd70bd710128993de401278614d1975eYifan Hong for (EnumValue *value : values()) { 413870d1a7ccd70bd710128993de401278614d1975eYifan Hong out.sIf("o == " + fullName() + "::" + value->name(), [&] { 414870d1a7ccd70bd710128993de401278614d1975eYifan Hong out << "return \"" << value->name() << "\";\n"; 415870d1a7ccd70bd710128993de401278614d1975eYifan Hong }).endl(); 416870d1a7ccd70bd710128993de401278614d1975eYifan Hong } 417870d1a7ccd70bd710128993de401278614d1975eYifan Hong out << "std::string os;\n"; 418870d1a7ccd70bd710128993de401278614d1975eYifan Hong scalarType->emitHexDump(out, "os", 419870d1a7ccd70bd710128993de401278614d1975eYifan Hong "static_cast<" + scalarType->getCppStackType() + ">(o)"); 420870d1a7ccd70bd710128993de401278614d1975eYifan Hong out << "return os;\n"; 421870d1a7ccd70bd710128993de401278614d1975eYifan Hong }).endl().endl(); 422870d1a7ccd70bd710128993de401278614d1975eYifan Hong 423e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber return OK; 424e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber} 425e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 426e45b5303e072043679483a70606f6c00dde17382Yifan Hongstatus_t EnumType::emitJavaTypeDeclarations(Formatter &out, bool atTopLevel) const { 4272831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const ScalarType *scalarType = mStorageType->resolveToScalarType(); 4282831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber CHECK(scalarType != NULL); 4292831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 430e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << "public " 431e45b5303e072043679483a70606f6c00dde17382Yifan Hong << (atTopLevel ? "" : "static ") 432e45b5303e072043679483a70606f6c00dde17382Yifan Hong << "final class " 4332831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << localName() 4342831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << " {\n"; 4352831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 4362831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out.indent(); 4372831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 4384c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber const std::string typeName = 4394ed1347cd29e6e07acad368891bb03078c798abaYifan Hong scalarType->getJavaType(false /* forInitializer */); 4402831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 441f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov std::vector<const EnumType*> chain = typeChain(); 4422831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 4432831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber for (auto it = chain.rbegin(); it != chain.rend(); ++it) { 4442831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const auto &type = *it; 4452831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 4462831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber for (const auto &entry : type->values()) { 4472831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << "public static final " 4482831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << typeName 4492831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << " " 450ab647c09e65af4f6236f48b999244cccb11f6b57Andreas Huber << entry->name() 451ab647c09e65af4f6236f48b999244cccb11f6b57Andreas Huber << " = "; 4522831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 453f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong // javaValue will make the number signed. 454fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hong std::string value = entry->javaValue(scalarType->getKind()); 455f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(!value.empty()); // use autofilled values for java. 456f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong out << value; 4572831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 45819ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong out << ";"; 45919ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong 460fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hong std::string comment = entry->comment(); 461505e56125eba2ce327892646eed799419240e59dTimur Iskhakov if (!comment.empty()) { 46219ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong out << " // " << comment; 46319ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong } 46419ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong 46519ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong out << "\n"; 4662831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } 4672831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } 4682831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 469e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << "public static final String toString(" 470e45b5303e072043679483a70606f6c00dde17382Yifan Hong << typeName << " o) "; 471e45b5303e072043679483a70606f6c00dde17382Yifan Hong out.block([&] { 472e45b5303e072043679483a70606f6c00dde17382Yifan Hong for (EnumValue *value : values()) { 473e45b5303e072043679483a70606f6c00dde17382Yifan Hong out.sIf("o == " + value->name(), [&] { 474e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << "return \"" << value->name() << "\";\n"; 475e45b5303e072043679483a70606f6c00dde17382Yifan Hong }).endl(); 476e45b5303e072043679483a70606f6c00dde17382Yifan Hong } 477e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << "return \"0x\" + "; 478e45b5303e072043679483a70606f6c00dde17382Yifan Hong scalarType->emitConvertToJavaHexString(out, "o"); 479e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << ";\n"; 480e45b5303e072043679483a70606f6c00dde17382Yifan Hong }).endl(); 481e45b5303e072043679483a70606f6c00dde17382Yifan Hong 482e45b5303e072043679483a70606f6c00dde17382Yifan Hong auto bitfieldType = getBitfieldType()->getJavaType(false /* forInitializer */); 483e45b5303e072043679483a70606f6c00dde17382Yifan Hong auto bitfieldWrapperType = getBitfieldType()->getJavaWrapperType(); 484e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << "\n" 485e45b5303e072043679483a70606f6c00dde17382Yifan Hong << "public static final String dumpBitfield(" 486e45b5303e072043679483a70606f6c00dde17382Yifan Hong << bitfieldType << " o) "; 487e45b5303e072043679483a70606f6c00dde17382Yifan Hong out.block([&] { 488e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << "java.util.ArrayList<String> list = new java.util.ArrayList<>();\n"; 489e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << bitfieldType << " flipped = 0;\n"; 490e45b5303e072043679483a70606f6c00dde17382Yifan Hong for (EnumValue *value : values()) { 491dd7c57474d49cd3860c0b076fc25d8bc68ae0ec3Yifan Hong if (value->constExpr()->castSizeT() == 0) { 492dd7c57474d49cd3860c0b076fc25d8bc68ae0ec3Yifan Hong out << "list.add(\"" << value->name() << "\"); // " << value->name() << " == 0\n"; 493dd7c57474d49cd3860c0b076fc25d8bc68ae0ec3Yifan Hong continue; 494dd7c57474d49cd3860c0b076fc25d8bc68ae0ec3Yifan Hong } 495e45b5303e072043679483a70606f6c00dde17382Yifan Hong out.sIf("(o & " + value->name() + ") == " + value->name(), [&] { 496e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << "list.add(\"" << value->name() << "\");\n"; 497e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << "flipped |= " << value->name() << ";\n"; 498e45b5303e072043679483a70606f6c00dde17382Yifan Hong }).endl(); 499e45b5303e072043679483a70606f6c00dde17382Yifan Hong } 500e45b5303e072043679483a70606f6c00dde17382Yifan Hong // put remaining bits 501e45b5303e072043679483a70606f6c00dde17382Yifan Hong out.sIf("o != flipped", [&] { 502e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << "list.add(\"0x\" + "; 503e45b5303e072043679483a70606f6c00dde17382Yifan Hong scalarType->emitConvertToJavaHexString(out, "o & (~flipped)"); 504e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << ");\n"; 505e45b5303e072043679483a70606f6c00dde17382Yifan Hong }).endl(); 506e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << "return String.join(\" | \", list);\n"; 507e45b5303e072043679483a70606f6c00dde17382Yifan Hong }).endl().endl(); 508e45b5303e072043679483a70606f6c00dde17382Yifan Hong 5092831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out.unindent(); 5102831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << "};\n\n"; 5112831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 5122831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return OK; 5132831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 5142831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 5155158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t EnumType::emitVtsTypeDeclarations(Formatter &out) const { 516c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong const ScalarType *scalarType = mStorageType->resolveToScalarType(); 517c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong 518bf828c8f6e1a1345e352976d5b6b91b2f5c52a2bZhuoyao Zhang out << "name: \"" << fullName() << "\"\n"; 519c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out << "type: " << getVtsType() << "\n"; 520c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out << "enum_value: {\n"; 5215158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang out.indent(); 522864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 523c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out << "scalar_type: \"" 524c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong << scalarType->getVtsScalarType() 525c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang << "\"\n\n"; 526f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov std::vector<const EnumType*> chain = typeChain(); 527864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 528864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang for (auto it = chain.rbegin(); it != chain.rend(); ++it) { 529864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang const auto &type = *it; 530864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 531864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang for (const auto &entry : type->values()) { 532864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang out << "enumerator: \"" << entry->name() << "\"\n"; 533c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out << "scalar_value: {\n"; 534c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out.indent(); 535c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong // use autofilled values for vts. 536c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong std::string value = entry->value(scalarType->getKind()); 537c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong CHECK(!value.empty()); 538c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong out << mStorageType->resolveToScalarType()->getVtsScalarType() 539c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong << ": " 540c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong << value 541c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong << "\n"; 542c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out.unindent(); 543c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out << "}\n"; 544864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang } 5455158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang } 546864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 5475158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang out.unindent(); 5485158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang out << "}\n"; 5495158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang return OK; 5505158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang} 5515158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 552864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t EnumType::emitVtsAttributeType(Formatter &out) const { 553c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out << "type: " << getVtsType() << "\n"; 554bf828c8f6e1a1345e352976d5b6b91b2f5c52a2bZhuoyao Zhang out << "predefined_type: \"" << fullName() << "\"\n"; 5555158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang return OK; 5565158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang} 5575158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 558e45b5303e072043679483a70606f6c00dde17382Yifan Hongvoid EnumType::emitJavaDump( 559e45b5303e072043679483a70606f6c00dde17382Yifan Hong Formatter &out, 560e45b5303e072043679483a70606f6c00dde17382Yifan Hong const std::string &streamName, 561e45b5303e072043679483a70606f6c00dde17382Yifan Hong const std::string &name) const { 562e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << streamName << ".append(" << fqName().javaName() << ".toString(" 563e45b5303e072043679483a70606f6c00dde17382Yifan Hong << name << "));\n"; 564e45b5303e072043679483a70606f6c00dde17382Yifan Hong} 565e45b5303e072043679483a70606f6c00dde17382Yifan Hong 566f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakovstd::vector<const EnumType*> EnumType::typeChain() const { 567f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov std::vector<const EnumType*> types; 568f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov for (const EnumType* type = this; type != nullptr;) { 569f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov types.push_back(type); 570864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 571f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov const Type* superType = type->storageType(); 572f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov if (superType != nullptr && superType->isEnum()) { 573f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov type = static_cast<const EnumType*>(superType); 574f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov } else { 575f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov type = nullptr; 576864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang } 577f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov } 578f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov 579f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov return types; 580f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov} 581864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 582f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakovstd::vector<const EnumType*> EnumType::superTypeChain() const { 583f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov const Type* superType = storageType(); 584f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov if (superType == nullptr || !superType->isEnum()) { 585f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov return {}; 586864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang } 587f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov return static_cast<const EnumType*>(superType)->typeChain(); 588864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang} 589864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 59085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid EnumType::getAlignmentAndSize(size_t *align, size_t *size) const { 59185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber mStorageType->getAlignmentAndSize(align, size); 59285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 59385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 594019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huberconst Annotation *EnumType::findExportAnnotation() const { 595019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber for (const auto &annotation : annotations()) { 596019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber if (annotation->name() == "export") { 597019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber return annotation; 598019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 599019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 600019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 601019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber return nullptr; 602019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber} 603019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 604019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Hubervoid EnumType::appendToExportedTypesVector( 605019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber std::vector<const Type *> *exportedTypes) const { 606019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber if (findExportAnnotation() != nullptr) { 607019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber exportedTypes->push_back(this); 608019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 609019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber} 610019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 6111c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huberstatus_t EnumType::emitExportedHeader(Formatter &out, bool forJava) const { 612019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber const Annotation *annotation = findExportAnnotation(); 613019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber CHECK(annotation != nullptr); 614019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 615019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber std::string name = localName(); 616019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 617019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber const AnnotationParam *nameParam = annotation->getParam("name"); 618019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber if (nameParam != nullptr) { 619db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland name = nameParam->getSingleString(); 620db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland } 621019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 622db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland bool exportParent = true; 623db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland const AnnotationParam *exportParentParam = annotation->getParam("export_parent"); 624db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland if (exportParentParam != nullptr) { 625db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland exportParent = exportParentParam->getSingleBool(); 626019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 627019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 628b0627fb40221fcd6d838d3704d270eb2b825aed8Andreas Huber std::string valuePrefix; 629b0627fb40221fcd6d838d3704d270eb2b825aed8Andreas Huber const AnnotationParam *prefixParam = annotation->getParam("value_prefix"); 630b0627fb40221fcd6d838d3704d270eb2b825aed8Andreas Huber if (prefixParam != nullptr) { 631db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland valuePrefix = prefixParam->getSingleString(); 632b0627fb40221fcd6d838d3704d270eb2b825aed8Andreas Huber } 633b0627fb40221fcd6d838d3704d270eb2b825aed8Andreas Huber 63473cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland std::string valueSuffix; 63573cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland const AnnotationParam *suffixParam = annotation->getParam("value_suffix"); 63673cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland if (suffixParam != nullptr) { 637db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland valueSuffix = suffixParam->getSingleString(); 63873cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland } 63973cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland 640019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber const ScalarType *scalarType = mStorageType->resolveToScalarType(); 6411c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber CHECK(scalarType != nullptr); 642019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 643db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland std::vector<const EnumType *> chain; 644db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland if (exportParent) { 645f1b902d10bd2d71ad7f4769620678101821fd5d1Timur Iskhakov chain = typeChain(); 646db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland } else { 647db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland chain = { this }; 648db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland } 649db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland 6501c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber if (forJava) { 6511c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber if (!name.empty()) { 6521c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << "public final class " 6531c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << name 6541c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << " {\n"; 6551c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 6561c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out.indent(); 6571c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } else { 6581c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << "// Values declared in " << localName() << " follow.\n"; 6591c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } 6601c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 6611c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber const std::string typeName = 6624ed1347cd29e6e07acad368891bb03078c798abaYifan Hong scalarType->getJavaType(false /* forInitializer */); 6631c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 6641c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber for (auto it = chain.rbegin(); it != chain.rend(); ++it) { 6651c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber const auto &type = *it; 6661c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 6671c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber for (const auto &entry : type->values()) { 6681c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << "public static final " 6691c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << typeName 6701c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << " " 6711c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << valuePrefix 6721c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << entry->name() 67373cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland << valueSuffix 6741c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << " = "; 6751c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 6761c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber // javaValue will make the number signed. 6771c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber std::string value = entry->javaValue(scalarType->getKind()); 6781c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber CHECK(!value.empty()); // use autofilled values for java. 6791c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << value; 6801c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 6811c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << ";"; 6821c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 6831c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber std::string comment = entry->comment(); 684505e56125eba2ce327892646eed799419240e59dTimur Iskhakov if (!comment.empty()) { 6851c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << " // " << comment; 6861c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } 6871c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 6881c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << "\n"; 6891c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } 6901c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } 6911c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 6921c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber if (!name.empty()) { 6931c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out.unindent(); 6941c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << "};\n"; 6951c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } 6961c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << "\n"; 6971c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 6981c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber return OK; 6991c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } 700019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 701019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber if (!name.empty()) { 702019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << "typedef "; 703019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 704019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 705019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << "enum {\n"; 706019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 707019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out.indent(); 708019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 709019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber for (auto it = chain.rbegin(); it != chain.rend(); ++it) { 710019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber const auto &type = *it; 711019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 712019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber for (const auto &entry : type->values()) { 71373cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland out << valuePrefix << entry->name() << valueSuffix; 714019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 715019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber std::string value = entry->cppValue(scalarType->getKind()); 716019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber CHECK(!value.empty()); // use autofilled values for c++. 717019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << " = " << value; 718019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 719019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << ","; 720019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 721019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber std::string comment = entry->comment(); 722505e56125eba2ce327892646eed799419240e59dTimur Iskhakov if (!comment.empty()) { 723019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << " // " << comment; 724019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 725019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 726019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << "\n"; 727019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 728019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 729019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 730019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out.unindent(); 731019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << "}"; 732019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 733019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber if (!name.empty()) { 734019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << " " << name; 735019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 736019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 737019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << ";\n\n"; 738019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 739019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber return OK; 740019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber} 741019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 74231629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber//////////////////////////////////////////////////////////////////////////////// 74331629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 744cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur IskhakovEnumValue::EnumValue(const char* name, ConstantExpression* value, const Location& location) 745cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov : mName(name), mValue(value), mLocation(location), mIsAutoFill(false) {} 74631629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 74731629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberstd::string EnumValue::name() const { 74831629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber return mName; 74931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber} 75031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 751c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hongstd::string EnumValue::value(ScalarType::Kind castKind) const { 752f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(mValue != nullptr); 753c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong return mValue->value(castKind); 7545788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong} 7555788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong 756fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hongstd::string EnumValue::cppValue(ScalarType::Kind castKind) const { 757f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(mValue != nullptr); 758f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return mValue->cppValue(castKind); 7595788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong} 760fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hongstd::string EnumValue::javaValue(ScalarType::Kind castKind) const { 761f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(mValue != nullptr); 762f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return mValue->javaValue(castKind); 76319ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong} 7645788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong 765fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hongstd::string EnumValue::comment() const { 766f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(mValue != nullptr); 767505e56125eba2ce327892646eed799419240e59dTimur Iskhakov if (mValue->descriptionIsTrivial()) return ""; 768f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return mValue->description(); 769f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong} 770f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 771f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan HongConstantExpression *EnumValue::constExpr() const { 772f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(mValue != nullptr); 773f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return mValue; 774f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong} 775f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 776cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakovvoid EnumValue::autofill(const EnumType* prevType, EnumValue* prevValue, const ScalarType* type) { 777cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov // Value is defined explicitly 7787296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov if (mValue != nullptr) return; 779cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 780cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov CHECK((prevType == nullptr) == (prevValue == nullptr)); 781cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 782f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong mIsAutoFill = true; 783cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov if (prevValue == nullptr) { 7847296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov mValue = ConstantExpression::Zero(type->getKind()).release(); 785f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } else { 786cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov std::string description = prevType->fullName() + "." + prevValue->name() + " implicitly"; 787cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov auto* prevReference = new ReferenceConstantExpression( 788cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov Reference<LocalIdentifier>(prevValue, mLocation), description); 789cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov mValue = prevReference->addOne(type->getKind()).release(); 790f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } 791f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong} 792f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 793f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hongbool EnumValue::isAutoFill() const { 794f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return mIsAutoFill; 795f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong} 796f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 797f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hongbool EnumValue::isEnumValue() const { 798f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return true; 79931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber} 80031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 801cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakovconst Location& EnumValue::location() const { 802cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov return mLocation; 803cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov} 804cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 805abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong//////////////////////////////////////////////////////////////////////////////// 806abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong 807abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool BitFieldType::isBitField() const { 808abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong return true; 809abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong} 810abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong 8113f1d26ed2a4843498c187126f95bed67838e08a4Timur Iskhakovstd::string BitFieldType::templatedTypeName() const { 8123f1d26ed2a4843498c187126f95bed67838e08a4Timur Iskhakov return "mask"; 813c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 814c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 81524e605b5194d969a1558d94896d69cc554881e46Timur Iskhakovbool BitFieldType::isCompatibleElementType(const Type* elementType) const { 816c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return elementType->isEnum(); 817c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 818c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 819c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongconst ScalarType *BitFieldType::resolveToScalarType() const { 820c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return mElementType->resolveToScalarType(); 821c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 822c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 823c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstd::string BitFieldType::getCppType(StorageMode mode, 824c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong bool specifyNamespaces) const { 825c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return resolveToScalarType()->getCppType(mode, specifyNamespaces); 826c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 827c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 828c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstd::string BitFieldType::getJavaType(bool forInitializer) const { 829c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return resolveToScalarType()->getJavaType(forInitializer); 830c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 831c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 832c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstd::string BitFieldType::getJavaSuffix() const { 833c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return resolveToScalarType()->getJavaSuffix(); 834c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 835c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 836c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstd::string BitFieldType::getJavaWrapperType() const { 837c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return resolveToScalarType()->getJavaWrapperType(); 838c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 839c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 840c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstd::string BitFieldType::getVtsType() const { 841c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return "TYPE_MASK"; 842c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 843c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 8448c56cbe4b107934da1bea14475b5cc41280a4f01Yifan Hongbool BitFieldType::isElidableType() const { 8458c56cbe4b107934da1bea14475b5cc41280a4f01Yifan Hong return resolveToScalarType()->isElidableType(); 8468c56cbe4b107934da1bea14475b5cc41280a4f01Yifan Hong} 8478c56cbe4b107934da1bea14475b5cc41280a4f01Yifan Hong 8487d1839fe75d3ddc13321ee176ba73b610d884beeYifan Hongbool BitFieldType::canCheckEquality() const { 8497d1839fe75d3ddc13321ee176ba73b610d884beeYifan Hong return resolveToScalarType()->canCheckEquality(); 8507d1839fe75d3ddc13321ee176ba73b610d884beeYifan Hong} 8517d1839fe75d3ddc13321ee176ba73b610d884beeYifan Hong 852c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstatus_t BitFieldType::emitVtsAttributeType(Formatter &out) const { 853c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "type: " << getVtsType() << "\n"; 854132362395dbc1ec52a70a5a4587ce1dd7616a8daZhuoyao Zhang out << "scalar_type: \"" 855132362395dbc1ec52a70a5a4587ce1dd7616a8daZhuoyao Zhang << mElementType->resolveToScalarType()->getVtsScalarType() 856132362395dbc1ec52a70a5a4587ce1dd7616a8daZhuoyao Zhang << "\"\n"; 85724e605b5194d969a1558d94896d69cc554881e46Timur Iskhakov out << "predefined_type: \"" << static_cast<const NamedType*>(mElementType.get())->fullName() 858505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov << "\"\n"; 859c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return OK; 860c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 861c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 862c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongvoid BitFieldType::getAlignmentAndSize(size_t *align, size_t *size) const { 863c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong resolveToScalarType()->getAlignmentAndSize(align, size); 864c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 865c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 866c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongvoid BitFieldType::emitReaderWriter( 867c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong Formatter &out, 868c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &name, 869c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &parcelObj, 870c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong bool parcelObjIsPointer, 871c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong bool isReader, 872c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong ErrorMode mode) const { 873c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong resolveToScalarType()->emitReaderWriterWithCast( 874c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out, 875c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong name, 876c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong parcelObj, 877c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong parcelObjIsPointer, 878c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong isReader, 879c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong mode, 880c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong true /* needsCast */); 881c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 882c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 88324e605b5194d969a1558d94896d69cc554881e46Timur Iskhakovconst EnumType* BitFieldType::getEnumType() const { 884e45b5303e072043679483a70606f6c00dde17382Yifan Hong CHECK(mElementType->isEnum()); 88524e605b5194d969a1558d94896d69cc554881e46Timur Iskhakov return static_cast<const EnumType*>(mElementType.get()); 886e45b5303e072043679483a70606f6c00dde17382Yifan Hong} 887e45b5303e072043679483a70606f6c00dde17382Yifan Hong 888f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong// a bitfield maps to the underlying scalar type in C++, so operator<< is 889f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong// already defined. We can still emit useful information if the bitfield is 890f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong// in a struct / union by overriding emitDump as below. 891f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hongvoid BitFieldType::emitDump( 892f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong Formatter &out, 893f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong const std::string &streamName, 894f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong const std::string &name) const { 895e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << streamName << " += "<< getEnumType()->fqName().cppNamespace() 896e45b5303e072043679483a70606f6c00dde17382Yifan Hong << "::toString<" << getEnumType()->getCppStackType() 897f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong << ">(" << name << ");\n"; 898f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong} 899f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong 900e45b5303e072043679483a70606f6c00dde17382Yifan Hongvoid BitFieldType::emitJavaDump( 901e45b5303e072043679483a70606f6c00dde17382Yifan Hong Formatter &out, 902e45b5303e072043679483a70606f6c00dde17382Yifan Hong const std::string &streamName, 903e45b5303e072043679483a70606f6c00dde17382Yifan Hong const std::string &name) const { 904e45b5303e072043679483a70606f6c00dde17382Yifan Hong out << streamName << ".append(" << getEnumType()->fqName().javaName() << ".dumpBitfield(" 905e45b5303e072043679483a70606f6c00dde17382Yifan Hong << name << "));\n"; 906e45b5303e072043679483a70606f6c00dde17382Yifan Hong} 907e45b5303e072043679483a70606f6c00dde17382Yifan Hong 908c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongvoid BitFieldType::emitJavaFieldReaderWriter( 909c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong Formatter &out, 910c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong size_t depth, 911c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &parcelName, 912c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &blobName, 913c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &fieldName, 914c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &offset, 915c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong bool isReader) const { 916c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return resolveToScalarType()->emitJavaFieldReaderWriter( 917c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out, depth, parcelName, blobName, fieldName, offset, isReader); 918c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 919c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 920c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} // namespace android 921c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 922