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