Type.h revision 99e6bebc96d75d1c9b9b8130cd9b880dacb95b01
176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti/* 276f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Copyright (C) 2016 The Android Open Source Project 376f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 476f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Licensed under the Apache License, Version 2.0 (the "License"); 576f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * you may not use this file except in compliance with the License. 676f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * You may obtain a copy of the License at 776f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 876f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * http://www.apache.org/licenses/LICENSE-2.0 976f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 1076f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Unless required by applicable law or agreed to in writing, software 1176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * distributed under the License is distributed on an "AS IS" BASIS, 1276f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1376f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * See the License for the specific language governing permissions and 1476f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * limitations under the License. 1576f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti */ 1676f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti 1776f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti#ifndef TYPE_H_ 1876f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti 1976f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti#define TYPE_H_ 2076f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti 2176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti#include <android-base/macros.h> 22e426a53a86990314bafe7b3e33dd41632eec1757Danny van Bruggen#include <string> 236812b09145d85180c90e38a74bdf7d3d414ef1e9Maximilien CRUZ#include <utils/Errors.h> 249b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZ#include <vector> 259b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZ#include <set> 269b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZ 279b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZnamespace android { 289b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZ 299b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZstruct Annotation; 309b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZstruct Formatter; 319b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZstruct ScalarType; 329b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZstruct FQName; 339b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZ 349b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZstruct Type { 359b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZ Type(); 366812b09145d85180c90e38a74bdf7d3d414ef1e9Maximilien CRUZ virtual ~Type(); 37923683757d3168969745ee2c85e146d6c89007a7Maximilien Cruz 38923683757d3168969745ee2c85e146d6c89007a7Maximilien Cruz virtual bool isArray() const; 39923683757d3168969745ee2c85e146d6c89007a7Maximilien Cruz virtual bool isBinder() const; 40923683757d3168969745ee2c85e146d6c89007a7Maximilien Cruz virtual bool isCompoundType() const; 416812b09145d85180c90e38a74bdf7d3d414ef1e9Maximilien CRUZ virtual bool isEnum() const; 426812b09145d85180c90e38a74bdf7d3d414ef1e9Maximilien CRUZ virtual bool isInterface() const; 43872ea1cf8fce25fc8ad7390eb8779ad878f2f1d4Danny van Bruggen virtual bool isNamedType() const; 4479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual bool isPointer() const; 4579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual bool isScope() const; 4679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual bool isTypeDef() const; 4779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual bool isVector() const; 4879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 4979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual const ScalarType *resolveToScalarType() const; 5079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 5179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ bool isValidEnumStorageType() const; 5279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 5379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ enum StorageMode { 5479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ StorageMode_Stack, 5579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ StorageMode_Argument, 5679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ StorageMode_Result, 5779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ }; 5879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 5979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual std::string getCppType( 6079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ StorageMode mode, 6179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ bool specifyNamespaces) const; 6279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 6379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ std::string decorateCppName( 6479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ const std::string &name, 6579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ StorageMode mode, 6679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ bool specifyNamespaces) const; 6779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 6879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ /* gets all hidl-defined types used when this item is 6979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ * printed using getCppType or getJavaType. Examples: 7079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ * 7179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ * vec<vec<vec<IFoo>>>: IFoo is added to the set 7279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ * (the hypothetical type pair) 7379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ * pair<IFoo, IBar>: IFoo and IBar are added to the set 7479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ * int32_t: nothing is added to the set 7579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ * string: nothing is added to the set 7679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ * IFoo: IFoo is added to the set 7779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ */ 7879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual void addNamedTypesToSet(std::set<const FQName> &set) const = 0; 7979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 8079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ std::string getCppStackType(bool specifyNamespaces = true) const; 8179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 8279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ std::string getCppResultType(bool specifyNamespaces = true) const; 8379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 8479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ std::string getCppArgumentType(bool specifyNamespaces = true) const; 8579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 8679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ // For an array type, dimensionality information will be accumulated at the 8779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ // end of the returned string. 8879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ // if forInitializer == true, actual dimensions are included, i.e. [3][5], 8979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ // otherwise (and by default), they are omitted, i.e. [][]. 9079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual std::string getJavaType(bool forInitializer = false) const; 9179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 9279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual std::string getJavaWrapperType() const; 9379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual std::string getJavaSuffix() const; 9479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 9579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual std::string getVtsType() const; 9679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 9779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ enum ErrorMode { 9879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ ErrorMode_Ignore, 9979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ ErrorMode_Goto, 10079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ ErrorMode_Break, 10179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ ErrorMode_Return, 10279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ }; 10379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual void emitReaderWriter( 10479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ Formatter &out, 10579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ const std::string &name, 10679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ const std::string &parcelObj, 10779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ bool parcelObjIsPointer, 10879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ bool isReader, 10979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ ErrorMode mode) const; 11079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 11179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual void emitReaderWriterEmbedded( 11279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ Formatter &out, 11379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ size_t depth, 11479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ const std::string &name, 11579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ const std::string &sanitizedName, 11679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ bool nameIsPointer, 11779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ const std::string &parcelObj, 11879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ bool parcelObjIsPointer, 11979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ bool isReader, 12079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ ErrorMode mode, 12179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ const std::string &parentName, 12279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ const std::string &offsetText) const; 12379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 12479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual void emitResolveReferences( 12579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ Formatter &out, 12679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ const std::string &name, 12779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ bool nameIsPointer, 12879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ const std::string &parcelObj, 12979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ bool parcelObjIsPointer, 13079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ bool isReader, 13179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ ErrorMode mode) const; 13279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ 13379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ virtual void emitResolveReferencesEmbedded( 1346812b09145d85180c90e38a74bdf7d3d414ef1e9Maximilien CRUZ Formatter &out, 135 size_t depth, 136 const std::string &name, 137 const std::string &sanitizedName, 138 bool nameIsPointer, 139 const std::string &parcelObj, 140 bool parcelObjIsPointer, 141 bool isReader, 142 ErrorMode mode, 143 const std::string &parentName, 144 const std::string &offsetText) const; 145 146 virtual bool useParentInEmitResolveReferencesEmbedded() const; 147 148 virtual bool useNameInEmitReaderWriterEmbedded(bool isReader) const; 149 150 virtual void emitJavaReaderWriter( 151 Formatter &out, 152 const std::string &parcelObj, 153 const std::string &argName, 154 bool isReader) const; 155 156 virtual void emitJavaFieldInitializer( 157 Formatter &out, 158 const std::string &fieldName) const; 159 160 virtual void emitJavaFieldReaderWriter( 161 Formatter &out, 162 size_t depth, 163 const std::string &parcelName, 164 const std::string &blobName, 165 const std::string &fieldName, 166 const std::string &offset, 167 bool isReader) const; 168 169 virtual status_t emitTypeDeclarations(Formatter &out) const; 170 171 // Emit any declarations pertaining to this type that have to be 172 // at global scope, i.e. enum class operators. 173 virtual status_t emitGlobalTypeDeclarations(Formatter &out) const; 174 175 // Emit any declarations pertaining to this type that have to be 176 // at global scope for transport, e.g. read/writeEmbeddedTo/FromParcel 177 virtual status_t emitGlobalHwDeclarations(Formatter &out) const; 178 179 virtual status_t emitTypeDefinitions( 180 Formatter &out, const std::string prefix) const; 181 182 virtual status_t emitJavaTypeDeclarations( 183 Formatter &out, bool atTopLevel) const; 184 185 virtual bool needsEmbeddedReadWrite() const; 186 virtual bool needsResolveReferences() const; 187 virtual bool resultNeedsDeref() const; 188 189 // Generates type declaration for vts proto file. 190 // TODO (b/30844146): make it a pure virtual method. 191 virtual status_t emitVtsTypeDeclarations(Formatter &out) const; 192 // Generates type declaration as attribute of method (return value or method 193 // argument) or attribute of compound type for vts proto file. 194 virtual status_t emitVtsAttributeType(Formatter &out) const; 195 196 // Returns true iff this type is supported through the Java backend. 197 virtual bool isJavaCompatible() const; 198 199 virtual void getAlignmentAndSize(size_t *align, size_t *size) const; 200 201 void setAnnotations(std::vector<Annotation *> *annotations); 202 const std::vector<Annotation *> &annotations() const; 203 204 virtual void appendToExportedTypesVector( 205 std::vector<const Type *> *exportedTypes) const; 206 207 virtual status_t emitExportedHeader(Formatter &out, bool forJava) const; 208 209protected: 210 void handleError(Formatter &out, ErrorMode mode) const; 211 void handleError2(Formatter &out, ErrorMode mode) const; 212 213 void emitReaderWriterEmbeddedForTypeName( 214 Formatter &out, 215 const std::string &name, 216 bool nameIsPointer, 217 const std::string &parcelObj, 218 bool parcelObjIsPointer, 219 bool isReader, 220 ErrorMode mode, 221 const std::string &parentName, 222 const std::string &offsetText, 223 const std::string &typeName, 224 const std::string &childName, 225 const std::string &funcNamespace) const; 226 227 void emitJavaReaderWriterWithSuffix( 228 Formatter &out, 229 const std::string &parcelObj, 230 const std::string &argName, 231 bool isReader, 232 const std::string &suffix, 233 const std::string &extra) const; 234 235private: 236 std::vector<Annotation *> *mAnnotations; 237 238 DISALLOW_COPY_AND_ASSIGN(Type); 239}; 240 241/* Base type for VectorType and RefType. */ 242struct TemplatedType : public Type { 243 void setElementType(Type *elementType); 244protected: 245 TemplatedType(); 246 Type *mElementType; 247private: 248 DISALLOW_COPY_AND_ASSIGN(TemplatedType); 249}; 250 251} // namespace android 252 253#endif // TYPE_H_ 254 255