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 "Scope.h" 23 24 #include <vector> 25 26 namespace android { 27 28 struct EnumValue; 29 struct BitFieldType; 30 31 struct EnumType : public Scope { 32 EnumType(const char* localName, const Location& location, Type* storageType, Scope* parent); 33 34 const Type *storageType() const; 35 const std::vector<EnumValue *> &values() const; 36 void addValue(EnumValue *value); 37 38 LocalIdentifier *lookupIdentifier(const std::string &name) const override; 39 40 bool isElidableType() const override; 41 const ScalarType *resolveToScalarType() const override; 42 43 std::string typeName() const override; 44 bool isEnum() const override; 45 bool canCheckEquality() const override; 46 47 std::string getCppType(StorageMode mode, 48 bool specifyNamespaces) const override; 49 50 std::string getJavaType(bool forInitializer) const override; 51 52 std::string getJavaSuffix() const override; 53 54 std::string getJavaWrapperType() const override; 55 56 std::string getVtsType() const override; 57 58 // Return the type that corresponds to bitfield<T>. 59 BitFieldType *getBitfieldType() const; 60 61 void emitReaderWriter( 62 Formatter &out, 63 const std::string &name, 64 const std::string &parcelObj, 65 bool parcelObjIsPointer, 66 bool isReader, 67 ErrorMode mode) const override; 68 69 void emitJavaFieldReaderWriter( 70 Formatter &out, 71 size_t depth, 72 const std::string &parcelName, 73 const std::string &blobName, 74 const std::string &fieldName, 75 const std::string &offset, 76 bool isReader) const override; 77 78 status_t emitTypeDeclarations(Formatter &out) const override; 79 status_t emitGlobalTypeDeclarations(Formatter &out) const override; 80 status_t emitTypeDefinitions(Formatter &out, const std::string prefix) const override; 81 82 status_t emitJavaTypeDeclarations( 83 Formatter &out, bool atTopLevel) const override; 84 85 status_t emitVtsTypeDeclarations(Formatter &out) const override; 86 status_t emitVtsAttributeType(Formatter &out) const override; 87 88 void emitJavaDump( 89 Formatter &out, 90 const std::string &streamName, 91 const std::string &name) const override; 92 93 void getAlignmentAndSize(size_t *align, size_t *size) const override; 94 95 void appendToExportedTypesVector( 96 std::vector<const Type *> *exportedTypes) const override; 97 98 status_t emitExportedHeader(Formatter &out, bool forJava) const override; 99 100 private: 101 void getTypeChain(std::vector<const EnumType *> *out) const; 102 const Annotation *findExportAnnotation() const; 103 104 void emitEnumBitwiseOperator( 105 Formatter &out, 106 bool lhsIsEnum, 107 bool rhsIsEnum, 108 const std::string &op) const; 109 110 void emitBitFieldBitwiseAssignmentOperator( 111 Formatter &out, 112 const std::string &op) const; 113 114 std::vector<EnumValue *> mValues; 115 Type *mStorageType; 116 BitFieldType *mBitfieldType; 117 118 DISALLOW_COPY_AND_ASSIGN(EnumType); 119 }; 120 121 struct EnumValue : public LocalIdentifier { 122 EnumValue(const char *name, ConstantExpression *value = nullptr); 123 124 std::string name() const; 125 std::string value(ScalarType::Kind castKind) const; 126 std::string cppValue(ScalarType::Kind castKind) const; 127 std::string javaValue(ScalarType::Kind castKind) const; 128 std::string comment() const; 129 void autofill(const EnumValue *prev, const ScalarType *type); 130 ConstantExpression *constExpr() const; 131 132 bool isAutoFill() const; 133 bool isEnumValue() const override; 134 135 136 std::string mName; 137 ConstantExpression *mValue; 138 bool mIsAutoFill; 139 140 DISALLOW_COPY_AND_ASSIGN(EnumValue); 141 }; 142 143 struct BitFieldType : public TemplatedType { 144 145 std::string typeName() const override; 146 147 bool isBitField() const override; 148 149 bool isCompatibleElementType(Type *elementType) const override; 150 151 bool isElidableType() const override; 152 153 bool canCheckEquality() const override; 154 155 const ScalarType *resolveToScalarType() const override; 156 157 std::string getCppType(StorageMode mode, 158 bool specifyNamespaces) const override; 159 160 std::string getJavaType(bool forInitializer) const override; 161 162 std::string getJavaSuffix() const override; 163 164 std::string getJavaWrapperType() const override; 165 166 std::string getVtsType() const override; 167 168 EnumType *getEnumType() const; 169 170 status_t emitVtsAttributeType(Formatter &out) const override; 171 172 void getAlignmentAndSize(size_t *align, size_t *size) const override; 173 174 void emitReaderWriter( 175 Formatter &out, 176 const std::string &name, 177 const std::string &parcelObj, 178 bool parcelObjIsPointer, 179 bool isReader, 180 ErrorMode mode) const override; 181 182 void emitDump( 183 Formatter &out, 184 const std::string &streamName, 185 const std::string &name) const override; 186 187 void emitJavaDump( 188 Formatter &out, 189 const std::string &streamName, 190 const std::string &name) const override; 191 192 void emitJavaFieldReaderWriter( 193 Formatter &out, 194 size_t depth, 195 const std::string &parcelName, 196 const std::string &blobName, 197 const std::string &fieldName, 198 const std::string &offset, 199 bool isReader) const override; 200 }; 201 202 } // namespace android 203 204 #endif // ENUM_TYPE_H_ 205 206