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_PARSER_H 17ca0551cfSopenharmony_ci#define OHOS_IDL_PARSER_H 18ca0551cfSopenharmony_ci 19ca0551cfSopenharmony_ci#include <memory> 20ca0551cfSopenharmony_ci#include <set> 21ca0551cfSopenharmony_ci#include <vector> 22ca0551cfSopenharmony_ci 23ca0551cfSopenharmony_ci#include "ast/ast.h" 24ca0551cfSopenharmony_ci#include "ast/ast_attribute.h" 25ca0551cfSopenharmony_ci#include "ast/ast_interface_type.h" 26ca0551cfSopenharmony_ci#include "ast/ast_method.h" 27ca0551cfSopenharmony_ci#include "ast/ast_type.h" 28ca0551cfSopenharmony_ci#include "lexer/lexer.h" 29ca0551cfSopenharmony_ci#include "preprocessor/preprocessor.h" 30ca0551cfSopenharmony_ci#include "util/autoptr.h" 31ca0551cfSopenharmony_ci#include "util/light_refcount_base.h" 32ca0551cfSopenharmony_ci#include "util/options.h" 33ca0551cfSopenharmony_ci#include "parser/intf_type_check.h" 34ca0551cfSopenharmony_ci 35ca0551cfSopenharmony_cinamespace OHOS { 36ca0551cfSopenharmony_cinamespace Idl { 37ca0551cfSopenharmony_ciusing AttrSet = std::set<Token, TokenTypeCompare>; 38ca0551cfSopenharmony_cistruct AstCompare { 39ca0551cfSopenharmony_ci bool operator()(const AutoPtr<AST> &lhs, const AutoPtr<AST> &rhs) const 40ca0551cfSopenharmony_ci { 41ca0551cfSopenharmony_ci return lhs->GetMinorVer() < rhs->GetMinorVer(); 42ca0551cfSopenharmony_ci } 43ca0551cfSopenharmony_ci}; 44ca0551cfSopenharmony_ciusing AstMergeMap = std::map<std::string, std::set<AutoPtr<AST>, AstCompare>>; 45ca0551cfSopenharmony_ciclass Parser { 46ca0551cfSopenharmony_cipublic: 47ca0551cfSopenharmony_ci Parser() = default; 48ca0551cfSopenharmony_ci 49ca0551cfSopenharmony_ci ~Parser() = default; 50ca0551cfSopenharmony_ci 51ca0551cfSopenharmony_ci bool Parse(const std::vector<FileDetail> &fileDetails); 52ca0551cfSopenharmony_ci 53ca0551cfSopenharmony_ci using StrAstMap = std::unordered_map<std::string, AutoPtr<AST>>; 54ca0551cfSopenharmony_ci inline const StrAstMap &GetAllAst() const 55ca0551cfSopenharmony_ci { 56ca0551cfSopenharmony_ci return allAsts_; 57ca0551cfSopenharmony_ci } 58ca0551cfSopenharmony_ci 59ca0551cfSopenharmony_ciprivate: 60ca0551cfSopenharmony_ci class Attribute : public LightRefCountBase { 61ca0551cfSopenharmony_ci public: 62ca0551cfSopenharmony_ci bool isOneWay = false; 63ca0551cfSopenharmony_ci bool isCallback = false; 64ca0551cfSopenharmony_ci bool isFull = false; 65ca0551cfSopenharmony_ci bool isLite = false; 66ca0551cfSopenharmony_ci }; 67ca0551cfSopenharmony_ci 68ca0551cfSopenharmony_ci bool ParseOne(const std::string &sourceFile); 69ca0551cfSopenharmony_ci 70ca0551cfSopenharmony_ci bool Reset(const std::string &sourceFile); 71ca0551cfSopenharmony_ci 72ca0551cfSopenharmony_ci bool ParseFile(); 73ca0551cfSopenharmony_ci 74ca0551cfSopenharmony_ci std::string ParseLicense(); 75ca0551cfSopenharmony_ci 76ca0551cfSopenharmony_ci bool ParsePackage(); 77ca0551cfSopenharmony_ci 78ca0551cfSopenharmony_ci bool ParseInterfaceToken(); 79ca0551cfSopenharmony_ci 80ca0551cfSopenharmony_ci bool ParseSupportDelegator(); 81ca0551cfSopenharmony_ci 82ca0551cfSopenharmony_ci bool ParserPackageInfo(const std::string &packageName); 83ca0551cfSopenharmony_ci 84ca0551cfSopenharmony_ci bool ParseImports(); 85ca0551cfSopenharmony_ci 86ca0551cfSopenharmony_ci void ParseImportInfo(); 87ca0551cfSopenharmony_ci 88ca0551cfSopenharmony_ci void ParseSequenceableInfo(); 89ca0551cfSopenharmony_ci 90ca0551cfSopenharmony_ci bool ParseTypeDecls(); 91ca0551cfSopenharmony_ci 92ca0551cfSopenharmony_ci // parse attributes of type 93ca0551cfSopenharmony_ci void ParseAttribute(); 94ca0551cfSopenharmony_ci 95ca0551cfSopenharmony_ci AttrSet ParseAttributeInfo(); 96ca0551cfSopenharmony_ci 97ca0551cfSopenharmony_ci bool ParseAttrUnit(AttrSet &attrs); 98ca0551cfSopenharmony_ci 99ca0551cfSopenharmony_ci void ParseAttrUnitFreezecontrol(AttrSet &attrs, Token &token); 100ca0551cfSopenharmony_ci 101ca0551cfSopenharmony_ci // parse interface type 102ca0551cfSopenharmony_ci void ParseInterface(const AttrSet &attrs = {}); 103ca0551cfSopenharmony_ci 104ca0551cfSopenharmony_ci AutoPtr<ASTAttr> ParseInfAttrInfo(const AttrSet &attrs); 105ca0551cfSopenharmony_ci 106ca0551cfSopenharmony_ci void CheckInterfaceAttr(const AutoPtr<ASTInterfaceType> &interface, Token token); 107ca0551cfSopenharmony_ci 108ca0551cfSopenharmony_ci void ParseInterfaceExternal(const AutoPtr<ASTInterfaceType> &interface); 109ca0551cfSopenharmony_ci 110ca0551cfSopenharmony_ci void ParseInterfaceBody(const AutoPtr<ASTInterfaceType> &interface); 111ca0551cfSopenharmony_ci 112ca0551cfSopenharmony_ci AutoPtr<ASTMethod> ParseMethod(const AutoPtr<ASTInterfaceType> &interface); 113ca0551cfSopenharmony_ci 114ca0551cfSopenharmony_ci AutoPtr<ASTType> ParseMethodReturnType(); 115ca0551cfSopenharmony_ci 116ca0551cfSopenharmony_ci AutoPtr<ASTAttr> ParseMethodAttr(); 117ca0551cfSopenharmony_ci 118ca0551cfSopenharmony_ci AutoPtr<ASTMethod> CreateGetVersionMethod(); 119ca0551cfSopenharmony_ci 120ca0551cfSopenharmony_ci void CheckMethodAttr(const AutoPtr<ASTInterfaceType> &interface, const AutoPtr<ASTMethod> &method); 121ca0551cfSopenharmony_ci 122ca0551cfSopenharmony_ci void ParseMethodParamList(const AutoPtr<ASTMethod> &method); 123ca0551cfSopenharmony_ci 124ca0551cfSopenharmony_ci AutoPtr<ASTParameter> ParseParam(); 125ca0551cfSopenharmony_ci 126ca0551cfSopenharmony_ci bool CheckParamAttr(); 127ca0551cfSopenharmony_ci 128ca0551cfSopenharmony_ci void SetParamAttrVal(Token token, AutoPtr<ASTParamAttr> attr); 129ca0551cfSopenharmony_ci 130ca0551cfSopenharmony_ci AutoPtr<ASTParamAttr> ParseParamAttr(); 131ca0551cfSopenharmony_ci 132ca0551cfSopenharmony_ci // parse type 133ca0551cfSopenharmony_ci AutoPtr<ASTType> ParseType(); 134ca0551cfSopenharmony_ci 135ca0551cfSopenharmony_ci bool CheckBasicType(Token token); 136ca0551cfSopenharmony_ci 137ca0551cfSopenharmony_ci AutoPtr<ASTType> ParseBasicType(); 138ca0551cfSopenharmony_ci 139ca0551cfSopenharmony_ci AutoPtr<ASTType> ParseUnsignedType(); 140ca0551cfSopenharmony_ci 141ca0551cfSopenharmony_ci AutoPtr<ASTType> ParseArrayType(const AutoPtr<ASTType> &elementType); 142ca0551cfSopenharmony_ci 143ca0551cfSopenharmony_ci AutoPtr<ASTType> ParseListType(); 144ca0551cfSopenharmony_ci 145ca0551cfSopenharmony_ci AutoPtr<ASTType> ParseMapType(); 146ca0551cfSopenharmony_ci 147ca0551cfSopenharmony_ci AutoPtr<ASTType> ParseSmqType(); 148ca0551cfSopenharmony_ci 149ca0551cfSopenharmony_ci bool CheckUserDefType(Token token); 150ca0551cfSopenharmony_ci 151ca0551cfSopenharmony_ci AutoPtr<ASTType> ParseUserDefType(); 152ca0551cfSopenharmony_ci 153ca0551cfSopenharmony_ci // parse declaration of enum 154ca0551cfSopenharmony_ci void ParseEnumDeclaration(const AttrSet &attrs = {}); 155ca0551cfSopenharmony_ci 156ca0551cfSopenharmony_ci AutoPtr<ASTType> ParseEnumBaseType(); 157ca0551cfSopenharmony_ci 158ca0551cfSopenharmony_ci void ParserEnumMember(const AutoPtr<ASTEnumType> &enumType); 159ca0551cfSopenharmony_ci 160ca0551cfSopenharmony_ci // parse declaration of struct 161ca0551cfSopenharmony_ci void ParseStructDeclaration(const AttrSet &attrs = {}); 162ca0551cfSopenharmony_ci 163ca0551cfSopenharmony_ci AutoPtr<ASTStructType> ParseStructParentType(); 164ca0551cfSopenharmony_ci 165ca0551cfSopenharmony_ci void ParseStructMember(const AutoPtr<ASTStructType> &structType); 166ca0551cfSopenharmony_ci 167ca0551cfSopenharmony_ci // parse declaration of union 168ca0551cfSopenharmony_ci void ParseUnionDeclaration(const AttrSet &attrs = {}); 169ca0551cfSopenharmony_ci 170ca0551cfSopenharmony_ci void ParseUnionMember(const AutoPtr<ASTUnionType> &unionType); 171ca0551cfSopenharmony_ci 172ca0551cfSopenharmony_ci bool AddUnionMember( 173ca0551cfSopenharmony_ci const AutoPtr<ASTUnionType> &unionType, const AutoPtr<ASTType> &type, const std::string &name) const; 174ca0551cfSopenharmony_ci 175ca0551cfSopenharmony_ci AutoPtr<ASTAttr> ParseUserDefTypeAttr(const AttrSet &attrs); 176ca0551cfSopenharmony_ci 177ca0551cfSopenharmony_ci // parse expression 178ca0551cfSopenharmony_ci AutoPtr<ASTExpr> ParseExpr(); 179ca0551cfSopenharmony_ci 180ca0551cfSopenharmony_ci AutoPtr<ASTExpr> ParseAndExpr(); 181ca0551cfSopenharmony_ci 182ca0551cfSopenharmony_ci AutoPtr<ASTExpr> ParseXorExpr(); 183ca0551cfSopenharmony_ci 184ca0551cfSopenharmony_ci AutoPtr<ASTExpr> ParseOrExpr(); 185ca0551cfSopenharmony_ci 186ca0551cfSopenharmony_ci AutoPtr<ASTExpr> ParseShiftExpr(); 187ca0551cfSopenharmony_ci 188ca0551cfSopenharmony_ci AutoPtr<ASTExpr> ParseAddExpr(); 189ca0551cfSopenharmony_ci 190ca0551cfSopenharmony_ci AutoPtr<ASTExpr> ParseMulExpr(); 191ca0551cfSopenharmony_ci 192ca0551cfSopenharmony_ci AutoPtr<ASTExpr> ParseUnaryExpr(); 193ca0551cfSopenharmony_ci 194ca0551cfSopenharmony_ci AutoPtr<ASTExpr> ParsePrimaryExpr(); 195ca0551cfSopenharmony_ci 196ca0551cfSopenharmony_ci AutoPtr<ASTExpr> ParseNumExpr(); 197ca0551cfSopenharmony_ci 198ca0551cfSopenharmony_ci AutoPtr<ASTExpr> ParseEnumExpr(); 199ca0551cfSopenharmony_ci 200ca0551cfSopenharmony_ci bool CheckNumber(const std::string& integerVal) const; 201ca0551cfSopenharmony_ci 202ca0551cfSopenharmony_ci bool CheckType(const Token &token, const AutoPtr<ASTType> &type); 203ca0551cfSopenharmony_ci 204ca0551cfSopenharmony_ci bool CheckTypeByMode(const Token &token, const AutoPtr<ASTType> &type); 205ca0551cfSopenharmony_ci 206ca0551cfSopenharmony_ci void SetAstFileType(); 207ca0551cfSopenharmony_ci 208ca0551cfSopenharmony_ci bool CheckPackageName(const std::string &filePath, const std::string &packageName) const; 209ca0551cfSopenharmony_ci 210ca0551cfSopenharmony_ci bool CheckImport(const std::string &importName); 211ca0551cfSopenharmony_ci 212ca0551cfSopenharmony_ci void ParseInterfaceExtends(AutoPtr<ASTInterfaceType> &interface); 213ca0551cfSopenharmony_ci 214ca0551cfSopenharmony_ci void ParseExtendsInfo(AutoPtr<ASTInterfaceType> &interfaceType); 215ca0551cfSopenharmony_ci 216ca0551cfSopenharmony_ci bool CheckExtendsName(AutoPtr<ASTInterfaceType> &interfaceType, const std::string &extendsName); 217ca0551cfSopenharmony_ci 218ca0551cfSopenharmony_ci bool CheckExtendsVersion( 219ca0551cfSopenharmony_ci AutoPtr<ASTInterfaceType> &interfaceType, const std::string &extendsName, AutoPtr<AST> extendsAst); 220ca0551cfSopenharmony_ci 221ca0551cfSopenharmony_ci bool CheckImportsVersion(AutoPtr<AST> extendsAst); 222ca0551cfSopenharmony_ci 223ca0551cfSopenharmony_ci inline static bool IsPrimitiveType(Token token) 224ca0551cfSopenharmony_ci { 225ca0551cfSopenharmony_ci return token.kind >= TokenType::BOOLEAN && token.kind <= TokenType::ASHMEM; 226ca0551cfSopenharmony_ci } 227ca0551cfSopenharmony_ci 228ca0551cfSopenharmony_ci bool AddAst(const AutoPtr<AST> &ast); 229ca0551cfSopenharmony_ci 230ca0551cfSopenharmony_ci void LogError(const char *funcName, int fileLine, const std::string &message) 231ca0551cfSopenharmony_ci { 232ca0551cfSopenharmony_ci errors_.push_back(StringHelper::Format("[%s:%d] error:%s", funcName, fileLine, message.c_str())); 233ca0551cfSopenharmony_ci } 234ca0551cfSopenharmony_ci 235ca0551cfSopenharmony_ci void LogError(const char *funcName, int fileLine, const Token &token, const std::string &message) 236ca0551cfSopenharmony_ci { 237ca0551cfSopenharmony_ci errors_.push_back(StringHelper::Format("[%s:%d] [%s] error:%s", 238ca0551cfSopenharmony_ci funcName, fileLine, LocInfo(token).c_str(), message.c_str())); 239ca0551cfSopenharmony_ci } 240ca0551cfSopenharmony_ci 241ca0551cfSopenharmony_ci void LogErrorBeforeToken(const char *funcName, int fileLine, const Token &token, const std::string &message) 242ca0551cfSopenharmony_ci { 243ca0551cfSopenharmony_ci errors_.push_back(StringHelper::Format("[%s:%d] [%s] error:%s before '%s' token", 244ca0551cfSopenharmony_ci funcName, fileLine, LocInfo(token).c_str(), message.c_str(), token.value.c_str())); 245ca0551cfSopenharmony_ci } 246ca0551cfSopenharmony_ci 247ca0551cfSopenharmony_ci void ShowError(); 248ca0551cfSopenharmony_ci 249ca0551cfSopenharmony_ci bool PostProcess(); 250ca0551cfSopenharmony_ci 251ca0551cfSopenharmony_ci bool CheckExistExtends(); 252ca0551cfSopenharmony_ci 253ca0551cfSopenharmony_ci bool GetGenVersion(std::vector<size_t> &version, std::string &genPackageName); 254ca0551cfSopenharmony_ci 255ca0551cfSopenharmony_ci void GetGenNamespace(AutoPtr<ASTNamespace> &ns); 256ca0551cfSopenharmony_ci 257ca0551cfSopenharmony_ci void SortAstByName(AstMergeMap &mergeMap, StrAstMap &allAsts); 258ca0551cfSopenharmony_ci 259ca0551cfSopenharmony_ci void MergeAsts(AstMergeMap &mergeMap); 260ca0551cfSopenharmony_ci 261ca0551cfSopenharmony_ci void MergeAst(AutoPtr<AST> &targetAst, AutoPtr<AST> sourceAst); 262ca0551cfSopenharmony_ci 263ca0551cfSopenharmony_ci void MergeImport(AutoPtr<AST> &targetAst, AutoPtr<AST> sourceAst); 264ca0551cfSopenharmony_ci 265ca0551cfSopenharmony_ci void MergeInterfaceDef(AutoPtr<AST> &targetAst, AutoPtr<AST> sourceAst); 266ca0551cfSopenharmony_ci 267ca0551cfSopenharmony_ci void MergeTypes(AutoPtr<AST> &targetAst, AutoPtr<AST> sourceAst); 268ca0551cfSopenharmony_ci 269ca0551cfSopenharmony_ci void MergeSequenceableDef(AutoPtr<AST> &targetAst, AutoPtr<AST> sourceAst); 270ca0551cfSopenharmony_ci 271ca0551cfSopenharmony_ci void MergeTypeDefinitions(AutoPtr<AST> &targetAst, AutoPtr<AST> sourceAst); 272ca0551cfSopenharmony_ci 273ca0551cfSopenharmony_ci void ModifyImport(StrAstMap &allAsts, std::string &genPackageName); 274ca0551cfSopenharmony_ci 275ca0551cfSopenharmony_ci void ModifyPackageNameAndVersion(StrAstMap &allAsts, std::string &genPackageName, std::vector<size_t> genVersion); 276ca0551cfSopenharmony_ci 277ca0551cfSopenharmony_ci void ModifyInterfaceNamespace(AutoPtr<ASTNamespace> &ns); 278ca0551cfSopenharmony_ci 279ca0551cfSopenharmony_ci Lexer lexer_; 280ca0551cfSopenharmony_ci std::vector<std::string> errors_; 281ca0551cfSopenharmony_ci AutoPtr<AST> ast_; 282ca0551cfSopenharmony_ci StrAstMap allAsts_; 283ca0551cfSopenharmony_ci std::string freezecontrolAttr_; 284ca0551cfSopenharmony_ci}; 285ca0551cfSopenharmony_ci} // namespace Idl 286ca0551cfSopenharmony_ci} // namespace OHOS 287ca0551cfSopenharmony_ci 288ca0551cfSopenharmony_ci#endif // OHOS_IDL_PARSER_H