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