Type.h revision 8e61c5af41226b0e1e88aa439c1360836f71795b
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
257881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual status_t 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
2704b8f7a11f794d9b4899af92a856b4a03b80b31e8Steven Moreland    virtual status_t 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
2764b8f7a11f794d9b4899af92a856b4a03b80b31e8Steven Moreland    virtual status_t emitPackageHwDeclarations(Formatter& out) const;
277244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
2788c90cc59bf93bd0c08970b4488067a33015d4a1cChih-Hung Hsieh    virtual status_t emitTypeDefinitions(Formatter& out, const std::string& prefix) const;
279881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
28085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual status_t emitJavaTypeDeclarations(
28185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out, bool atTopLevel) const;
2822831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
283881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual bool needsEmbeddedReadWrite() const;
284881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual bool resultNeedsDeref() const;
285881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
2865dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    bool needsResolveReferences() const;
2875dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    bool needsResolveReferences(std::unordered_set<const Type*>* visited) const;
2885dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    virtual bool deepNeedsResolveReferences(std::unordered_set<const Type*>* visited) const;
2895dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov
2905158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // Generates type declaration for vts proto file.
2915158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // TODO (b/30844146): make it a pure virtual method.
2925158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    virtual status_t emitVtsTypeDeclarations(Formatter &out) const;
293864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // Generates type declaration as attribute of method (return value or method
294864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // argument) or attribute of compound type for vts proto file.
295864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    virtual status_t emitVtsAttributeType(Formatter &out) const;
2965158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
29770a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    // Returns true iff this type is supported through the Java backend.
2985dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    bool isJavaCompatible() const;
2995dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    bool isJavaCompatible(std::unordered_set<const Type*>* visited) const;
3005dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    virtual bool deepIsJavaCompatible(std::unordered_set<const Type*>* visited) const;
3015dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    // Returns true iff type contains pointer
3025dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    // (excluding methods and inner types).
3035dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    bool containsPointer() const;
3045dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    bool containsPointer(std::unordered_set<const Type*>* visited) const;
3055dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    virtual bool deepContainsPointer(std::unordered_set<const Type*>* visited) const;
3065dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov
30785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual void getAlignmentAndSize(size_t *align, size_t *size) const;
30885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
309019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber    virtual void appendToExportedTypesVector(
310019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber            std::vector<const Type *> *exportedTypes) const;
311019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
3121c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber    virtual status_t emitExportedHeader(Formatter &out, bool forJava) const;
313019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
314ff5e64ae0c65b80e2baa4a95b9ae9ee894b60080Timur Iskhakov    virtual bool isNeverStrongReference() const;
315ff5e64ae0c65b80e2baa4a95b9ae9ee894b60080Timur Iskhakov
316ff5e64ae0c65b80e2baa4a95b9ae9ee894b60080Timur Iskhakov   protected:
317881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void handleError(Formatter &out, ErrorMode mode) const;
318881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
319881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void emitReaderWriterEmbeddedForTypeName(
320881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
321881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
322881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool nameIsPointer,
323881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
324881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
325881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
326881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode,
327881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parentName,
328881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &offsetText,
329881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &typeName,
330244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            const std::string &childName,
331244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            const std::string &funcNamespace) const;
332881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
3332831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    void emitJavaReaderWriterWithSuffix(
3342831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            Formatter &out,
3352831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &parcelObj,
3362831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &argName,
3372831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            bool isReader,
3382831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &suffix,
3392831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &extra) const;
3402831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
341f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    void emitDumpWithMethod(
342f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            Formatter &out,
343f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            const std::string &streamName,
344f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            const std::string &methodName,
345f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            const std::string &name) const;
346f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
34735930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov   private:
34835930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov    bool mIsPostParseCompleted = false;
34963f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov    Scope* const mParent;
35035930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov
351c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    DISALLOW_COPY_AND_ASSIGN(Type);
352c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber};
353c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
354bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong/* Base type for VectorType and RefType. */
355bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongstruct TemplatedType : public Type {
356505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov    void setElementType(const Reference<Type>& elementType);
35724e605b5194d969a1558d94896d69cc554881e46Timur Iskhakov    const Type* getElementType() const;
35833431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov
3593f1d26ed2a4843498c187126f95bed67838e08a4Timur Iskhakov    virtual std::string templatedTypeName() const = 0;
3603f1d26ed2a4843498c187126f95bed67838e08a4Timur Iskhakov    std::string typeName() const override;
3613f1d26ed2a4843498c187126f95bed67838e08a4Timur Iskhakov
362abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    bool isTemplatedType() const override;
36333431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov
36424e605b5194d969a1558d94896d69cc554881e46Timur Iskhakov    virtual bool isCompatibleElementType(const Type* elementType) const = 0;
365cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov
366b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov    std::vector<const Reference<Type>*> getReferences() const override;
36733431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov
368cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    virtual status_t validate() const override;
369cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov
37033431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov    status_t emitVtsTypeDeclarations(Formatter& out) const override;
37133431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov    status_t emitVtsAttributeType(Formatter& out) const override;
37233431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov
373cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov   protected:
37463f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov    TemplatedType(Scope* parent);
375505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov    Reference<Type> mElementType;
376505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov
377505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov   private:
378bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    DISALLOW_COPY_AND_ASSIGN(TemplatedType);
379bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong};
380bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
381c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
382c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
383c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif  // TYPE_H_
384c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
385