EnumType.cpp revision a72e0d2be173cebf62f728b9d215808bd862f219
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
19881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include "ScalarType.h"
20c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
21a72e0d2be173cebf62f728b9d215808bd862f219Iliyan Malchev#include <inttypes.h>
22a72e0d2be173cebf62f728b9d215808bd862f219Iliyan Malchev#include <hidl-util/Formatter.h>
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
55979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string EnumType::getCppType(StorageMode,
56979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                                 std::string *extra,
57979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                                 bool specifyNamespaces) const {
58881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    extra->clear();
59881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
60979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    return specifyNamespaces ? fullName() : partialCppName();
61881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
62881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
632831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string EnumType::getJavaType() const {
642831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return mStorageType->resolveToScalarType()->getJavaType();
652831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
662831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
672831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string EnumType::getJavaSuffix() const {
682831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return mStorageType->resolveToScalarType()->getJavaSuffix();
692831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
702831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
71881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid EnumType::emitReaderWriter(
72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &out,
73881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &name,
74881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parcelObj,
75881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool parcelObjIsPointer,
76881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool isReader,
77881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode mode) const {
78737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    const ScalarType *scalarType = mStorageType->resolveToScalarType();
79737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    CHECK(scalarType != NULL);
80737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
81737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    scalarType->emitReaderWriterWithCast(
82737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            out,
83737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            name,
84737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            parcelObj,
85737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            parcelObjIsPointer,
86737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            isReader,
87737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            mode,
88737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            true /* needsCast */);
89881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
90881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
9185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid EnumType::emitJavaFieldReaderWriter(
9285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &out,
9385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &blobName,
9485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &fieldName,
9585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &offset,
9685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        bool isReader) const {
9785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    return mStorageType->emitJavaFieldReaderWriter(
9885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            out, blobName, fieldName, offset, isReader);
9985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
10085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t EnumType::emitTypeDeclarations(Formatter &out) const {
102737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    const ScalarType *scalarType = mStorageType->resolveToScalarType();
103737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    CHECK(scalarType != NULL);
104737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    std::string extra;
106881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
107881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << "enum class "
1080e00de41d11a83ce3becb0dbd20b799acceb19a7Andreas Huber        << localName()
109881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << " : "
110737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        << ((Type *)scalarType)->getCppType(&extra)
111881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << " {\n";
112881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
113881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.indent();
114881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1158d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    std::vector<const EnumType *> chain;
116864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    getTypeChain(&chain);
1178d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1188d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
1198d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        const auto &type = *it;
1208d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1218d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        for (const auto &entry : type->values()) {
1228d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber            out << entry->name();
1238d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1245788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong            const char *value = entry->cppValue(scalarType->getKind());
1258d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber            if (value != NULL) {
1268d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber                out << " = " << value;
1278d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber            }
1288d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1295788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong            out << ",";
1305788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong
1315788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong            const char *comment = entry->comment();
1325788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong            if (comment != NULL && strcmp(comment, value) != 0) {
1335788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong                out << " // " << comment;
1345788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong            }
1355788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong
1365788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong            out << "\n";
1378d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        }
138881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
139881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
140881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
141881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << "};\n\n";
142881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
143881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
144881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
145881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1462831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber// Attempt to convert enum value literals into their signed equivalents,
1472831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber// i.e. if an enum value is stored in typeName 'byte', the value "192"
1482831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber// will be converted to the output "-64".
1492831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstatic bool MakeSignedIntegerValue(
1502831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &typeName, const char *value, std::string *output) {
1512831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    output->clear();
1522831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1532831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    char *end;
1542831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    long long x = strtoll(value, &end, 10);
1552831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1562831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    if (end > value && *end == '\0' && errno != ERANGE) {
1572831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        char out[32];
1582831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        if (typeName == "byte") {
1592831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            sprintf(out, "%d", (int)(int8_t)x);
1602831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        } else if (typeName == "short") {
1612831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            sprintf(out, "%d", (int)(int16_t)x);
1622831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        } else if (typeName == "int") {
1632831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            sprintf(out, "%d", (int)(int32_t)x);
1642831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        } else {
1652831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            assert(typeName == "long");
1661c8580863620f425188e86ec60b90cf269b5201cIliyan Malchev            sprintf(out, "%" PRId64 "L", (int64_t)x);
1672831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        }
1682831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1692831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        *output = out;
1702831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        return true;
1712831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    }
1722831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1732831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return false;
1742831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
1752831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
17685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstatus_t EnumType::emitJavaTypeDeclarations(Formatter &out, bool) const {
1772831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    const ScalarType *scalarType = mStorageType->resolveToScalarType();
1782831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    CHECK(scalarType != NULL);
1792831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1802831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << "public final class "
1812831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << localName()
1822831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << " {\n";
1832831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1842831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out.indent();
1852831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1862831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    const std::string typeName = scalarType->getJavaType();
1872831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1882831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    std::vector<const EnumType *> chain;
189864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    getTypeChain(&chain);
1902831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1912831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
1922831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const auto &type = *it;
1932831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
1942831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        for (const auto &entry : type->values()) {
1952831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            out << "public static final "
1962831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                << typeName
1972831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                << " "
1982831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                << entry->name();
1992831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
20019ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong            const char *value = entry->javaValue(scalarType->getKind());
2012831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            if (value != NULL) {
2022831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                out << " = ";
2032831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
2042831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                std::string convertedValue;
2052831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                if (MakeSignedIntegerValue(typeName, value, &convertedValue)) {
2062831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                    out << convertedValue;
2072831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                } else {
2082831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                    // The value is not an integer, but some other string,
2092831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                    // hopefully referring to some other enum name.
2102831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                    out << value;
2112831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber                }
2122831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            }
2132831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
21419ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong            out << ";";
21519ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong
21619ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong            const char *comment = entry->comment();
21719ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong            if (comment != NULL && strcmp(comment, value) != 0) {
21819ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong                out << " // " << comment;
21919ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong            }
22019ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong
22119ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong            out << "\n";
2222831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        }
2232831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    }
2242831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
2252831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out.unindent();
2262831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << "};\n\n";
2272831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
2282831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return OK;
2292831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
2302831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
2315158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t EnumType::emitVtsTypeDeclarations(Formatter &out) const {
232864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    out << "name: \"" << localName() << "\"\n"
2335158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        << "type: TYPE_ENUM\n"
2345158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        << "enum_value: {\n";
2355158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out.indent();
236864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
237864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    std::vector<const EnumType *> chain;
238864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    getTypeChain(&chain);
239864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
240864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
241864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        const auto &type = *it;
242864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
243864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        for (const auto &entry : type->values()) {
244864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out << "enumerator: \"" << entry->name() << "\"\n";
245864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
246864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            const char *value = entry->value();
247864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            if (value != NULL) {
248864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang                out << "value: " << value << "\n";
249864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            }
250864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        }
2515158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
252864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
2535158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out.unindent();
2545158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "}\n";
2555158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
2565158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
2575158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
258864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t EnumType::emitVtsAttributeType(Formatter &out) const {
259199335277986f45bef3aaf8787d57b4c3c6b6b9aZhuoyao Zhang    out << "type: TYPE_ENUM\n"
260199335277986f45bef3aaf8787d57b4c3c6b6b9aZhuoyao Zhang        << "predefined_type: \""
261199335277986f45bef3aaf8787d57b4c3c6b6b9aZhuoyao Zhang        << localName()
262199335277986f45bef3aaf8787d57b4c3c6b6b9aZhuoyao Zhang        << "\"\n";
2635158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
2645158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
2655158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
266864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangvoid EnumType::getTypeChain(std::vector<const EnumType *> *out) const {
267864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    out->clear();
268864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    const EnumType *type = this;
269864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    for (;;) {
270864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        out->push_back(type);
271864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
272864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        const Type *superType = type->storageType();
273864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        if (superType == NULL || !superType->isEnum()) {
274864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            break;
275864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        }
276864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
277864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        type = static_cast<const EnumType *>(superType);
278864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    }
279864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang}
280864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
28185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid EnumType::getAlignmentAndSize(size_t *align, size_t *size) const {
28285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    mStorageType->getAlignmentAndSize(align, size);
28385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
28485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
28531629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber////////////////////////////////////////////////////////////////////////////////
28631629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
2875788697381666844eeb23e04e5c6f83ec6ec8b44Yifan HongEnumValue::EnumValue(const char *name, const ConstantExpression *value)
28831629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    : mName(name),
28931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber      mValue(value) {
29031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber}
29131629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
29231629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberstd::string EnumValue::name() const {
29331629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    return mName;
29431629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber}
29531629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
29631629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberconst char *EnumValue::value() const {
2975788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong    return mValue ? mValue->value() : nullptr;
2985788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong}
2995788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong
3005788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hongconst char *EnumValue::cppValue(ScalarType::Kind castKind) const {
3015788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong    return mValue ? mValue->cppValue(castKind) : nullptr;
3025788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong}
30319ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hongconst char *EnumValue::javaValue(ScalarType::Kind castKind) const {
30419ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong    return mValue ? mValue->javaValue(castKind) : nullptr;
30519ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong}
3065788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong
3075788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hongconst char *EnumValue::comment() const {
3085788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong    return mValue ? mValue->description() : nullptr;
30931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber}
31031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
311c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
312c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
313