1ca0551cfSopenharmony_ci/*
2ca0551cfSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3ca0551cfSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ca0551cfSopenharmony_ci * you may not use this file except in compliance with the License.
5ca0551cfSopenharmony_ci * You may obtain a copy of the License at
6ca0551cfSopenharmony_ci *
7ca0551cfSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8ca0551cfSopenharmony_ci *
9ca0551cfSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ca0551cfSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ca0551cfSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ca0551cfSopenharmony_ci * See the License for the specific language governing permissions and
13ca0551cfSopenharmony_ci * limitations under the License.
14ca0551cfSopenharmony_ci */
15ca0551cfSopenharmony_ci
16ca0551cfSopenharmony_ci#ifndef OHOS_IDL_AST_H
17ca0551cfSopenharmony_ci#define OHOS_IDL_AST_H
18ca0551cfSopenharmony_ci
19ca0551cfSopenharmony_ci#include <unordered_map>
20ca0551cfSopenharmony_ci#include <vector>
21ca0551cfSopenharmony_ci
22ca0551cfSopenharmony_ci#include "ast/ast_void_type.h"
23ca0551cfSopenharmony_ci#include "ast/ast_array_type.h"
24ca0551cfSopenharmony_ci#include "ast/base/ast_boolean_type.h"
25ca0551cfSopenharmony_ci#include "ast/ast_native_buffer_type.h"
26ca0551cfSopenharmony_ci#include "ast/base/ast_byte_type.h"
27ca0551cfSopenharmony_ci#include "ast/base/ast_double_type.h"
28ca0551cfSopenharmony_ci#include "ast/ast_enum_type.h"
29ca0551cfSopenharmony_ci#include "ast/ast_fd_type.h"
30ca0551cfSopenharmony_ci#include "ast/base/ast_float_type.h"
31ca0551cfSopenharmony_ci#include "ast/base/ast_integer_type.h"
32ca0551cfSopenharmony_ci#include "ast/ast_interface_type.h"
33ca0551cfSopenharmony_ci#include "ast/base/ast_long_type.h"
34ca0551cfSopenharmony_ci#include "ast/ast_map_type.h"
35ca0551cfSopenharmony_ci#include "ast/ast_namespace.h"
36ca0551cfSopenharmony_ci#include "ast/ast_node.h"
37ca0551cfSopenharmony_ci#include "ast/ast_pointer_type.h"
38ca0551cfSopenharmony_ci#include "ast/ast_sequenceable_type.h"
39ca0551cfSopenharmony_ci#include "ast/base/ast_short_type.h"
40ca0551cfSopenharmony_ci#include "ast/ast_smq_type.h"
41ca0551cfSopenharmony_ci#include "ast/base/ast_string_type.h"
42ca0551cfSopenharmony_ci#include "ast/base/ast_string16_type.h"
43ca0551cfSopenharmony_ci#include "ast/ast_struct_type.h"
44ca0551cfSopenharmony_ci#include "ast/base/ast_char_type.h"
45ca0551cfSopenharmony_ci#include "ast/base/ast_uchar_type.h"
46ca0551cfSopenharmony_ci#include "ast/base/ast_uint_type.h"
47ca0551cfSopenharmony_ci#include "ast/base/ast_ulong_type.h"
48ca0551cfSopenharmony_ci#include "ast/ast_union_type.h"
49ca0551cfSopenharmony_ci#include "ast/base/ast_ushort_type.h"
50ca0551cfSopenharmony_ci#include "util/autoptr.h"
51ca0551cfSopenharmony_ci
52ca0551cfSopenharmony_cinamespace OHOS {
53ca0551cfSopenharmony_cinamespace Idl {
54ca0551cfSopenharmony_cienum class ASTFileType {
55ca0551cfSopenharmony_ci    AST_IFACE,        // this idl file contains class of normal interface
56ca0551cfSopenharmony_ci    AST_CALL_IFACE,   // this idl file contains class of interface that as parameter
57ca0551cfSopenharmony_ci    AST_ICALLBACK,    // this idl file contains class of callback interface
58ca0551cfSopenharmony_ci    AST_TYPES,        // this idl file contains custom types
59ca0551cfSopenharmony_ci    AST_SEQUENCEABLE, // this is not an idl file, but a c++/java file
60ca0551cfSopenharmony_ci};
61ca0551cfSopenharmony_ci
62ca0551cfSopenharmony_ciclass AST : public ASTNode {
63ca0551cfSopenharmony_cipublic:
64ca0551cfSopenharmony_ci    using StrASTMap = std::unordered_map<std::string, AutoPtr<AST>>;
65ca0551cfSopenharmony_ci    using TypeStringMap = std::unordered_map<std::string, AutoPtr<ASTType>>;
66ca0551cfSopenharmony_ci
67ca0551cfSopenharmony_ci    ~AST() override = default;
68ca0551cfSopenharmony_ci
69ca0551cfSopenharmony_ci    void SetAStFileType(ASTFileType fileType)
70ca0551cfSopenharmony_ci    {
71ca0551cfSopenharmony_ci        astFileType_ = fileType;
72ca0551cfSopenharmony_ci    }
73ca0551cfSopenharmony_ci
74ca0551cfSopenharmony_ci    ASTFileType GetASTFileType() const
75ca0551cfSopenharmony_ci    {
76ca0551cfSopenharmony_ci        return astFileType_;
77ca0551cfSopenharmony_ci    }
78ca0551cfSopenharmony_ci
79ca0551cfSopenharmony_ci    void SetIdlFile(const std::string &idlFile);
80ca0551cfSopenharmony_ci
81ca0551cfSopenharmony_ci    inline std::string GetName()
82ca0551cfSopenharmony_ci    {
83ca0551cfSopenharmony_ci        return name_;
84ca0551cfSopenharmony_ci    }
85ca0551cfSopenharmony_ci
86ca0551cfSopenharmony_ci    void SetFullName(const std::string &fullName);
87ca0551cfSopenharmony_ci
88ca0551cfSopenharmony_ci    inline std::string GetFullName()
89ca0551cfSopenharmony_ci    {
90ca0551cfSopenharmony_ci        return packageName_ + "." + name_;
91ca0551cfSopenharmony_ci    }
92ca0551cfSopenharmony_ci
93ca0551cfSopenharmony_ci    inline std::string GetPackageName() const
94ca0551cfSopenharmony_ci    {
95ca0551cfSopenharmony_ci        return packageName_;
96ca0551cfSopenharmony_ci    }
97ca0551cfSopenharmony_ci
98ca0551cfSopenharmony_ci    inline void SetLicense(const std::string &license)
99ca0551cfSopenharmony_ci    {
100ca0551cfSopenharmony_ci        license_ = license;
101ca0551cfSopenharmony_ci    }
102ca0551cfSopenharmony_ci
103ca0551cfSopenharmony_ci    inline std::string GetLicense()
104ca0551cfSopenharmony_ci    {
105ca0551cfSopenharmony_ci        return license_;
106ca0551cfSopenharmony_ci    }
107ca0551cfSopenharmony_ci
108ca0551cfSopenharmony_ci    void SetPackageName(const std::string &packageName);
109ca0551cfSopenharmony_ci
110ca0551cfSopenharmony_ci    AutoPtr<ASTNamespace> ParseNamespace(const std::string &nspaceStr);
111ca0551cfSopenharmony_ci
112ca0551cfSopenharmony_ci    void AddNamespace(const AutoPtr<ASTNamespace> &nspace);
113ca0551cfSopenharmony_ci
114ca0551cfSopenharmony_ci    AutoPtr<ASTNamespace> FindNamespace(const std::string &nspaceStr);
115ca0551cfSopenharmony_ci
116ca0551cfSopenharmony_ci    AutoPtr<ASTNamespace> GetNamespace(size_t index);
117ca0551cfSopenharmony_ci
118ca0551cfSopenharmony_ci    inline std::vector<AutoPtr<ASTNamespace>> GetNamespace()
119ca0551cfSopenharmony_ci    {
120ca0551cfSopenharmony_ci        return namespaces_;
121ca0551cfSopenharmony_ci    }
122ca0551cfSopenharmony_ci
123ca0551cfSopenharmony_ci    inline size_t GetNamespaceNumber()
124ca0551cfSopenharmony_ci    {
125ca0551cfSopenharmony_ci        return namespaces_.size();
126ca0551cfSopenharmony_ci    }
127ca0551cfSopenharmony_ci
128ca0551cfSopenharmony_ci    void AddInterfaceDef(const AutoPtr<ASTInterfaceType> &interface);
129ca0551cfSopenharmony_ci
130ca0551cfSopenharmony_ci    AutoPtr<ASTInterfaceType> GetInterfaceDef(size_t index = 0);
131ca0551cfSopenharmony_ci
132ca0551cfSopenharmony_ci    inline size_t GetInterfaceDefNumber() const
133ca0551cfSopenharmony_ci    {
134ca0551cfSopenharmony_ci        return interfaceDefs_.size();
135ca0551cfSopenharmony_ci    }
136ca0551cfSopenharmony_ci
137ca0551cfSopenharmony_ci    void AddSequenceableDef(const AutoPtr<ASTSequenceableType> &sequenceable);
138ca0551cfSopenharmony_ci
139ca0551cfSopenharmony_ci    AutoPtr<ASTSequenceableType> GetSequenceableDef(size_t index = 0);
140ca0551cfSopenharmony_ci
141ca0551cfSopenharmony_ci    inline size_t GetSequenceableDefNumber() const
142ca0551cfSopenharmony_ci    {
143ca0551cfSopenharmony_ci        return sequenceableDefs_.size();
144ca0551cfSopenharmony_ci    }
145ca0551cfSopenharmony_ci
146ca0551cfSopenharmony_ci    int IndexOf(ASTInterfaceType* interface);
147ca0551cfSopenharmony_ci
148ca0551cfSopenharmony_ci    int IndexOf(ASTSequenceableType* sequenceable);
149ca0551cfSopenharmony_ci
150ca0551cfSopenharmony_ci    int IndexOf(ASTType* type);
151ca0551cfSopenharmony_ci
152ca0551cfSopenharmony_ci    void AddType(const AutoPtr<ASTType> &type);
153ca0551cfSopenharmony_ci
154ca0551cfSopenharmony_ci    AutoPtr<ASTType> FindType(const std::string &typeName, bool lookImports = true);
155ca0551cfSopenharmony_ci
156ca0551cfSopenharmony_ci    inline const TypeStringMap &GetTypes() const
157ca0551cfSopenharmony_ci    {
158ca0551cfSopenharmony_ci        return types_;
159ca0551cfSopenharmony_ci    }
160ca0551cfSopenharmony_ci
161ca0551cfSopenharmony_ci    inline size_t GetTypeNumber() const
162ca0551cfSopenharmony_ci    {
163ca0551cfSopenharmony_ci        return types_.size();
164ca0551cfSopenharmony_ci    }
165ca0551cfSopenharmony_ci
166ca0551cfSopenharmony_ci    void AddTypeDefinition(const AutoPtr<ASTType> &type);
167ca0551cfSopenharmony_ci
168ca0551cfSopenharmony_ci    inline size_t GetTypeDefinitionNumber() const
169ca0551cfSopenharmony_ci    {
170ca0551cfSopenharmony_ci        return typeDefinitions_.size();
171ca0551cfSopenharmony_ci    }
172ca0551cfSopenharmony_ci
173ca0551cfSopenharmony_ci    AutoPtr<ASTType> GetTypeDefintion(size_t index);
174ca0551cfSopenharmony_ci
175ca0551cfSopenharmony_ci    std::string Dump(const std::string &prefix) override;
176ca0551cfSopenharmony_ci
177ca0551cfSopenharmony_ci    bool AddImport(const AutoPtr<AST> &importAst);
178ca0551cfSopenharmony_ci
179ca0551cfSopenharmony_ci    void ClearImport()
180ca0551cfSopenharmony_ci    {
181ca0551cfSopenharmony_ci        return imports_.clear();
182ca0551cfSopenharmony_ci    }
183ca0551cfSopenharmony_ci
184ca0551cfSopenharmony_ci    inline const StrASTMap &GetImports() const
185ca0551cfSopenharmony_ci    {
186ca0551cfSopenharmony_ci        return imports_;
187ca0551cfSopenharmony_ci    }
188ca0551cfSopenharmony_ci
189ca0551cfSopenharmony_ci    void SetVersion(size_t &majorVer, size_t &minorVer);
190ca0551cfSopenharmony_ci
191ca0551cfSopenharmony_ci    inline size_t GetMajorVer() const
192ca0551cfSopenharmony_ci    {
193ca0551cfSopenharmony_ci        return majorVersion_;
194ca0551cfSopenharmony_ci    }
195ca0551cfSopenharmony_ci
196ca0551cfSopenharmony_ci    inline size_t GetMinorVer() const
197ca0551cfSopenharmony_ci    {
198ca0551cfSopenharmony_ci        return minorVersion_;
199ca0551cfSopenharmony_ci    }
200ca0551cfSopenharmony_ci
201ca0551cfSopenharmony_ci    std::string GetVersion() const
202ca0551cfSopenharmony_ci    {
203ca0551cfSopenharmony_ci        return StringHelper::Format("%u.%u", majorVersion_, minorVersion_);
204ca0551cfSopenharmony_ci    }
205ca0551cfSopenharmony_ci
206ca0551cfSopenharmony_ci    inline std::string GetIdlFilePath()
207ca0551cfSopenharmony_ci    {
208ca0551cfSopenharmony_ci        return idlFilePath_;
209ca0551cfSopenharmony_ci    }
210ca0551cfSopenharmony_ci
211ca0551cfSopenharmony_ci    bool IsValid();
212ca0551cfSopenharmony_ci    std::vector<AutoPtr<ASTInterfaceType>> GetInterfaceDefs() const
213ca0551cfSopenharmony_ci    {
214ca0551cfSopenharmony_ci        return interfaceDefs_;
215ca0551cfSopenharmony_ci    }
216ca0551cfSopenharmony_ci
217ca0551cfSopenharmony_ci    bool GetHasCacheableProxyMethods() const
218ca0551cfSopenharmony_ci    {
219ca0551cfSopenharmony_ci        return hasCacheableProxyMethods_;
220ca0551cfSopenharmony_ci    }
221ca0551cfSopenharmony_ci
222ca0551cfSopenharmony_ci    void SetHasCacheableProxyMethods(bool cacheable)
223ca0551cfSopenharmony_ci    {
224ca0551cfSopenharmony_ci        hasCacheableProxyMethods_ = cacheable;
225ca0551cfSopenharmony_ci    }
226ca0551cfSopenharmony_ci
227ca0551cfSopenharmony_ci    inline void SetInterfaceToken(std::string &interfaceToken)
228ca0551cfSopenharmony_ci    {
229ca0551cfSopenharmony_ci        interfaceToken_ = interfaceToken;
230ca0551cfSopenharmony_ci    }
231ca0551cfSopenharmony_ci
232ca0551cfSopenharmony_ci    inline std::string GetInterfaceToken() const
233ca0551cfSopenharmony_ci    {
234ca0551cfSopenharmony_ci        return interfaceToken_;
235ca0551cfSopenharmony_ci    }
236ca0551cfSopenharmony_ci
237ca0551cfSopenharmony_ci    inline void SetSupportDelegator(std::string &supportDelegator)
238ca0551cfSopenharmony_ci    {
239ca0551cfSopenharmony_ci        if (supportDelegator == "on") {
240ca0551cfSopenharmony_ci            supportDelegatorOn_ = true;
241ca0551cfSopenharmony_ci        } else {
242ca0551cfSopenharmony_ci            supportDelegatorOn_ = false;
243ca0551cfSopenharmony_ci        }
244ca0551cfSopenharmony_ci    }
245ca0551cfSopenharmony_ci
246ca0551cfSopenharmony_ci    inline bool GetSupportDelegatorOn() const
247ca0551cfSopenharmony_ci    {
248ca0551cfSopenharmony_ci        return supportDelegatorOn_;
249ca0551cfSopenharmony_ci    }
250ca0551cfSopenharmony_ci
251ca0551cfSopenharmony_ciprivate:
252ca0551cfSopenharmony_ci    AutoPtr<ASTNamespace> NewNameSpace(std::string nameSpace);
253ca0551cfSopenharmony_ci
254ca0551cfSopenharmony_ci    ASTFileType astFileType_ = ASTFileType::AST_IFACE;
255ca0551cfSopenharmony_ci    std::string name_;
256ca0551cfSopenharmony_ci    std::string license_;
257ca0551cfSopenharmony_ci    std::string packageName_;
258ca0551cfSopenharmony_ci    size_t majorVersion_;
259ca0551cfSopenharmony_ci    size_t minorVersion_;
260ca0551cfSopenharmony_ci    std::vector<AutoPtr<ASTNamespace>> namespaces_;
261ca0551cfSopenharmony_ci    std::vector<AutoPtr<ASTType>> typeDefinitions_; // enum, struct, union
262ca0551cfSopenharmony_ci    std::vector<AutoPtr<ASTSequenceableType>> sequenceableDefs_;
263ca0551cfSopenharmony_ci    std::vector<AutoPtr<ASTInterfaceType>> interfaceDefs_;
264ca0551cfSopenharmony_ci
265ca0551cfSopenharmony_ci    StrASTMap imports_;
266ca0551cfSopenharmony_ci    TypeStringMap types_;
267ca0551cfSopenharmony_ci
268ca0551cfSopenharmony_ci    static TypeStringMap basicTypes_;
269ca0551cfSopenharmony_ci
270ca0551cfSopenharmony_ci    std::string idlFilePath_;
271ca0551cfSopenharmony_ci    bool hasCacheableProxyMethods_ = false;
272ca0551cfSopenharmony_ci    std::string interfaceToken_;
273ca0551cfSopenharmony_ci    bool supportDelegatorOn_ = false;
274ca0551cfSopenharmony_ci};
275ca0551cfSopenharmony_ci} // namespace Idl
276ca0551cfSopenharmony_ci} // namespace OHOS
277ca0551cfSopenharmony_ci
278ca0551cfSopenharmony_ci#endif // OHOS_IDL_AST_H