Type.h revision 368e46077eb9fbe52242e037a5b9de91693fe70f
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 <utils/Errors.h> 23979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland#include <set> 24cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov#include <string> 25458ca365d99ae9f98bd59c0c2ea8b4fa54e2d535Timur Iskhakov#include <unordered_map> 2633431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov#include <unordered_set> 27cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov#include <vector> 28c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 29505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov#include "Reference.h" 30505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov 31c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android { 32c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 33bf71421a737c2b4f518bc3b21d0e21c6b2e00fdbSteven Moreland// TODO(b/65200821): remove 34bf71421a737c2b4f518bc3b21d0e21c6b2e00fdbSteven Moreland// HACK because no no type can depend or see AST 35bf71421a737c2b4f518bc3b21d0e21c6b2e00fdbSteven Morelandextern std::string gCurrentCompileName; 36bf71421a737c2b4f518bc3b21d0e21c6b2e00fdbSteven Moreland 37891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakovstruct ConstantExpression; 38c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Formatter; 39979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstruct FQName; 40891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakovstruct ScalarType; 4163f399021d053453704d41845d4ebcc06fe01738Timur Iskhakovstruct Scope; 42c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 43c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Type { 4463f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov Type(Scope* parent); 45c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber virtual ~Type(); 46c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 4799e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isArray() const; 48295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber virtual bool isBinder() const; 49abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong virtual bool isBitField() const; 50f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber virtual bool isCompoundType() const; 5199e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isEnum() const; 52abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong virtual bool isHandle() const; 5399e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isInterface() const; 5499e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isNamedType() const; 55397b5e1957cc1a1ad3365e294437324d5c088039Steven Moreland virtual bool isMemory() const; 5699e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isPointer() const; 5799e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isScope() const; 58abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong virtual bool isScalar() const; 59abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong virtual bool isString() const; 60abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong virtual bool isTemplatedType() const; 6199e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isTypeDef() const; 62709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber virtual bool isVector() const; 638d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 64dbaed3317411232962d25666de60799b4dcfce98Timur Iskhakov // Resolves the type by unwrapping typedefs 65dbaed3317411232962d25666de60799b4dcfce98Timur Iskhakov Type* resolve(); 66dbaed3317411232962d25666de60799b4dcfce98Timur Iskhakov virtual const Type* resolve() const; 67dbaed3317411232962d25666de60799b4dcfce98Timur Iskhakov 6833431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov // All types defined in this type. 69b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov std::vector<Type*> getDefinedTypes(); 70b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov virtual std::vector<const Type*> getDefinedTypes() const; 7133431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 7233431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov // All types referenced in this type. 73b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov std::vector<Reference<Type>*> getReferences(); 74b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov virtual std::vector<const Reference<Type>*> getReferences() const; 7533431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 76891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov // All constant expressions referenced in this type. 77b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov std::vector<ConstantExpression*> getConstantExpressions(); 78b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov virtual std::vector<const ConstantExpression*> getConstantExpressions() const; 79891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov 8040731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // All types referenced in this type that must have completed 8140731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // definiton before being referenced. 82b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov std::vector<Reference<Type>*> getStrongReferences(); 83b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov virtual std::vector<const Reference<Type>*> getStrongReferences() const; 8440731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov 8533431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov // Proceeds recursive pass 8633431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov // Makes sure to visit each node only once. 8733431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov status_t recursivePass(const std::function<status_t(Type*)>& func, 8833431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov std::unordered_set<const Type*>* visited); 8933431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov status_t recursivePass(const std::function<status_t(const Type*)>& func, 9033431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov std::unordered_set<const Type*>* visited) const; 9133431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 92cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov // Recursive tree pass that completes type declarations 93cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov // that depend on super types 94cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov virtual status_t resolveInheritance(); 95cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 96cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov // Recursive tree pass that validates all type-related 97cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov // syntax restrictions 98cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov virtual status_t validate() const; 99cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 10040731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // Recursive tree pass checkAcyclic return type. 10140731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // Stores cycle end for nice error messages. 10240731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov struct CheckAcyclicStatus { 10340731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov CheckAcyclicStatus(status_t status, const Type* cycleEnd = nullptr); 10440731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov 10540731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov status_t status; 10640731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov 10740731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // If a cycle is found, stores the end of cycle. 10840731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // While going back in recursion, this is used to stop printing the cycle. 10940731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov const Type* cycleEnd; 11040731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov }; 11140731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov 11240731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // Recursive tree pass that ensures that type definitions and references 113458ca365d99ae9f98bd59c0c2ea8b4fa54e2d535Timur Iskhakov // are acyclic and builds reversed topological order of the types. 11440731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // If some cases allow using of incomplete types, these cases are to be 11540731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // declared in Type::getStrongReferences. 116458ca365d99ae9f98bd59c0c2ea8b4fa54e2d535Timur Iskhakov CheckAcyclicStatus topologicalOrder(std::unordered_map<const Type*, size_t>* reversedOrder, 117458ca365d99ae9f98bd59c0c2ea8b4fa54e2d535Timur Iskhakov std::unordered_set<const Type*>* stack) const; 11840731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov 119041fdfe5995b6c88b4aa1b40d668d2c891ab7e91Timur Iskhakov // Checks following C++ restriction on forward declaration: 120041fdfe5995b6c88b4aa1b40d668d2c891ab7e91Timur Iskhakov // inner struct could be forward declared only inside its parent. 121458ca365d99ae9f98bd59c0c2ea8b4fa54e2d535Timur Iskhakov status_t checkForwardReferenceRestrictions(const Reference<Type>& ref) const; 122041fdfe5995b6c88b4aa1b40d668d2c891ab7e91Timur Iskhakov 123737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber virtual const ScalarType *resolveToScalarType() const; 124c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 1250ecc7b8aca24a5618512610bb6371bdb91b5fdc2Steven Moreland virtual std::string typeName() const = 0; 12630bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland 1278d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber bool isValidEnumStorageType() const; 1289df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland virtual bool isElidableType() const; 1295dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov 130c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong virtual bool canCheckEquality() const; 1315dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov bool canCheckEquality(std::unordered_set<const Type*>* visited) const; 1325dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov virtual bool deepCanCheckEquality(std::unordered_set<const Type*>* visited) const; 1338d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 13435930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov // Marks that package proceeding is completed 13535930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov // Post parse passes must be proceeded during owner package parsing 13635930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov void setPostParseCompleted(); 13735930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov 13863f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov Scope* parent(); 139041fdfe5995b6c88b4aa1b40d668d2c891ab7e91Timur Iskhakov const Scope* parent() const; 14063f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov 141881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber enum StorageMode { 142881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber StorageMode_Stack, 143881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber StorageMode_Argument, 144ac5878945afde379e41d9c93de44c32537f868b1Martijn Coenen StorageMode_Result, 145881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber }; 1463b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong 147e30ee9b06ac578006161e84633db91289f889068Steven Moreland // specifyNamespaces: whether to specify namespaces for built-in types 148881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual std::string getCppType( 149979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland StorageMode mode, 1503b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong bool specifyNamespaces) const; 1513b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong 1523b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong std::string decorateCppName( 1533b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong const std::string &name, 1543b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong StorageMode mode, 155979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland bool specifyNamespaces) const; 156979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland 1573b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong std::string getCppStackType(bool specifyNamespaces = true) const; 158881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1593b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong std::string getCppResultType(bool specifyNamespaces = true) const; 1604c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber 1613b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong std::string getCppArgumentType(bool specifyNamespaces = true) const; 1624c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber 1634ed1347cd29e6e07acad368891bb03078c798abaYifan Hong // For an array type, dimensionality information will be accumulated at the 1644ed1347cd29e6e07acad368891bb03078c798abaYifan Hong // end of the returned string. 1654c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber // if forInitializer == true, actual dimensions are included, i.e. [3][5], 1664c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber // otherwise (and by default), they are omitted, i.e. [][]. 1674ed1347cd29e6e07acad368891bb03078c798abaYifan Hong virtual std::string getJavaType(bool forInitializer = false) const; 168881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 16985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual std::string getJavaWrapperType() const; 1702831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber virtual std::string getJavaSuffix() const; 1712831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 172c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang virtual std::string getVtsType() const; 173e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang virtual std::string getVtsValueName() const; 174c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang 175881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber enum ErrorMode { 176881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode_Ignore, 177881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode_Goto, 178881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode_Break, 179737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber ErrorMode_Return, 180881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber }; 181881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual void emitReaderWriter( 182881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 183881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 184881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 185881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 186881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 187881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode) const; 188881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 189881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual void emitReaderWriterEmbedded( 190881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 191f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber size_t depth, 192881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 193be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong const std::string &sanitizedName, 194881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool nameIsPointer, 195881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 196881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 197881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 198881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode, 199881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parentName, 200881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &offsetText) const; 201881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 202bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong virtual void emitResolveReferences( 203bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong Formatter &out, 204bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &name, 205bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool nameIsPointer, 206bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &parcelObj, 207bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool parcelObjIsPointer, 208bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool isReader, 209bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong ErrorMode mode) const; 210bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 211bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong virtual void emitResolveReferencesEmbedded( 212bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong Formatter &out, 213bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong size_t depth, 214bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &name, 215bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &sanitizedName, 216bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool nameIsPointer, 217bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &parcelObj, 218bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool parcelObjIsPointer, 219bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool isReader, 220bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong ErrorMode mode, 221bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &parentName, 222bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &offsetText) const; 223bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 224f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong virtual void emitDump( 225f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong Formatter &out, 226f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong const std::string &streamName, 227f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong const std::string &name) const; 228f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong 229e45b5303e072043679483a70606f6c00dde17382Yifan Hong virtual void emitJavaDump( 230e45b5303e072043679483a70606f6c00dde17382Yifan Hong Formatter &out, 231e45b5303e072043679483a70606f6c00dde17382Yifan Hong const std::string &streamName, 232e45b5303e072043679483a70606f6c00dde17382Yifan Hong const std::string &name) const; 233e45b5303e072043679483a70606f6c00dde17382Yifan Hong 23400f471711684903fd747e7871edf437ca54ed397Yifan Hong virtual bool useParentInEmitResolveReferencesEmbedded() const; 23500f471711684903fd747e7871edf437ca54ed397Yifan Hong 236244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong virtual bool useNameInEmitReaderWriterEmbedded(bool isReader) const; 237244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong 2382831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber virtual void emitJavaReaderWriter( 2392831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber Formatter &out, 2402831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &parcelObj, 2412831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &argName, 2422831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber bool isReader) const; 2432831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 24485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual void emitJavaFieldInitializer( 24585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 24685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName) const; 24785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 24885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual void emitJavaFieldReaderWriter( 24985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 2504c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber size_t depth, 251709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber const std::string &parcelName, 25285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &blobName, 25385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName, 25485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &offset, 25585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const; 25685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 257368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland virtual void emitTypeDeclarations(Formatter& out) const; 258881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 2598e61c5af41226b0e1e88aa439c1360836f71795bSteven Moreland virtual void emitGlobalTypeDeclarations(Formatter& out) const; 2608e61c5af41226b0e1e88aa439c1360836f71795bSteven Moreland 261fd3f250dfb0f1a990c29a76de184830e6dd9e883Timur Iskhakov // Emit scope C++ forward declaration. 262fd3f250dfb0f1a990c29a76de184830e6dd9e883Timur Iskhakov // There is no need to forward declare interfaces, as 263fd3f250dfb0f1a990c29a76de184830e6dd9e883Timur Iskhakov // they are always declared in global scope in dedicated file. 264fd3f250dfb0f1a990c29a76de184830e6dd9e883Timur Iskhakov virtual void emitTypeForwardDeclaration(Formatter& out) const; 265fd3f250dfb0f1a990c29a76de184830e6dd9e883Timur Iskhakov 266e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber // Emit any declarations pertaining to this type that have to be 267e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber // at global scope, i.e. enum class operators. 2684b8f7a11f794d9b4899af92a856b4a03b80b31e8Steven Moreland // For android.hardware.foo@1.0::*, this will be in namespace 2694b8f7a11f794d9b4899af92a856b4a03b80b31e8Steven Moreland // android::hardware::foo::V1_0 270368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland virtual void emitPackageTypeDeclarations(Formatter& out) const; 271e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 272244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong // Emit any declarations pertaining to this type that have to be 273244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong // at global scope for transport, e.g. read/writeEmbeddedTo/FromParcel 2744b8f7a11f794d9b4899af92a856b4a03b80b31e8Steven Moreland // For android.hardware.foo@1.0::*, this will be in namespace 2754b8f7a11f794d9b4899af92a856b4a03b80b31e8Steven Moreland // android::hardware::foo::V1_0 276368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland virtual void emitPackageHwDeclarations(Formatter& out) const; 277244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong 278368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland virtual void emitTypeDefinitions(Formatter& out, const std::string& prefix) const; 279881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 280368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland virtual void emitJavaTypeDeclarations(Formatter& out, bool atTopLevel) const; 2812831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 282881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual bool needsEmbeddedReadWrite() const; 283881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual bool resultNeedsDeref() const; 284881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 2855dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov bool needsResolveReferences() const; 2865dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov bool needsResolveReferences(std::unordered_set<const Type*>* visited) const; 2875dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov virtual bool deepNeedsResolveReferences(std::unordered_set<const Type*>* visited) const; 2885dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov 2895158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang // Generates type declaration for vts proto file. 2905158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang // TODO (b/30844146): make it a pure virtual method. 291368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland virtual void emitVtsTypeDeclarations(Formatter& out) const; 292864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang // Generates type declaration as attribute of method (return value or method 293864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang // argument) or attribute of compound type for vts proto file. 294368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland virtual void emitVtsAttributeType(Formatter& out) const; 2955158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 29670a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber // Returns true iff this type is supported through the Java backend. 2975dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov bool isJavaCompatible() const; 2985dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov bool isJavaCompatible(std::unordered_set<const Type*>* visited) const; 2995dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov virtual bool deepIsJavaCompatible(std::unordered_set<const Type*>* visited) const; 3005dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov // Returns true iff type contains pointer 3015dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov // (excluding methods and inner types). 3025dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov bool containsPointer() const; 3035dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov bool containsPointer(std::unordered_set<const Type*>* visited) const; 3045dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov virtual bool deepContainsPointer(std::unordered_set<const Type*>* visited) const; 3055dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov 30685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual void getAlignmentAndSize(size_t *align, size_t *size) const; 30785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 308019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber virtual void appendToExportedTypesVector( 309019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber std::vector<const Type *> *exportedTypes) const; 310019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 311368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland virtual void emitExportedHeader(Formatter& out, bool forJava) const; 312019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 313ff5e64ae0c65b80e2baa4a95b9ae9ee894b60080Timur Iskhakov virtual bool isNeverStrongReference() const; 314ff5e64ae0c65b80e2baa4a95b9ae9ee894b60080Timur Iskhakov 315ff5e64ae0c65b80e2baa4a95b9ae9ee894b60080Timur Iskhakov protected: 316881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void handleError(Formatter &out, ErrorMode mode) const; 317881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 318881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitReaderWriterEmbeddedForTypeName( 319881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 320881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 321881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool nameIsPointer, 322881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 323881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 324881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 325881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode, 326881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parentName, 327881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &offsetText, 328881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &typeName, 329244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong const std::string &childName, 330244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong const std::string &funcNamespace) const; 331881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 3322831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber void emitJavaReaderWriterWithSuffix( 3332831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber Formatter &out, 3342831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &parcelObj, 3352831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &argName, 3362831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber bool isReader, 3372831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &suffix, 3382831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &extra) const; 3392831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 340f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong void emitDumpWithMethod( 341f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong Formatter &out, 342f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong const std::string &streamName, 343f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong const std::string &methodName, 344f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong const std::string &name) const; 345f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong 34635930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov private: 34735930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov bool mIsPostParseCompleted = false; 34863f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov Scope* const mParent; 34935930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov 350c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber DISALLOW_COPY_AND_ASSIGN(Type); 351c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}; 352c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 353bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong/* Base type for VectorType and RefType. */ 354bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongstruct TemplatedType : public Type { 355505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov void setElementType(const Reference<Type>& elementType); 35624e605b5194d969a1558d94896d69cc554881e46Timur Iskhakov const Type* getElementType() const; 35733431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 3583f1d26ed2a4843498c187126f95bed67838e08a4Timur Iskhakov virtual std::string templatedTypeName() const = 0; 3593f1d26ed2a4843498c187126f95bed67838e08a4Timur Iskhakov std::string typeName() const override; 3603f1d26ed2a4843498c187126f95bed67838e08a4Timur Iskhakov 361abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong bool isTemplatedType() const override; 36233431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 36324e605b5194d969a1558d94896d69cc554881e46Timur Iskhakov virtual bool isCompatibleElementType(const Type* elementType) const = 0; 364cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 365b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov std::vector<const Reference<Type>*> getReferences() const override; 36633431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 367cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov virtual status_t validate() const override; 368cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 369368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland void emitVtsTypeDeclarations(Formatter& out) const override; 370368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland void emitVtsAttributeType(Formatter& out) const override; 37133431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 372cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov protected: 37363f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov TemplatedType(Scope* parent); 374505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov Reference<Type> mElementType; 375505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov 376505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov private: 377bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong DISALLOW_COPY_AND_ASSIGN(TemplatedType); 378bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}; 379bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 380c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} // namespace android 381c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 382c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif // TYPE_H_ 383c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 384