Type.h revision f630bc8736003dcf4aac3dfe47167beb6beb6c6a
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.
73979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    std::string getCppType(std::string *extra,
74979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                           bool specifyNamespaces = true) const;
75881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
76979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    std::string getCppResultType(std::string *extra,
77979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                                 bool specifyNamespaces = true) const;
78979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    std::string getCppArgumentType(std::string *extra,
79979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                                   bool specifyNamespaces = true) const;
80881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
812831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    virtual std::string getJavaType() const = 0;
8285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual std::string getJavaWrapperType() const;
832831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    virtual std::string getJavaSuffix() const;
842831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
85881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    enum ErrorMode {
86881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Ignore,
87881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Goto,
88881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Break,
89737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        ErrorMode_Return,
90881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    };
91881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual void emitReaderWriter(
92881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
93881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
94881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
95881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
96881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
97881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode) const;
98881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
99881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual void emitReaderWriterEmbedded(
100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
102881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool nameIsPointer,
103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
104881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
106881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode,
107881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parentName,
108881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &offsetText) const;
109881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1102831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    virtual void emitJavaReaderWriter(
1112831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            Formatter &out,
1122831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &parcelObj,
1132831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &argName,
1142831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            bool isReader) const;
1152831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
11685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual void emitJavaFieldInitializer(
11785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out,
11885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &fieldName) const;
11985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
12085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual void emitJavaFieldReaderWriter(
12185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out,
12285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &blobName,
12385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &fieldName,
12485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &offset,
12585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            bool isReader) const;
12685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
127881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual status_t emitTypeDeclarations(Formatter &out) const;
128881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
129881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual status_t emitTypeDefinitions(
130881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out, const std::string prefix) const;
131881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
13285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual status_t emitJavaTypeDeclarations(
13385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out, bool atTopLevel) const;
1342831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
135881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual bool needsEmbeddedReadWrite() const;
136881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual bool resultNeedsDeref() const;
137881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1385158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // Generates type declaration for vts proto file.
1395158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // TODO (b/30844146): make it a pure virtual method.
1405158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    virtual status_t emitVtsTypeDeclarations(Formatter &out) const;
141864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // Generates type declaration as attribute of method (return value or method
142864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // argument) or attribute of compound type for vts proto file.
143864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    virtual status_t emitVtsAttributeType(Formatter &out) const;
1445158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
14570a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    // Returns true iff this type is supported through the Java backend.
14670a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    virtual bool isJavaCompatible() const;
14770a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
14885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual void getAlignmentAndSize(size_t *align, size_t *size) const;
14985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
150881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberprotected:
151881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void handleError(Formatter &out, ErrorMode mode) const;
152881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void handleError2(Formatter &out, ErrorMode mode) const;
153881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
154881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void emitReaderWriterEmbeddedForTypeName(
155881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
156881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
157881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool nameIsPointer,
158881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
159881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
160881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
161881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode,
162881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parentName,
163881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &offsetText,
164881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &typeName,
165881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &childName) const;
166881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1672831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    void emitJavaReaderWriterWithSuffix(
1682831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            Formatter &out,
1692831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &parcelObj,
1702831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &argName,
1712831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            bool isReader,
1722831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &suffix,
1732831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &extra) const;
1742831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
175c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberprivate:
176c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    DISALLOW_COPY_AND_ASSIGN(Type);
177c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber};
178c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
179c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
180c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
181c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif  // TYPE_H_
182c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
183