Type.h revision 864c771ca4ec8a01e31c7c243625b7a5f6316768
1c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#ifndef TYPE_H_
2c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
3c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#define TYPE_H_
4c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
5c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include <android-base/macros.h>
6881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include <string>
7881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include <utils/Errors.h>
8c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
9c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
10c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
11c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Formatter;
12737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberstruct ScalarType;
13c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
14c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Type {
15c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    Type();
16c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    virtual ~Type();
17c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
18fd4afabde8fb9bbdd0021addeb9fbb62428f2c17Andreas Huber    Type *ref() { return this; }
19fd4afabde8fb9bbdd0021addeb9fbb62428f2c17Andreas Huber
205345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber    virtual bool isScope() const;
21a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber    virtual bool isInterface() const;
228d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    virtual bool isEnum() const;
238d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    virtual bool isTypeDef() const;
24295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber    virtual bool isBinder() const;
2539fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber    virtual bool isNamedType() const;
268d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
27737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    virtual const ScalarType *resolveToScalarType() const;
28c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
298d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    bool isValidEnumStorageType() const;
308d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
31881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    enum StorageMode {
32881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        StorageMode_Stack,
33881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        StorageMode_Argument,
34881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        StorageMode_Result
35881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    };
36881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual std::string getCppType(
37881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            StorageMode mode, std::string *extra) const;
38881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
39881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    // Convenience, gets StorageMode_Stack type.
40881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    std::string getCppType(std::string *extra) const;
41881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
42881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    std::string getCppResultType(std::string *extra) const;
43881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    std::string getCppArgumentType(std::string *extra) const;
44881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
452831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    virtual std::string getJavaType() const = 0;
462831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    virtual std::string getJavaSuffix() const;
472831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
48881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    enum ErrorMode {
49881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Ignore,
50881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Goto,
51881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Break,
52737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        ErrorMode_Return,
53881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    };
54881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual void emitReaderWriter(
55881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
56881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
57881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
58881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
59881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
60881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode) const;
61881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
62881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual void emitReaderWriterEmbedded(
63881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
64881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
65881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool nameIsPointer,
66881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
67881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
68881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
69881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode,
70881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parentName,
71881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &offsetText) const;
72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
732831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    virtual void emitJavaReaderWriter(
742831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            Formatter &out,
752831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &parcelObj,
762831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &argName,
772831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            bool isReader) const;
782831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
79881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual status_t emitTypeDeclarations(Formatter &out) const;
80881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
81881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual status_t emitTypeDefinitions(
82881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out, const std::string prefix) const;
83881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
842831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    virtual status_t emitJavaTypeDeclarations(Formatter &out) const;
852831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
86881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual bool needsEmbeddedReadWrite() const;
87881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual bool resultNeedsDeref() const;
88881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
895158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // Generates type declaration for vts proto file.
905158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // TODO (b/30844146): make it a pure virtual method.
915158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    virtual status_t emitVtsTypeDeclarations(Formatter &out) const;
92864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // Generates type declaration as attribute of method (return value or method
93864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // argument) or attribute of compound type for vts proto file.
94864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    virtual status_t emitVtsAttributeType(Formatter &out) const;
955158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
9670a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    // Returns true iff this type is supported through the Java backend.
9770a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    virtual bool isJavaCompatible() const;
9870a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
99881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberprotected:
100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void handleError(Formatter &out, ErrorMode mode) const;
101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void handleError2(Formatter &out, ErrorMode mode) const;
102881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void emitReaderWriterEmbeddedForTypeName(
104881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
106881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool nameIsPointer,
107881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
108881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
109881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
110881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode,
111881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parentName,
112881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &offsetText,
113881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &typeName,
114881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &childName) const;
115881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1162831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    void emitJavaReaderWriterWithSuffix(
1172831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            Formatter &out,
1182831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &parcelObj,
1192831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &argName,
1202831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            bool isReader,
1212831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &suffix,
1222831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &extra) const;
1232831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
124c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberprivate:
125c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    DISALLOW_COPY_AND_ASSIGN(Type);
126c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber};
127c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
128c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
129c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
130c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif  // TYPE_H_
131c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
132