1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef TYPE_H_
18
19#define TYPE_H_
20
21#include <android-base/macros.h>
22#include <string>
23#include <utils/Errors.h>
24#include <vector>
25#include <set>
26
27namespace android {
28
29struct Annotation;
30struct Formatter;
31struct ScalarType;
32struct FQName;
33
34struct Type {
35    Type();
36    virtual ~Type();
37
38    virtual bool isArray() const;
39    virtual bool isBinder() const;
40    virtual bool isBitField() const;
41    virtual bool isCompoundType() const;
42    virtual bool isEnum() const;
43    virtual bool isHandle() const;
44    virtual bool isInterface() const;
45    virtual bool isNamedType() const;
46    virtual bool isMemory() const;
47    virtual bool isPointer() const;
48    virtual bool isScope() const;
49    virtual bool isScalar() const;
50    virtual bool isString() const;
51    virtual bool isTemplatedType() const;
52    virtual bool isTypeDef() const;
53    virtual bool isVector() const;
54
55    virtual const ScalarType *resolveToScalarType() const;
56
57    virtual std::string typeName() const = 0;
58
59    bool isValidEnumStorageType() const;
60    virtual bool isElidableType() const;
61    virtual bool canCheckEquality() const;
62
63    enum StorageMode {
64        StorageMode_Stack,
65        StorageMode_Argument,
66        StorageMode_Result,
67    };
68
69    // specifyNamespaces: whether to specify namespaces for built-in types
70    virtual std::string getCppType(
71            StorageMode mode,
72            bool specifyNamespaces) const;
73
74    std::string decorateCppName(
75            const std::string &name,
76            StorageMode mode,
77            bool specifyNamespaces) const;
78
79    std::string getCppStackType(bool specifyNamespaces = true) const;
80
81    std::string getCppResultType(bool specifyNamespaces = true) const;
82
83    std::string getCppArgumentType(bool specifyNamespaces = true) const;
84
85    // For an array type, dimensionality information will be accumulated at the
86    // end of the returned string.
87    // if forInitializer == true, actual dimensions are included, i.e. [3][5],
88    // otherwise (and by default), they are omitted, i.e. [][].
89    virtual std::string getJavaType(bool forInitializer = false) const;
90
91    virtual std::string getJavaWrapperType() const;
92    virtual std::string getJavaSuffix() const;
93
94    virtual std::string getVtsType() const;
95    virtual std::string getVtsValueName() const;
96
97    enum ErrorMode {
98        ErrorMode_Ignore,
99        ErrorMode_Goto,
100        ErrorMode_Break,
101        ErrorMode_Return,
102    };
103    virtual void emitReaderWriter(
104            Formatter &out,
105            const std::string &name,
106            const std::string &parcelObj,
107            bool parcelObjIsPointer,
108            bool isReader,
109            ErrorMode mode) const;
110
111    virtual void emitReaderWriterEmbedded(
112            Formatter &out,
113            size_t depth,
114            const std::string &name,
115            const std::string &sanitizedName,
116            bool nameIsPointer,
117            const std::string &parcelObj,
118            bool parcelObjIsPointer,
119            bool isReader,
120            ErrorMode mode,
121            const std::string &parentName,
122            const std::string &offsetText) const;
123
124    virtual void emitResolveReferences(
125            Formatter &out,
126            const std::string &name,
127            bool nameIsPointer,
128            const std::string &parcelObj,
129            bool parcelObjIsPointer,
130            bool isReader,
131            ErrorMode mode) const;
132
133    virtual void emitResolveReferencesEmbedded(
134            Formatter &out,
135            size_t depth,
136            const std::string &name,
137            const std::string &sanitizedName,
138            bool nameIsPointer,
139            const std::string &parcelObj,
140            bool parcelObjIsPointer,
141            bool isReader,
142            ErrorMode mode,
143            const std::string &parentName,
144            const std::string &offsetText) const;
145
146    virtual void emitDump(
147            Formatter &out,
148            const std::string &streamName,
149            const std::string &name) const;
150
151    virtual void emitJavaDump(
152            Formatter &out,
153            const std::string &streamName,
154            const std::string &name) const;
155
156    virtual bool useParentInEmitResolveReferencesEmbedded() const;
157
158    virtual bool useNameInEmitReaderWriterEmbedded(bool isReader) const;
159
160    virtual void emitJavaReaderWriter(
161            Formatter &out,
162            const std::string &parcelObj,
163            const std::string &argName,
164            bool isReader) const;
165
166    virtual void emitJavaFieldInitializer(
167            Formatter &out,
168            const std::string &fieldName) const;
169
170    virtual void emitJavaFieldReaderWriter(
171            Formatter &out,
172            size_t depth,
173            const std::string &parcelName,
174            const std::string &blobName,
175            const std::string &fieldName,
176            const std::string &offset,
177            bool isReader) const;
178
179    virtual status_t emitTypeDeclarations(Formatter &out) const;
180
181    // Emit any declarations pertaining to this type that have to be
182    // at global scope, i.e. enum class operators.
183    virtual status_t emitGlobalTypeDeclarations(Formatter &out) const;
184
185    // Emit any declarations pertaining to this type that have to be
186    // at global scope for transport, e.g. read/writeEmbeddedTo/FromParcel
187    virtual status_t emitGlobalHwDeclarations(Formatter &out) const;
188
189    virtual status_t emitTypeDefinitions(
190            Formatter &out, const std::string prefix) const;
191
192    virtual status_t emitJavaTypeDeclarations(
193            Formatter &out, bool atTopLevel) const;
194
195    virtual bool needsEmbeddedReadWrite() const;
196    virtual bool needsResolveReferences() const;
197    virtual bool resultNeedsDeref() const;
198
199    // Generates type declaration for vts proto file.
200    // TODO (b/30844146): make it a pure virtual method.
201    virtual status_t emitVtsTypeDeclarations(Formatter &out) const;
202    // Generates type declaration as attribute of method (return value or method
203    // argument) or attribute of compound type for vts proto file.
204    virtual status_t emitVtsAttributeType(Formatter &out) const;
205
206    // Returns true iff this type is supported through the Java backend.
207    virtual bool isJavaCompatible() const;
208    virtual bool containsPointer() const;
209    virtual void getAlignmentAndSize(size_t *align, size_t *size) const;
210
211    void setAnnotations(std::vector<Annotation *> *annotations);
212    const std::vector<Annotation *> &annotations() const;
213
214    virtual void appendToExportedTypesVector(
215            std::vector<const Type *> *exportedTypes) const;
216
217    virtual status_t emitExportedHeader(Formatter &out, bool forJava) const;
218
219protected:
220    void handleError(Formatter &out, ErrorMode mode) const;
221
222    void emitReaderWriterEmbeddedForTypeName(
223            Formatter &out,
224            const std::string &name,
225            bool nameIsPointer,
226            const std::string &parcelObj,
227            bool parcelObjIsPointer,
228            bool isReader,
229            ErrorMode mode,
230            const std::string &parentName,
231            const std::string &offsetText,
232            const std::string &typeName,
233            const std::string &childName,
234            const std::string &funcNamespace) const;
235
236    void emitJavaReaderWriterWithSuffix(
237            Formatter &out,
238            const std::string &parcelObj,
239            const std::string &argName,
240            bool isReader,
241            const std::string &suffix,
242            const std::string &extra) const;
243
244    void emitDumpWithMethod(
245            Formatter &out,
246            const std::string &streamName,
247            const std::string &methodName,
248            const std::string &name) const;
249
250private:
251    std::vector<Annotation *> *mAnnotations;
252
253    DISALLOW_COPY_AND_ASSIGN(Type);
254};
255
256/* Base type for VectorType and RefType. */
257struct TemplatedType : public Type {
258    void setElementType(Type *elementType);
259    Type *getElementType() const;
260    bool isTemplatedType() const override;
261    virtual bool isCompatibleElementType(Type *elementType) const = 0;
262    status_t emitVtsTypeDeclarations(Formatter &out) const override;
263    status_t emitVtsAttributeType(Formatter &out) const override;
264protected:
265    TemplatedType();
266    Type *mElementType;
267private:
268    DISALLOW_COPY_AND_ASSIGN(TemplatedType);
269};
270
271}  // namespace android
272
273#endif  // TYPE_H_
274
275