Type.h revision 24e605b5194d969a1558d94896d69cc554881e46
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> 2533431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov#include <unordered_set> 26cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov#include <vector> 27c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 28505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov#include "Reference.h" 29505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov 30c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android { 31c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 32891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakovstruct ConstantExpression; 33c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Formatter; 34979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstruct FQName; 35891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakovstruct ScalarType; 3663f399021d053453704d41845d4ebcc06fe01738Timur Iskhakovstruct Scope; 37c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 38c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Type { 3963f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov Type(Scope* parent); 40c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber virtual ~Type(); 41c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 4299e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isArray() const; 43295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber virtual bool isBinder() const; 44abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong virtual bool isBitField() const; 45f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber virtual bool isCompoundType() const; 4699e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isEnum() const; 47abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong virtual bool isHandle() const; 4899e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isInterface() const; 4999e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isNamedType() const; 50397b5e1957cc1a1ad3365e294437324d5c088039Steven Moreland virtual bool isMemory() const; 5199e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isPointer() const; 5299e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isScope() const; 53abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong virtual bool isScalar() const; 54abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong virtual bool isString() const; 55abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong virtual bool isTemplatedType() const; 5699e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen virtual bool isTypeDef() const; 57709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber virtual bool isVector() const; 588d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 5933431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov // All types defined in this type. 60b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov std::vector<Type*> getDefinedTypes(); 61b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov virtual std::vector<const Type*> getDefinedTypes() const; 6233431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 6333431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov // All types referenced in this type. 64b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov std::vector<Reference<Type>*> getReferences(); 65b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov virtual std::vector<const Reference<Type>*> getReferences() const; 6633431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 67891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov // All constant expressions referenced in this type. 68b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov std::vector<ConstantExpression*> getConstantExpressions(); 69b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov virtual std::vector<const ConstantExpression*> getConstantExpressions() const; 70891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov 7140731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // All types referenced in this type that must have completed 7240731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // definiton before being referenced. 73b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov std::vector<Reference<Type>*> getStrongReferences(); 74b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov virtual std::vector<const Reference<Type>*> getStrongReferences() const; 7540731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov 7633431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov // Proceeds recursive pass 7733431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov // Makes sure to visit each node only once. 7833431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov status_t recursivePass(const std::function<status_t(Type*)>& func, 7933431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov std::unordered_set<const Type*>* visited); 8033431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov status_t recursivePass(const std::function<status_t(const Type*)>& func, 8133431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov std::unordered_set<const Type*>* visited) const; 8233431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 83cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov // Recursive tree pass that completes type declarations 84cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov // that depend on super types 85cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov virtual status_t resolveInheritance(); 86cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 87cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov // Recursive tree pass that validates all type-related 88cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov // syntax restrictions 89cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov virtual status_t validate() const; 90cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 9140731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // Recursive tree pass checkAcyclic return type. 9240731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // Stores cycle end for nice error messages. 9340731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov struct CheckAcyclicStatus { 9440731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov CheckAcyclicStatus(status_t status, const Type* cycleEnd = nullptr); 9540731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov 9640731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov status_t status; 9740731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov 9840731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // If a cycle is found, stores the end of cycle. 9940731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // While going back in recursion, this is used to stop printing the cycle. 10040731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov const Type* cycleEnd; 10140731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov }; 10240731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov 10340731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // Recursive tree pass that ensures that type definitions and references 10440731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // are acyclic. 10540731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // If some cases allow using of incomplete types, these cases are to be 10640731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov // declared in Type::getStrongReferences. 10740731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov CheckAcyclicStatus checkAcyclic(std::unordered_set<const Type*>* visited, 10840731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov std::unordered_set<const Type*>* stack) const; 10940731afa5f0e4e0e9bc36bd9c37e24b9bdaa3413Timur Iskhakov 110737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber virtual const ScalarType *resolveToScalarType() const; 111c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 1120ecc7b8aca24a5618512610bb6371bdb91b5fdc2Steven Moreland virtual std::string typeName() const = 0; 11330bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland 1148d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber bool isValidEnumStorageType() const; 1159df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland virtual bool isElidableType() const; 116c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong virtual bool canCheckEquality() const; 1178d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 11835930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov // Marks that package proceeding is completed 11935930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov // Post parse passes must be proceeded during owner package parsing 12035930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov void setPostParseCompleted(); 12135930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov 12263f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov Scope* parent(); 12363f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov 124881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber enum StorageMode { 125881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber StorageMode_Stack, 126881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber StorageMode_Argument, 127ac5878945afde379e41d9c93de44c32537f868b1Martijn Coenen StorageMode_Result, 128881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber }; 1293b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong 130e30ee9b06ac578006161e84633db91289f889068Steven Moreland // specifyNamespaces: whether to specify namespaces for built-in types 131881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual std::string getCppType( 132979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland StorageMode mode, 1333b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong bool specifyNamespaces) const; 1343b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong 1353b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong std::string decorateCppName( 1363b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong const std::string &name, 1373b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong StorageMode mode, 138979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland bool specifyNamespaces) const; 139979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland 1403b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong std::string getCppStackType(bool specifyNamespaces = true) const; 141881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1423b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong std::string getCppResultType(bool specifyNamespaces = true) const; 1434c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber 1443b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong std::string getCppArgumentType(bool specifyNamespaces = true) const; 1454c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber 1464ed1347cd29e6e07acad368891bb03078c798abaYifan Hong // For an array type, dimensionality information will be accumulated at the 1474ed1347cd29e6e07acad368891bb03078c798abaYifan Hong // end of the returned string. 1484c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber // if forInitializer == true, actual dimensions are included, i.e. [3][5], 1494c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber // otherwise (and by default), they are omitted, i.e. [][]. 1504ed1347cd29e6e07acad368891bb03078c798abaYifan Hong virtual std::string getJavaType(bool forInitializer = false) const; 151881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 15285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual std::string getJavaWrapperType() const; 1532831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber virtual std::string getJavaSuffix() const; 1542831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 155c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang virtual std::string getVtsType() const; 156e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang virtual std::string getVtsValueName() const; 157c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang 158881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber enum ErrorMode { 159881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode_Ignore, 160881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode_Goto, 161881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode_Break, 162737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber ErrorMode_Return, 163881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber }; 164881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual void emitReaderWriter( 165881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 166881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 167881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 168881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 169881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 170881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode) const; 171881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 172881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual void emitReaderWriterEmbedded( 173881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 174f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber size_t depth, 175881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 176be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong const std::string &sanitizedName, 177881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool nameIsPointer, 178881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 179881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 180881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 181881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode, 182881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parentName, 183881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &offsetText) const; 184881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 185bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong virtual void emitResolveReferences( 186bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong Formatter &out, 187bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &name, 188bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool nameIsPointer, 189bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &parcelObj, 190bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool parcelObjIsPointer, 191bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool isReader, 192bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong ErrorMode mode) const; 193bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 194bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong virtual void emitResolveReferencesEmbedded( 195bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong Formatter &out, 196bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong size_t depth, 197bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &name, 198bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &sanitizedName, 199bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool nameIsPointer, 200bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &parcelObj, 201bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool parcelObjIsPointer, 202bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool isReader, 203bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong ErrorMode mode, 204bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &parentName, 205bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &offsetText) const; 206bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 207f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong virtual void emitDump( 208f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong Formatter &out, 209f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong const std::string &streamName, 210f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong const std::string &name) const; 211f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong 212e45b5303e072043679483a70606f6c00dde17382Yifan Hong virtual void emitJavaDump( 213e45b5303e072043679483a70606f6c00dde17382Yifan Hong Formatter &out, 214e45b5303e072043679483a70606f6c00dde17382Yifan Hong const std::string &streamName, 215e45b5303e072043679483a70606f6c00dde17382Yifan Hong const std::string &name) const; 216e45b5303e072043679483a70606f6c00dde17382Yifan Hong 21700f471711684903fd747e7871edf437ca54ed397Yifan Hong virtual bool useParentInEmitResolveReferencesEmbedded() const; 21800f471711684903fd747e7871edf437ca54ed397Yifan Hong 219244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong virtual bool useNameInEmitReaderWriterEmbedded(bool isReader) const; 220244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong 2212831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber virtual void emitJavaReaderWriter( 2222831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber Formatter &out, 2232831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &parcelObj, 2242831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &argName, 2252831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber bool isReader) const; 2262831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 22785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual void emitJavaFieldInitializer( 22885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 22985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName) const; 23085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 23185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual void emitJavaFieldReaderWriter( 23285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 2334c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber size_t depth, 234709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber const std::string &parcelName, 23585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &blobName, 23685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName, 23785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &offset, 23885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const; 23985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 240881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual status_t emitTypeDeclarations(Formatter &out) const; 241881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 242e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber // Emit any declarations pertaining to this type that have to be 243e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber // at global scope, i.e. enum class operators. 244e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber virtual status_t emitGlobalTypeDeclarations(Formatter &out) const; 245e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 246244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong // Emit any declarations pertaining to this type that have to be 247244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong // at global scope for transport, e.g. read/writeEmbeddedTo/FromParcel 248244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong virtual status_t emitGlobalHwDeclarations(Formatter &out) const; 249244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong 2508c90cc59bf93bd0c08970b4488067a33015d4a1cChih-Hung Hsieh virtual status_t emitTypeDefinitions(Formatter& out, const std::string& prefix) const; 251881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 25285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual status_t emitJavaTypeDeclarations( 25385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, bool atTopLevel) const; 2542831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 255881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual bool needsEmbeddedReadWrite() const; 256bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong virtual bool needsResolveReferences() const; 257881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber virtual bool resultNeedsDeref() const; 258881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 2595158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang // Generates type declaration for vts proto file. 2605158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang // TODO (b/30844146): make it a pure virtual method. 2615158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang virtual status_t emitVtsTypeDeclarations(Formatter &out) const; 262864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang // Generates type declaration as attribute of method (return value or method 263864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang // argument) or attribute of compound type for vts proto file. 264864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang virtual status_t emitVtsAttributeType(Formatter &out) const; 2655158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 26670a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber // Returns true iff this type is supported through the Java backend. 26770a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber virtual bool isJavaCompatible() const; 26860d3b22101e911242d2d41c8dc8309e8706f1fe1Andreas Huber virtual bool containsPointer() const; 26985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber virtual void getAlignmentAndSize(size_t *align, size_t *size) const; 27085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 271019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber virtual void appendToExportedTypesVector( 272019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber std::vector<const Type *> *exportedTypes) const; 273019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 2741c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber virtual status_t emitExportedHeader(Formatter &out, bool forJava) const; 275019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 276881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberprotected: 277881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void handleError(Formatter &out, ErrorMode mode) const; 278881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 279881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitReaderWriterEmbeddedForTypeName( 280881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 281881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 282881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool nameIsPointer, 283881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 284881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 285881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 286881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode, 287881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parentName, 288881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &offsetText, 289881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &typeName, 290244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong const std::string &childName, 291244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong const std::string &funcNamespace) const; 292881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 2932831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber void emitJavaReaderWriterWithSuffix( 2942831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber Formatter &out, 2952831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &parcelObj, 2962831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &argName, 2972831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber bool isReader, 2982831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &suffix, 2992831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &extra) const; 3002831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 301f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong void emitDumpWithMethod( 302f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong Formatter &out, 303f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong const std::string &streamName, 304f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong const std::string &methodName, 305f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong const std::string &name) const; 306f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong 30735930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov private: 30835930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov bool mIsPostParseCompleted = false; 30963f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov Scope* const mParent; 31035930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov 311c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber DISALLOW_COPY_AND_ASSIGN(Type); 312c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}; 313c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 314bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong/* Base type for VectorType and RefType. */ 315bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongstruct TemplatedType : public Type { 316505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov void setElementType(const Reference<Type>& elementType); 31724e605b5194d969a1558d94896d69cc554881e46Timur Iskhakov const Type* getElementType() const; 31833431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 319abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong bool isTemplatedType() const override; 32033431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 32124e605b5194d969a1558d94896d69cc554881e46Timur Iskhakov virtual bool isCompatibleElementType(const Type* elementType) const = 0; 322cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 323b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov std::vector<const Reference<Type>*> getReferences() const override; 32433431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 325cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov virtual status_t validate() const override; 326cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 32733431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov status_t emitVtsTypeDeclarations(Formatter& out) const override; 32833431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov status_t emitVtsAttributeType(Formatter& out) const override; 32933431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 330cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov protected: 33163f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov TemplatedType(Scope* parent); 332505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov Reference<Type> mElementType; 333505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov 334505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov private: 335bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong DISALLOW_COPY_AND_ASSIGN(TemplatedType); 336bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}; 337bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 338c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} // namespace android 339c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 340c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif // TYPE_H_ 341c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 342