Type.h revision 4c865b72b320a46f326a335cfd326b66b0e10f67
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#ifndef TYPE_H_ 18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 19c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#define TYPE_H_ 20c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 21c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include <android-base/macros.h> 22881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include <string> 23881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include <utils/Errors.h> 24979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland#include <set> 25c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android { 27c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 28c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Formatter; 29737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberstruct ScalarType; 30979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstruct FQName; 31c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 32c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Type { 33c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber Type(); 34c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber virtual ~Type(); 35c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 36fd4afabde8fb9bbdd0021addeb9fbb62428f2c17Andreas Huber Type *ref() { return this; } 37fd4afabde8fb9bbdd0021addeb9fbb62428f2c17Andreas Huber 385345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber virtual bool isScope() const; 39a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber virtual bool isInterface() const; 408d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber virtual bool isEnum() const; 418d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber virtual bool isTypeDef() const; 42295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber virtual bool isBinder() const; 4339fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber virtual bool isNamedType() const; 44f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber virtual bool isCompoundType() const; 458d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 46737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber virtual const ScalarType *resolveToScalarType() const; 47c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 488d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber bool isValidEnumStorageType() const; 498d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 50881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber enum StorageMode { 51881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber StorageMode_Stack, 52881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber StorageMode_Argument, 53881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber StorageMode_Result 54881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber }; 55881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual std::string getCppType( 56979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland StorageMode mode, 57979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland std::string *extra, 58979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland bool specifyNamespaces) const; 59979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland 60979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland /* gets all hidl-defined types used when this item is 61979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland * printed using getCppType or getJavaType. Examples: 62979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland * 63979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland * vec<vec<vec<IFoo>>>: IFoo is added to the set 64979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland * (the hypothetical type pair) 65979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland * pair<IFoo, IBar>: IFoo and IBar are added to the set 66979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland * int32_t: nothing is added to the set 67979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland * string: nothing is added to the set 68979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland * IFoo: IFoo is added to the set 69979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland */ 70979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland virtual void addNamedTypesToSet(std::set<const FQName> &set) const = 0; 71881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber // Convenience, gets StorageMode_Stack type. 734c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber std::string getCppType( 744c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber std::string *extra, bool specifyNamespaces = true) const; 75881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 764c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber std::string getCppResultType( 774c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber std::string *extra, bool specifyNamespaces = true) const; 784c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber 794c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber std::string getCppArgumentType( 804c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber std::string *extra, bool specifyNamespaces = true) const; 814c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber 824c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber // For an array type, "extra" accumulates dimensionality information, 834c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber // if forInitializer == true, actual dimensions are included, i.e. [3][5], 844c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber // otherwise (and by default), they are omitted, i.e. [][]. 854c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber virtual std::string getJavaType( 864c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber std::string *extra, bool forInitializer = false) const; 87881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 8885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual std::string getJavaWrapperType() const; 892831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber virtual std::string getJavaSuffix() const; 902831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 91881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber enum ErrorMode { 92881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode_Ignore, 93881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode_Goto, 94881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode_Break, 95737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber ErrorMode_Return, 96881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber }; 97881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual void emitReaderWriter( 98881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 99881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 102881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode) const; 104881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual void emitReaderWriterEmbedded( 106881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 107f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber size_t depth, 108881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 109881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool nameIsPointer, 110881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 111881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 112881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 113881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode, 114881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parentName, 115881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &offsetText) const; 116881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1172831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber virtual void emitJavaReaderWriter( 1182831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber Formatter &out, 1192831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &parcelObj, 1202831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &argName, 1212831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber bool isReader) const; 1222831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 12385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual void emitJavaFieldInitializer( 12485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 12585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName) const; 12685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 12785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual void emitJavaFieldReaderWriter( 12885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 1294c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber size_t depth, 13085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &blobName, 13185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName, 13285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &offset, 13385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const; 13485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 135881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual status_t emitTypeDeclarations(Formatter &out) const; 136881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 137881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual status_t emitTypeDefinitions( 138881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, const std::string prefix) const; 139881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 14085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual status_t emitJavaTypeDeclarations( 14185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, bool atTopLevel) const; 1422831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 143881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual bool needsEmbeddedReadWrite() const; 144881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual bool resultNeedsDeref() const; 145881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1465158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang // Generates type declaration for vts proto file. 1475158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang // TODO (b/30844146): make it a pure virtual method. 1485158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang virtual status_t emitVtsTypeDeclarations(Formatter &out) const; 149864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang // Generates type declaration as attribute of method (return value or method 150864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang // argument) or attribute of compound type for vts proto file. 151864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang virtual status_t emitVtsAttributeType(Formatter &out) const; 1525158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 15370a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber // Returns true iff this type is supported through the Java backend. 15470a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber virtual bool isJavaCompatible() const; 15570a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber 15685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual void getAlignmentAndSize(size_t *align, size_t *size) const; 15785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 158881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberprotected: 159881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void handleError(Formatter &out, ErrorMode mode) const; 160881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void handleError2(Formatter &out, ErrorMode mode) const; 161881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 162881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitReaderWriterEmbeddedForTypeName( 163881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 164881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 165881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool nameIsPointer, 166881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 167881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 168881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 169881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode, 170881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parentName, 171881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &offsetText, 172881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &typeName, 173881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &childName) const; 174881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1752831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber void emitJavaReaderWriterWithSuffix( 1762831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber Formatter &out, 1772831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &parcelObj, 1782831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &argName, 1792831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber bool isReader, 1802831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &suffix, 1812831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &extra) const; 1822831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 183c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberprivate: 184c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber DISALLOW_COPY_AND_ASSIGN(Type); 185c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}; 186c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 187c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} // namespace android 188c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 189c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif // TYPE_H_ 190c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 191