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