EnumType.h revision 1313a127416ed91a80ab4f282c6ecc042e54bc15
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ENUM_TYPE_H_
18
19#define ENUM_TYPE_H_
20
21#include "ConstantExpression.h"
22#include "Reference.h"
23#include "Scope.h"
24
25#include <vector>
26
27namespace android {
28
29struct EnumValue;
30struct BitFieldType;
31
32struct EnumType : public Scope {
33    EnumType(const char* localName, const Location& location, const Reference<Type>& storageType,
34             Scope* parent);
35
36    const Type *storageType() const;
37    const std::vector<EnumValue *> &values() const;
38    void addValue(EnumValue *value);
39
40    LocalIdentifier *lookupIdentifier(const std::string &name) const override;
41
42    bool isElidableType() const override;
43    const ScalarType *resolveToScalarType() const override;
44
45    std::string typeName() const override;
46    bool isEnum() const override;
47    bool canCheckEquality() const override;
48
49    std::string getCppType(StorageMode mode,
50                           bool specifyNamespaces) const override;
51
52    std::string getJavaType(bool forInitializer) const override;
53
54    std::string getJavaSuffix() const override;
55
56    std::string getJavaWrapperType() const override;
57
58    std::string getVtsType() const override;
59
60    // Return the type that corresponds to bitfield<T>.
61    BitFieldType *getBitfieldType() const;
62
63    void emitReaderWriter(
64            Formatter &out,
65            const std::string &name,
66            const std::string &parcelObj,
67            bool parcelObjIsPointer,
68            bool isReader,
69            ErrorMode mode) const override;
70
71    void emitJavaFieldReaderWriter(
72            Formatter &out,
73            size_t depth,
74            const std::string &parcelName,
75            const std::string &blobName,
76            const std::string &fieldName,
77            const std::string &offset,
78            bool isReader) const override;
79
80    status_t emitTypeDeclarations(Formatter &out) const override;
81    status_t emitGlobalTypeDeclarations(Formatter &out) const override;
82    status_t emitTypeDefinitions(Formatter &out, const std::string prefix) const override;
83
84    status_t emitJavaTypeDeclarations(
85            Formatter &out, bool atTopLevel) const override;
86
87    status_t emitVtsTypeDeclarations(Formatter &out) const override;
88    status_t emitVtsAttributeType(Formatter &out) const override;
89
90    void emitJavaDump(
91            Formatter &out,
92            const std::string &streamName,
93            const std::string &name) const override;
94
95    void getAlignmentAndSize(size_t *align, size_t *size) const override;
96
97    void appendToExportedTypesVector(
98            std::vector<const Type *> *exportedTypes) const override;
99
100    status_t emitExportedHeader(Formatter &out, bool forJava) const override;
101
102private:
103    void getTypeChain(std::vector<const EnumType *> *out) const;
104    const Annotation *findExportAnnotation() const;
105
106    void emitEnumBitwiseOperator(
107            Formatter &out,
108            bool lhsIsEnum,
109            bool rhsIsEnum,
110            const std::string &op) const;
111
112    void emitBitFieldBitwiseAssignmentOperator(
113            Formatter &out,
114            const std::string &op) const;
115
116    std::vector<EnumValue *> mValues;
117    Reference<Type> mStorageType;
118    // TODO(b/64272670): Dot not store BitFieldType as it is not owned.
119    // It is kept here to avoid const-cast (BitFieldType owns non-const EnumType).
120    Reference<BitFieldType> mBitfieldType;
121
122    DISALLOW_COPY_AND_ASSIGN(EnumType);
123};
124
125struct EnumValue : public LocalIdentifier {
126    EnumValue(const char *name, ConstantExpression *value = nullptr);
127
128    std::string name() const;
129    std::string value(ScalarType::Kind castKind) const;
130    std::string cppValue(ScalarType::Kind castKind) const;
131    std::string javaValue(ScalarType::Kind castKind) const;
132    std::string comment() const;
133    void autofill(const EnumValue *prev, const ScalarType *type);
134    ConstantExpression* constExpr() const override;
135
136    bool isAutoFill() const;
137    bool isEnumValue() const override;
138
139
140    std::string mName;
141    ConstantExpression* mValue;
142    bool mIsAutoFill;
143
144    DISALLOW_COPY_AND_ASSIGN(EnumValue);
145};
146
147struct BitFieldType : public TemplatedType {
148
149    std::string typeName() const override;
150
151    bool isBitField() const override;
152
153    bool isCompatibleElementType(Type *elementType) const override;
154
155    bool isElidableType() const override;
156
157    bool canCheckEquality() const override;
158
159    const ScalarType *resolveToScalarType() const override;
160
161    std::string getCppType(StorageMode mode,
162                           bool specifyNamespaces) const override;
163
164    std::string getJavaType(bool forInitializer) const override;
165
166    std::string getJavaSuffix() const override;
167
168    std::string getJavaWrapperType() const override;
169
170    std::string getVtsType() const override;
171
172    EnumType *getEnumType() const;
173
174    status_t emitVtsAttributeType(Formatter &out) const override;
175
176    void getAlignmentAndSize(size_t *align, size_t *size) const override;
177
178    void emitReaderWriter(
179        Formatter &out,
180        const std::string &name,
181        const std::string &parcelObj,
182        bool parcelObjIsPointer,
183        bool isReader,
184        ErrorMode mode) const override;
185
186    void emitDump(
187            Formatter &out,
188            const std::string &streamName,
189            const std::string &name) const override;
190
191    void emitJavaDump(
192            Formatter &out,
193            const std::string &streamName,
194            const std::string &name) const override;
195
196    void emitJavaFieldReaderWriter(
197        Formatter &out,
198        size_t depth,
199        const std::string &parcelName,
200        const std::string &blobName,
201        const std::string &fieldName,
202        const std::string &offset,
203        bool isReader) const override;
204};
205
206}  // namespace android
207
208#endif  // ENUM_TYPE_H_
209
210