Type.h revision 99e6bebc96d75d1c9b9b8130cd9b880dacb95b01
176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti/*
276f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Copyright (C) 2016 The Android Open Source Project
376f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti *
476f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Licensed under the Apache License, Version 2.0 (the "License");
576f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * you may not use this file except in compliance with the License.
676f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * You may obtain a copy of the License at
776f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti *
876f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti *      http://www.apache.org/licenses/LICENSE-2.0
976f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti *
1076f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Unless required by applicable law or agreed to in writing, software
1176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * distributed under the License is distributed on an "AS IS" BASIS,
1276f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1376f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * See the License for the specific language governing permissions and
1476f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * limitations under the License.
1576f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti */
1676f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti
1776f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti#ifndef TYPE_H_
1876f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti
1976f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti#define TYPE_H_
2076f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti
2176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti#include <android-base/macros.h>
22e426a53a86990314bafe7b3e33dd41632eec1757Danny van Bruggen#include <string>
236812b09145d85180c90e38a74bdf7d3d414ef1e9Maximilien CRUZ#include <utils/Errors.h>
249b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZ#include <vector>
259b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZ#include <set>
269b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZ
279b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZnamespace android {
289b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZ
299b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZstruct Annotation;
309b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZstruct Formatter;
319b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZstruct ScalarType;
329b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZstruct FQName;
339b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZ
349b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZstruct Type {
359b8f2036c433b7c61ee2f819d80ae19cbf81ad0dMaximilien CRUZ    Type();
366812b09145d85180c90e38a74bdf7d3d414ef1e9Maximilien CRUZ    virtual ~Type();
37923683757d3168969745ee2c85e146d6c89007a7Maximilien Cruz
38923683757d3168969745ee2c85e146d6c89007a7Maximilien Cruz    virtual bool isArray() const;
39923683757d3168969745ee2c85e146d6c89007a7Maximilien Cruz    virtual bool isBinder() const;
40923683757d3168969745ee2c85e146d6c89007a7Maximilien Cruz    virtual bool isCompoundType() const;
416812b09145d85180c90e38a74bdf7d3d414ef1e9Maximilien CRUZ    virtual bool isEnum() const;
426812b09145d85180c90e38a74bdf7d3d414ef1e9Maximilien CRUZ    virtual bool isInterface() const;
43872ea1cf8fce25fc8ad7390eb8779ad878f2f1d4Danny van Bruggen    virtual bool isNamedType() const;
4479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual bool isPointer() const;
4579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual bool isScope() const;
4679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual bool isTypeDef() const;
4779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual bool isVector() const;
4879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
4979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual const ScalarType *resolveToScalarType() const;
5079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
5179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    bool isValidEnumStorageType() const;
5279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
5379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    enum StorageMode {
5479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ        StorageMode_Stack,
5579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ        StorageMode_Argument,
5679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ        StorageMode_Result,
5779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    };
5879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
5979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual std::string getCppType(
6079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            StorageMode mode,
6179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            bool specifyNamespaces) const;
6279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
6379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    std::string decorateCppName(
6479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            const std::string &name,
6579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            StorageMode mode,
6679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            bool specifyNamespaces) const;
6779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
6879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    /* gets all hidl-defined types used when this item is
6979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ     * printed using getCppType or getJavaType. Examples:
7079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ     *
7179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ     * vec<vec<vec<IFoo>>>: IFoo is added to the set
7279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ     * (the hypothetical type pair)
7379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ     * pair<IFoo, IBar>: IFoo and IBar are added to the set
7479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ     * int32_t: nothing is added to the set
7579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ     * string: nothing is added to the set
7679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ     * IFoo: IFoo is added to the set
7779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ     */
7879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual void addNamedTypesToSet(std::set<const FQName> &set) const = 0;
7979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
8079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    std::string getCppStackType(bool specifyNamespaces = true) const;
8179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
8279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    std::string getCppResultType(bool specifyNamespaces = true) const;
8379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
8479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    std::string getCppArgumentType(bool specifyNamespaces = true) const;
8579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
8679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    // For an array type, dimensionality information will be accumulated at the
8779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    // end of the returned string.
8879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    // if forInitializer == true, actual dimensions are included, i.e. [3][5],
8979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    // otherwise (and by default), they are omitted, i.e. [][].
9079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual std::string getJavaType(bool forInitializer = false) const;
9179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
9279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual std::string getJavaWrapperType() const;
9379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual std::string getJavaSuffix() const;
9479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
9579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual std::string getVtsType() const;
9679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
9779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    enum ErrorMode {
9879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ        ErrorMode_Ignore,
9979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ        ErrorMode_Goto,
10079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ        ErrorMode_Break,
10179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ        ErrorMode_Return,
10279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    };
10379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual void emitReaderWriter(
10479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            Formatter &out,
10579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            const std::string &name,
10679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            const std::string &parcelObj,
10779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            bool parcelObjIsPointer,
10879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            bool isReader,
10979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            ErrorMode mode) const;
11079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
11179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual void emitReaderWriterEmbedded(
11279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            Formatter &out,
11379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            size_t depth,
11479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            const std::string &name,
11579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            const std::string &sanitizedName,
11679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            bool nameIsPointer,
11779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            const std::string &parcelObj,
11879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            bool parcelObjIsPointer,
11979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            bool isReader,
12079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            ErrorMode mode,
12179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            const std::string &parentName,
12279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            const std::string &offsetText) const;
12379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
12479cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual void emitResolveReferences(
12579cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            Formatter &out,
12679cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            const std::string &name,
12779cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            bool nameIsPointer,
12879cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            const std::string &parcelObj,
12979cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            bool parcelObjIsPointer,
13079cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            bool isReader,
13179cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ            ErrorMode mode) const;
13279cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ
13379cbafeef403892b20a115def409c1c479652b97Maximilien CRUZ    virtual void emitResolveReferencesEmbedded(
1346812b09145d85180c90e38a74bdf7d3d414ef1e9Maximilien CRUZ            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 bool useParentInEmitResolveReferencesEmbedded() const;
147
148    virtual bool useNameInEmitReaderWriterEmbedded(bool isReader) const;
149
150    virtual void emitJavaReaderWriter(
151            Formatter &out,
152            const std::string &parcelObj,
153            const std::string &argName,
154            bool isReader) const;
155
156    virtual void emitJavaFieldInitializer(
157            Formatter &out,
158            const std::string &fieldName) const;
159
160    virtual void emitJavaFieldReaderWriter(
161            Formatter &out,
162            size_t depth,
163            const std::string &parcelName,
164            const std::string &blobName,
165            const std::string &fieldName,
166            const std::string &offset,
167            bool isReader) const;
168
169    virtual status_t emitTypeDeclarations(Formatter &out) const;
170
171    // Emit any declarations pertaining to this type that have to be
172    // at global scope, i.e. enum class operators.
173    virtual status_t emitGlobalTypeDeclarations(Formatter &out) const;
174
175    // Emit any declarations pertaining to this type that have to be
176    // at global scope for transport, e.g. read/writeEmbeddedTo/FromParcel
177    virtual status_t emitGlobalHwDeclarations(Formatter &out) const;
178
179    virtual status_t emitTypeDefinitions(
180            Formatter &out, const std::string prefix) const;
181
182    virtual status_t emitJavaTypeDeclarations(
183            Formatter &out, bool atTopLevel) const;
184
185    virtual bool needsEmbeddedReadWrite() const;
186    virtual bool needsResolveReferences() const;
187    virtual bool resultNeedsDeref() const;
188
189    // Generates type declaration for vts proto file.
190    // TODO (b/30844146): make it a pure virtual method.
191    virtual status_t emitVtsTypeDeclarations(Formatter &out) const;
192    // Generates type declaration as attribute of method (return value or method
193    // argument) or attribute of compound type for vts proto file.
194    virtual status_t emitVtsAttributeType(Formatter &out) const;
195
196    // Returns true iff this type is supported through the Java backend.
197    virtual bool isJavaCompatible() const;
198
199    virtual void getAlignmentAndSize(size_t *align, size_t *size) const;
200
201    void setAnnotations(std::vector<Annotation *> *annotations);
202    const std::vector<Annotation *> &annotations() const;
203
204    virtual void appendToExportedTypesVector(
205            std::vector<const Type *> *exportedTypes) const;
206
207    virtual status_t emitExportedHeader(Formatter &out, bool forJava) const;
208
209protected:
210    void handleError(Formatter &out, ErrorMode mode) const;
211    void handleError2(Formatter &out, ErrorMode mode) const;
212
213    void emitReaderWriterEmbeddedForTypeName(
214            Formatter &out,
215            const std::string &name,
216            bool nameIsPointer,
217            const std::string &parcelObj,
218            bool parcelObjIsPointer,
219            bool isReader,
220            ErrorMode mode,
221            const std::string &parentName,
222            const std::string &offsetText,
223            const std::string &typeName,
224            const std::string &childName,
225            const std::string &funcNamespace) const;
226
227    void emitJavaReaderWriterWithSuffix(
228            Formatter &out,
229            const std::string &parcelObj,
230            const std::string &argName,
231            bool isReader,
232            const std::string &suffix,
233            const std::string &extra) const;
234
235private:
236    std::vector<Annotation *> *mAnnotations;
237
238    DISALLOW_COPY_AND_ASSIGN(Type);
239};
240
241/* Base type for VectorType and RefType. */
242struct TemplatedType : public Type {
243    void setElementType(Type *elementType);
244protected:
245    TemplatedType();
246    Type *mElementType;
247private:
248    DISALLOW_COPY_AND_ASSIGN(TemplatedType);
249};
250
251}  // namespace android
252
253#endif  // TYPE_H_
254
255