EnumType.cpp revision db1b1b638865a2043c9cddd8c865751e9742b181
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 19019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber#include "Annotation.h" 20881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include "ScalarType.h" 21c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 22a72e0d2be173cebf62f728b9d215808bd862f219Iliyan Malchev#include <inttypes.h> 23a72e0d2be173cebf62f728b9d215808bd862f219Iliyan Malchev#include <hidl-util/Formatter.h> 24737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber#include <android-base/logging.h> 25737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android { 27c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 28c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberEnumType::EnumType( 299ed827c8cd6e8eddb1ad9987ab9413c1de8a27dfAndreas Huber const char *localName, 30a4b53d0da8c1c6889c361fd30b913adc364163bcYifan Hong const Location &location, 319ed827c8cd6e8eddb1ad9987ab9413c1de8a27dfAndreas Huber Type *storageType) 32a4b53d0da8c1c6889c361fd30b913adc364163bcYifan Hong : Scope(localName, location), 33f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong mValues(), 341c71fd5ab3381d1c59671adf2b8ca5c9a3f74401Steven Moreland mStorageType(storageType) { 35c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} 36c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 378d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberconst Type *EnumType::storageType() const { 388d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber return mStorageType; 398d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber} 408d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 418d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberconst std::vector<EnumValue *> &EnumType::values() const { 42f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return mValues; 43f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong} 44f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 45f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hongvoid EnumType::addValue(EnumValue *value) { 46f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(value != nullptr); 47f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 48f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong EnumValue *prev = nullptr; 49f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong std::vector<const EnumType *> chain; 50f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong getTypeChain(&chain); 51f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong for (auto it = chain.begin(); it != chain.end(); ++it) { 52f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong const auto &type = *it; 53f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong if(!type->values().empty()) { 54f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong prev = type->values().back(); 55f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong break; 56f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } 57f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } 58f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 59f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong value->autofill(prev, resolveToScalarType()); 60f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong mValues.push_back(value); 618d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber} 628d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 639df5244c1dd4508cc2e25f8a04d363903912d19cSteven Morelandbool EnumType::isElidableType() const { 649df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland return mStorageType->isElidableType(); 659df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland} 669df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland 67737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberconst ScalarType *EnumType::resolveToScalarType() const { 68737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber return mStorageType->resolveToScalarType(); 69737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber} 70737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 7130bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Morelandstd::string EnumType::typeName() const { 7230bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland return "enum " + localName(); 7330bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland} 7430bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland 758d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool EnumType::isEnum() const { 768d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber return true; 778d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber} 788d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 79c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hongbool EnumType::canCheckEquality() const { 80c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong return true; 81c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong} 82c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong 83979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string EnumType::getCppType(StorageMode, 84979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland bool specifyNamespaces) const { 85979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland return specifyNamespaces ? fullName() : partialCppName(); 86881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 87881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 884ed1347cd29e6e07acad368891bb03078c798abaYifan Hongstd::string EnumType::getJavaType(bool forInitializer) const { 894ed1347cd29e6e07acad368891bb03078c798abaYifan Hong return mStorageType->resolveToScalarType()->getJavaType(forInitializer); 902831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 912831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 922831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string EnumType::getJavaSuffix() const { 932831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return mStorageType->resolveToScalarType()->getJavaSuffix(); 942831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 952831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 96a3558b3b273695b31fbe1025339956966cde39c4Andreas Huberstd::string EnumType::getJavaWrapperType() const { 97a3558b3b273695b31fbe1025339956966cde39c4Andreas Huber return mStorageType->resolveToScalarType()->getJavaWrapperType(); 98a3558b3b273695b31fbe1025339956966cde39c4Andreas Huber} 99a3558b3b273695b31fbe1025339956966cde39c4Andreas Huber 100c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhangstd::string EnumType::getVtsType() const { 101c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang return "TYPE_ENUM"; 102c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang} 103c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang 104f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan HongLocalIdentifier *EnumType::lookupIdentifier(const std::string &name) const { 105f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong std::vector<const EnumType *> chain; 106f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong getTypeChain(&chain); 107f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong for (auto it = chain.begin(); it != chain.end(); ++it) { 108f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong const auto &type = *it; 109f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong for(EnumValue *v : type->values()) { 110f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong if(v->name() == name) { 111f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return v; 112f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } 113f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } 114f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } 115f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return nullptr; 116f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong} 117f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 118881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid EnumType::emitReaderWriter( 119881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 120881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 121881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 122881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 123881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 124881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode) const { 125737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber const ScalarType *scalarType = mStorageType->resolveToScalarType(); 126737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber CHECK(scalarType != NULL); 127737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 128737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber scalarType->emitReaderWriterWithCast( 129737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber out, 130737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber name, 131737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber parcelObj, 132737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber parcelObjIsPointer, 133737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber isReader, 134737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber mode, 135737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber true /* needsCast */); 136881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 137881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 13885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid EnumType::emitJavaFieldReaderWriter( 13985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 1404c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber size_t depth, 141709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber const std::string &parcelName, 14285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &blobName, 14385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName, 14485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &offset, 14585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const { 14685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber return mStorageType->emitJavaFieldReaderWriter( 147709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber out, depth, parcelName, blobName, fieldName, offset, isReader); 14885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 14985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 150881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t EnumType::emitTypeDeclarations(Formatter &out) const { 151737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber const ScalarType *scalarType = mStorageType->resolveToScalarType(); 152e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber CHECK(scalarType != nullptr); 153737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 1543b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong const std::string storageType = scalarType->getCppStackType(); 155881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 156881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "enum class " 1570e00de41d11a83ce3becb0dbd20b799acceb19a7Andreas Huber << localName() 158881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << " : " 159e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber << storageType 160881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << " {\n"; 161881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 162881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out.indent(); 163881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1648d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber std::vector<const EnumType *> chain; 165864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang getTypeChain(&chain); 1668d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 1678d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber for (auto it = chain.rbegin(); it != chain.rend(); ++it) { 1688d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber const auto &type = *it; 1698d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 1708d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber for (const auto &entry : type->values()) { 1718d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber out << entry->name(); 1728d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 173fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hong std::string value = entry->cppValue(scalarType->getKind()); 174f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(!value.empty()); // use autofilled values for c++. 175f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong out << " = " << value; 1768d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 1775788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong out << ","; 1785788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong 179fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hong std::string comment = entry->comment(); 180fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hong if (!comment.empty() && comment != value) { 1815788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong out << " // " << comment; 1825788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong } 1835788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong 1845788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong out << "\n"; 1858d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber } 186881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 187881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 188881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out.unindent(); 189881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "};\n\n"; 190881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 191881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return OK; 192881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 193881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1942820f8a2b8f1d525e7ea5eaed50ba600c0186ccfJayant Chowdharyvoid EnumType::emitEnumBitwiseOperator( 1952820f8a2b8f1d525e7ea5eaed50ba600c0186ccfJayant Chowdhary Formatter &out, 196c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong bool lhsIsEnum, 197c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong bool rhsIsEnum, 1982820f8a2b8f1d525e7ea5eaed50ba600c0186ccfJayant Chowdhary const std::string &op) const { 199e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber const ScalarType *scalarType = mStorageType->resolveToScalarType(); 200e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber CHECK(scalarType != nullptr); 201e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 2023b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong const std::string storageType = scalarType->getCppStackType(); 203e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 204c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "constexpr " 205c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << storageType 2062820f8a2b8f1d525e7ea5eaed50ba600c0186ccfJayant Chowdhary << " operator" 2072820f8a2b8f1d525e7ea5eaed50ba600c0186ccfJayant Chowdhary << op 208c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << "(const " 209c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << (lhsIsEnum ? fullName() : storageType) 210c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << " lhs, const " 211c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << (rhsIsEnum ? fullName() : storageType) 212c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << " rhs) {\n"; 213e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 21433223ca2a9b8126d357e0986905fa35c0970a30eYifan Hong out.indent([&] { 215c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "return static_cast<" 216c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << storageType 217c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << ">("; 218e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 219c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong if (lhsIsEnum) { 220c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "static_cast<" 221c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << storageType 222c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << ">(lhs)"; 223c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong } else { 224c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "lhs"; 225c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong } 226c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << " " << op << " "; 227c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong if (rhsIsEnum) { 228c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "static_cast<" 229c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << storageType 230c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << ">(rhs)"; 231c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong } else { 232c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "rhs"; 233c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong } 234c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << ");\n"; 235c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong }); 236e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 237c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "}\n\n"; 238c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 239e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 240c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongvoid EnumType::emitBitFieldBitwiseAssignmentOperator( 241c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong Formatter &out, 242c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &op) const { 243c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const ScalarType *scalarType = mStorageType->resolveToScalarType(); 244c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong CHECK(scalarType != nullptr); 245e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 246c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string storageType = scalarType->getCppStackType(); 247c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 248c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "constexpr " << storageType << " &operator" << op << "=(" 249c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong << storageType << "& v, const " << fullName() << " e) {\n"; 250c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 25133223ca2a9b8126d357e0986905fa35c0970a30eYifan Hong out.indent([&] { 252c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "v " << op << "= static_cast<" << storageType << ">(e);\n"; 253c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "return v;\n"; 254c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong }); 255e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 256e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber out << "}\n\n"; 257e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber} 258e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 259e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huberstatus_t EnumType::emitGlobalTypeDeclarations(Formatter &out) const { 260c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitEnumBitwiseOperator(out, true /* lhsIsEnum */, true /* rhsIsEnum */, "|"); 261c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitEnumBitwiseOperator(out, false /* lhsIsEnum */, true /* rhsIsEnum */, "|"); 262c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitEnumBitwiseOperator(out, true /* lhsIsEnum */, false /* rhsIsEnum */, "|"); 263c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitEnumBitwiseOperator(out, true /* lhsIsEnum */, true /* rhsIsEnum */, "&"); 264c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitEnumBitwiseOperator(out, false /* lhsIsEnum */, true /* rhsIsEnum */, "&"); 265c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitEnumBitwiseOperator(out, true /* lhsIsEnum */, false /* rhsIsEnum */, "&"); 266c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 267c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitBitFieldBitwiseAssignmentOperator(out, "|"); 268c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong emitBitFieldBitwiseAssignmentOperator(out, "&"); 269e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 270e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber return OK; 271e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber} 272e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 27385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstatus_t EnumType::emitJavaTypeDeclarations(Formatter &out, bool) const { 2742831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const ScalarType *scalarType = mStorageType->resolveToScalarType(); 2752831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber CHECK(scalarType != NULL); 2762831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 2772831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << "public final class " 2782831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << localName() 2792831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << " {\n"; 2802831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 2812831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out.indent(); 2822831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 2834c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber const std::string typeName = 2844ed1347cd29e6e07acad368891bb03078c798abaYifan Hong scalarType->getJavaType(false /* forInitializer */); 2852831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 2862831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber std::vector<const EnumType *> chain; 287864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang getTypeChain(&chain); 2882831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 2892831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber for (auto it = chain.rbegin(); it != chain.rend(); ++it) { 2902831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const auto &type = *it; 2912831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 2922831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber for (const auto &entry : type->values()) { 2932831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << "public static final " 2942831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << typeName 2952831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << " " 296ab647c09e65af4f6236f48b999244cccb11f6b57Andreas Huber << entry->name() 297ab647c09e65af4f6236f48b999244cccb11f6b57Andreas Huber << " = "; 2982831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 299f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong // javaValue will make the number signed. 300fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hong std::string value = entry->javaValue(scalarType->getKind()); 301f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(!value.empty()); // use autofilled values for java. 302f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong out << value; 3032831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 30419ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong out << ";"; 30519ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong 306fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hong std::string comment = entry->comment(); 307fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hong if (!comment.empty() && comment != value) { 30819ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong out << " // " << comment; 30919ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong } 31019ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong 31119ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong out << "\n"; 3122831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } 3132831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } 3142831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 3152831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out.unindent(); 3162831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << "};\n\n"; 3172831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 3182831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return OK; 3192831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 3202831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 3215158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t EnumType::emitVtsTypeDeclarations(Formatter &out) const { 322c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong const ScalarType *scalarType = mStorageType->resolveToScalarType(); 323c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong 324bf828c8f6e1a1345e352976d5b6b91b2f5c52a2bZhuoyao Zhang out << "name: \"" << fullName() << "\"\n"; 325c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out << "type: " << getVtsType() << "\n"; 326c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out << "enum_value: {\n"; 3275158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang out.indent(); 328864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 329c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out << "scalar_type: \"" 330c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong << scalarType->getVtsScalarType() 331c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang << "\"\n\n"; 332864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang std::vector<const EnumType *> chain; 333864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang getTypeChain(&chain); 334864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 335864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang for (auto it = chain.rbegin(); it != chain.rend(); ++it) { 336864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang const auto &type = *it; 337864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 338864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang for (const auto &entry : type->values()) { 339864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang out << "enumerator: \"" << entry->name() << "\"\n"; 340c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out << "scalar_value: {\n"; 341c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out.indent(); 342c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong // use autofilled values for vts. 343c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong std::string value = entry->value(scalarType->getKind()); 344c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong CHECK(!value.empty()); 345c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong out << mStorageType->resolveToScalarType()->getVtsScalarType() 346c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong << ": " 347c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong << value 348c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong << "\n"; 349c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out.unindent(); 350c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out << "}\n"; 351864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang } 3525158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang } 353864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 3545158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang out.unindent(); 3555158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang out << "}\n"; 3565158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang return OK; 3575158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang} 3585158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 359864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t EnumType::emitVtsAttributeType(Formatter &out) const { 360c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang out << "type: " << getVtsType() << "\n"; 361bf828c8f6e1a1345e352976d5b6b91b2f5c52a2bZhuoyao Zhang out << "predefined_type: \"" << fullName() << "\"\n"; 3625158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang return OK; 3635158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang} 3645158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 365864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangvoid EnumType::getTypeChain(std::vector<const EnumType *> *out) const { 366864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang out->clear(); 367864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang const EnumType *type = this; 368864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang for (;;) { 369864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang out->push_back(type); 370864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 371864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang const Type *superType = type->storageType(); 372864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang if (superType == NULL || !superType->isEnum()) { 373864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang break; 374864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang } 375864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 376864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang type = static_cast<const EnumType *>(superType); 377864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang } 378864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang} 379864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang 38085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid EnumType::getAlignmentAndSize(size_t *align, size_t *size) const { 38185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber mStorageType->getAlignmentAndSize(align, size); 38285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 38385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 384019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huberconst Annotation *EnumType::findExportAnnotation() const { 385019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber for (const auto &annotation : annotations()) { 386019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber if (annotation->name() == "export") { 387019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber return annotation; 388019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 389019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 390019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 391019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber return nullptr; 392019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber} 393019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 394019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Hubervoid EnumType::appendToExportedTypesVector( 395019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber std::vector<const Type *> *exportedTypes) const { 396019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber if (findExportAnnotation() != nullptr) { 397019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber exportedTypes->push_back(this); 398019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 399019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber} 400019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 4011c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huberstatus_t EnumType::emitExportedHeader(Formatter &out, bool forJava) const { 402019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber const Annotation *annotation = findExportAnnotation(); 403019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber CHECK(annotation != nullptr); 404019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 405019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber std::string name = localName(); 406019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 407019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber const AnnotationParam *nameParam = annotation->getParam("name"); 408019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber if (nameParam != nullptr) { 409db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland name = nameParam->getSingleString(); 410db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland } 411019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 412db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland bool exportParent = true; 413db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland const AnnotationParam *exportParentParam = annotation->getParam("export_parent"); 414db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland if (exportParentParam != nullptr) { 415db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland exportParent = exportParentParam->getSingleBool(); 416019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 417019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 418b0627fb40221fcd6d838d3704d270eb2b825aed8Andreas Huber std::string valuePrefix; 419b0627fb40221fcd6d838d3704d270eb2b825aed8Andreas Huber const AnnotationParam *prefixParam = annotation->getParam("value_prefix"); 420b0627fb40221fcd6d838d3704d270eb2b825aed8Andreas Huber if (prefixParam != nullptr) { 421db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland valuePrefix = prefixParam->getSingleString(); 422b0627fb40221fcd6d838d3704d270eb2b825aed8Andreas Huber } 423b0627fb40221fcd6d838d3704d270eb2b825aed8Andreas Huber 42473cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland std::string valueSuffix; 42573cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland const AnnotationParam *suffixParam = annotation->getParam("value_suffix"); 42673cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland if (suffixParam != nullptr) { 427db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland valueSuffix = suffixParam->getSingleString(); 42873cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland } 42973cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland 430019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber const ScalarType *scalarType = mStorageType->resolveToScalarType(); 4311c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber CHECK(scalarType != nullptr); 432019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 433db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland std::vector<const EnumType *> chain; 434db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland if (exportParent) { 435db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland getTypeChain(&chain); 436db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland } else { 437db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland chain = { this }; 438db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland } 439db1b1b638865a2043c9cddd8c865751e9742b181Steven Moreland 4401c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber if (forJava) { 4411c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber if (!name.empty()) { 4421c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << "public final class " 4431c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << name 4441c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << " {\n"; 4451c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 4461c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out.indent(); 4471c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } else { 4481c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << "// Values declared in " << localName() << " follow.\n"; 4491c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } 4501c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 4511c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber const std::string typeName = 4524ed1347cd29e6e07acad368891bb03078c798abaYifan Hong scalarType->getJavaType(false /* forInitializer */); 4531c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 4541c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber for (auto it = chain.rbegin(); it != chain.rend(); ++it) { 4551c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber const auto &type = *it; 4561c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 4571c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber for (const auto &entry : type->values()) { 4581c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << "public static final " 4591c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << typeName 4601c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << " " 4611c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << valuePrefix 4621c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << entry->name() 46373cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland << valueSuffix 4641c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber << " = "; 4651c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 4661c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber // javaValue will make the number signed. 4671c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber std::string value = entry->javaValue(scalarType->getKind()); 4681c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber CHECK(!value.empty()); // use autofilled values for java. 4691c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << value; 4701c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 4711c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << ";"; 4721c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 4731c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber std::string comment = entry->comment(); 4741c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber if (!comment.empty() && comment != value) { 4751c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << " // " << comment; 4761c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } 4771c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 4781c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << "\n"; 4791c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } 4801c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } 4811c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 4821c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber if (!name.empty()) { 4831c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out.unindent(); 4841c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << "};\n"; 4851c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } 4861c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber out << "\n"; 4871c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber 4881c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber return OK; 4891c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber } 490019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 491019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber if (!name.empty()) { 492019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << "typedef "; 493019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 494019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 495019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << "enum {\n"; 496019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 497019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out.indent(); 498019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 499019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber for (auto it = chain.rbegin(); it != chain.rend(); ++it) { 500019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber const auto &type = *it; 501019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 502019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber for (const auto &entry : type->values()) { 50373cdc887c6d3c20b66890c1363db64f70b0f77c8Steven Moreland out << valuePrefix << entry->name() << valueSuffix; 504019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 505019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber std::string value = entry->cppValue(scalarType->getKind()); 506019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber CHECK(!value.empty()); // use autofilled values for c++. 507019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << " = " << value; 508019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 509019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << ","; 510019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 511019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber std::string comment = entry->comment(); 512019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber if (!comment.empty() && comment != value) { 513019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << " // " << comment; 514019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 515019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 516019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << "\n"; 517019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 518019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 519019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 520019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out.unindent(); 521019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << "}"; 522019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 523019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber if (!name.empty()) { 524019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << " " << name; 525019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber } 526019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 527019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber out << ";\n\n"; 528019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 529019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber return OK; 530019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber} 531019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 53231629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber//////////////////////////////////////////////////////////////////////////////// 53331629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 534f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan HongEnumValue::EnumValue(const char *name, ConstantExpression *value) 53531629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber : mName(name), 536f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong mValue(value), 537f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong mIsAutoFill(false) { 53831629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber} 53931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 54031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberstd::string EnumValue::name() const { 54131629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber return mName; 54231629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber} 54331629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 544c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hongstd::string EnumValue::value(ScalarType::Kind castKind) const { 545f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(mValue != nullptr); 546c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong return mValue->value(castKind); 5475788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong} 5485788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong 549fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hongstd::string EnumValue::cppValue(ScalarType::Kind castKind) const { 550f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(mValue != nullptr); 551f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return mValue->cppValue(castKind); 5525788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong} 553fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hongstd::string EnumValue::javaValue(ScalarType::Kind castKind) const { 554f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(mValue != nullptr); 555f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return mValue->javaValue(castKind); 55619ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong} 5575788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong 558fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hongstd::string EnumValue::comment() const { 559f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(mValue != nullptr); 560f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return mValue->description(); 561f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong} 562f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 563f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan HongConstantExpression *EnumValue::constExpr() const { 564f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(mValue != nullptr); 565f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return mValue; 566f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong} 567f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 568f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hongvoid EnumValue::autofill(const EnumValue *prev, const ScalarType *type) { 569f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong if(mValue != nullptr) 570f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return; 571f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong mIsAutoFill = true; 572f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong ConstantExpression *value = new ConstantExpression(); 573f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong if(prev == nullptr) { 574f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong *value = ConstantExpression::Zero(type->getKind()); 575f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } else { 576f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong CHECK(prev->mValue != nullptr); 577f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong *value = prev->mValue->addOne(); 578f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong } 579f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong mValue = value; 580f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong} 581f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 582f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hongbool EnumValue::isAutoFill() const { 583f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return mIsAutoFill; 584f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong} 585f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 586f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hongbool EnumValue::isEnumValue() const { 587f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong return true; 58831629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber} 58931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 590abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong//////////////////////////////////////////////////////////////////////////////// 591abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong 592abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool BitFieldType::isBitField() const { 593abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong return true; 594abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong} 595abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong 596c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstd::string BitFieldType::typeName() const { 597c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return "mask" + (mElementType == nullptr ? "" : (" of " + mElementType->typeName())); 598c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 599c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 600c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongvoid BitFieldType::addNamedTypesToSet(std::set<const FQName> &) const { 601c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 602c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 603c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongbool BitFieldType::isCompatibleElementType(Type *elementType) const { 604c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return elementType->isEnum(); 605c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 606c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 607c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongconst ScalarType *BitFieldType::resolveToScalarType() const { 608c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return mElementType->resolveToScalarType(); 609c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 610c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 611c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstd::string BitFieldType::getCppType(StorageMode mode, 612c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong bool specifyNamespaces) const { 613c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return resolveToScalarType()->getCppType(mode, specifyNamespaces); 614c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 615c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 616c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstd::string BitFieldType::getJavaType(bool forInitializer) const { 617c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return resolveToScalarType()->getJavaType(forInitializer); 618c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 619c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 620c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstd::string BitFieldType::getJavaSuffix() const { 621c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return resolveToScalarType()->getJavaSuffix(); 622c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 623c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 624c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstd::string BitFieldType::getJavaWrapperType() const { 625c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return resolveToScalarType()->getJavaWrapperType(); 626c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 627c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 628c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstd::string BitFieldType::getVtsType() const { 629c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return "TYPE_MASK"; 630c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 631c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 6328c56cbe4b107934da1bea14475b5cc41280a4f01Yifan Hongbool BitFieldType::isElidableType() const { 6338c56cbe4b107934da1bea14475b5cc41280a4f01Yifan Hong return resolveToScalarType()->isElidableType(); 6348c56cbe4b107934da1bea14475b5cc41280a4f01Yifan Hong} 6358c56cbe4b107934da1bea14475b5cc41280a4f01Yifan Hong 636c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstatus_t BitFieldType::emitVtsTypeDeclarations(Formatter &out) const { 637c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "type: " << getVtsType() << "\n"; 638c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "enum_value: {\n"; 639c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out.indent(); 640c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong status_t err = mElementType->emitVtsTypeDeclarations(out); 641c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong if (err != OK) { 642c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return err; 643c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong } 644c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out.unindent(); 645c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "}\n"; 646c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return OK; 647c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 648c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 649c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongstatus_t BitFieldType::emitVtsAttributeType(Formatter &out) const { 650c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "type: " << getVtsType() << "\n"; 651c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "enum_value: {\n"; 652c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out.indent(); 653c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong status_t err = mElementType->emitVtsAttributeType(out); 654c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong if (err != OK) { 655c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return err; 656c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong } 657c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out.unindent(); 658c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out << "}\n"; 659c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return OK; 660c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 661c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 662c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongvoid BitFieldType::getAlignmentAndSize(size_t *align, size_t *size) const { 663c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong resolveToScalarType()->getAlignmentAndSize(align, size); 664c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 665c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 666c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongvoid BitFieldType::emitReaderWriter( 667c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong Formatter &out, 668c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &name, 669c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &parcelObj, 670c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong bool parcelObjIsPointer, 671c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong bool isReader, 672c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong ErrorMode mode) const { 673c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong resolveToScalarType()->emitReaderWriterWithCast( 674c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out, 675c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong name, 676c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong parcelObj, 677c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong parcelObjIsPointer, 678c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong isReader, 679c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong mode, 680c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong true /* needsCast */); 681c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 682c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 683c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hongvoid BitFieldType::emitJavaFieldReaderWriter( 684c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong Formatter &out, 685c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong size_t depth, 686c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &parcelName, 687c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &blobName, 688c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &fieldName, 689c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong const std::string &offset, 690c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong bool isReader) const { 691c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong return resolveToScalarType()->emitJavaFieldReaderWriter( 692c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong out, depth, parcelName, blobName, fieldName, offset, isReader); 693c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong} 694c57c8bb9f368faca636bdb6b39773e72255e8b08Yifan Hong 695c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} // namespace android 696c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 697