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_DEF_H_
18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
19c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#define TYPE_DEF_H_
20c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
21d537ab02e1707597d70665fd8c75ca1ec9f57326Steven Moreland#include "NamedType.h"
22c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
23c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
24c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
25d537ab02e1707597d70665fd8c75ca1ec9f57326Steven Morelandstruct TypeDef : public NamedType {
26565b0137b2ad0e8e239d38e92c025f096de62f2dTimur Iskhakov    TypeDef(const char* localName, const FQName& fullName, const Location& location, Scope* parent,
27505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov            const Reference<Type>& type);
28c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
29737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    const ScalarType *resolveToScalarType() const override;
30737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
310ecc7b8aca24a5618512610bb6371bdb91b5fdc2Steven Moreland    std::string typeName() const override;
320ecc7b8aca24a5618512610bb6371bdb91b5fdc2Steven Moreland
3324e605b5194d969a1558d94896d69cc554881e46Timur Iskhakov    Type* referencedType();
3424e605b5194d969a1558d94896d69cc554881e46Timur Iskhakov    const Type* referencedType() const;
35c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
365a545440766886a1bbd09ed7221bb337705e5d14Andreas Huber    bool isInterface() const override;
378d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    bool isEnum() const override;
388d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    bool isTypeDef() const override;
39bb797e4ba03e95cd0b20aa77b83717dcf8cc6287Andreas Huber    bool needsEmbeddedReadWrite() const override;
40bb797e4ba03e95cd0b20aa77b83717dcf8cc6287Andreas Huber    bool resultNeedsDeref() const override;
41bb797e4ba03e95cd0b20aa77b83717dcf8cc6287Andreas Huber
42dbaed3317411232962d25666de60799b4dcfce98Timur Iskhakov    const Type* resolve() const override;
43dbaed3317411232962d25666de60799b4dcfce98Timur Iskhakov
44542920e68eec3712d6be250eb3dcaa7907ea05edTimur Iskhakov    std::vector<const Reference<Type>*> getReferences() const override;
45542920e68eec3712d6be250eb3dcaa7907ea05edTimur Iskhakov
46368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland    void emitTypeDeclarations(Formatter& out) const override;
472a55e05a26aa8e84433eb6c3e06175ccf45d4e92Steven Moreland
48505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov   private:
49505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov    Reference<Type> mReferencedType;
50c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
51c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    DISALLOW_COPY_AND_ASSIGN(TypeDef);
52c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber};
53c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
54c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
55c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
56c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif  // TYPE_DEF_H_
57c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
58