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