/* * Copyright (c) 2021-2023 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. * See the LICENSE file in the root of this repository for complete details. */ #ifndef OHOS_HDI_PARSER_H #define OHOS_HDI_PARSER_H #include #include #include #include "ast/ast.h" #include "ast/ast_attribute.h" #include "ast/ast_interface_type.h" #include "ast/ast_method.h" #include "ast/ast_type.h" #include "lexer/lexer.h" #include "preprocessor/preprocessor.h" #include "util/autoptr.h" #include "util/light_refcount_base.h" #include "util/options.h" namespace OHOS { namespace HDI { using AttrSet = std::set; struct AstCompare { bool operator()(const AutoPtr &lhs, const AutoPtr &rhs) const { return lhs->GetMinorVer() < rhs->GetMinorVer(); } }; using AstMergeMap = std::map, AstCompare>>; class Parser { public: Parser() = default; ~Parser() = default; bool Parse(const std::vector &fileDetails); using StrAstMap = std::unordered_map>; inline const StrAstMap &GetAllAst() const { return allAsts_; } private: class Attribute : public LightRefCountBase { public: bool isOneWay = false; bool isCallback = false; bool isFull = false; bool isLite = false; }; bool ParseOne(const std::string &sourceFile); bool Reset(const std::string &sourceFile); bool ParseFile(); std::string ParseLicense(); bool ParsePackage(); bool ParserPackageInfo(const std::string &packageName); bool ParseImports(); void ParseImportInfo(); void ParseSequenceableInfo(); bool ParseTypeDecls(); // parse attributes of type void ParseAttribute(); AttrSet ParseAttributeInfo(); bool AprseAttrUnit(AttrSet &attrs); // parse interface type void ParseInterface(const AttrSet &attrs = {}); AutoPtr ParseInfAttrInfo(const AttrSet &attrs); void CheckInterfaceAttr(const AutoPtr &interface, Token token); void ParseInterfaceBody(const AutoPtr &interface); AutoPtr ParseMethod(const AutoPtr &interface); AutoPtr ParseMethodAttr(); AutoPtr CreateGetVersionMethod(); void CheckMethodAttr(const AutoPtr &interface, const AutoPtr &method); void ParseMethodParamList(const AutoPtr &method); AutoPtr ParseParam(); AutoPtr ParseParamAttr(); // parse type AutoPtr ParseType(); AutoPtr ParseBasicType(); AutoPtr ParseUnsignedType(); AutoPtr ParseArrayType(const AutoPtr &elementType); AutoPtr ParseListType(); AutoPtr ParseMapType(); AutoPtr ParseSmqType(); AutoPtr ParseUserDefType(); // parse declaration of enum void ParseEnumDeclaration(const AttrSet &attrs = {}); AutoPtr ParseEnumBaseType(); void ParserEnumMember(const AutoPtr &enumType); // parse declaration of struct void ParseStructDeclaration(const AttrSet &attrs = {}); AutoPtr ParseStructParentType(); void ParseStructMember(const AutoPtr &structType); // parse declaration of union void ParseUnionDeclaration(const AttrSet &attrs = {}); void ParseUnionMember(const AutoPtr &unionType); bool AddUnionMember( const AutoPtr &unionType, const AutoPtr &type, const std::string &name) const; AutoPtr ParseUserDefTypeAttr(const AttrSet &attrs); // parse expression AutoPtr ParseExpr(); AutoPtr ParseAndExpr(); AutoPtr ParseXorExpr(); AutoPtr ParseOrExpr(); AutoPtr ParseShiftExpr(); AutoPtr ParseAddExpr(); AutoPtr ParseMulExpr(); AutoPtr ParseUnaryExpr(); AutoPtr ParsePrimaryExpr(); AutoPtr ParseNumExpr(); AutoPtr ParseEnumExpr(); bool CheckNumber(const std::string& integerVal) const; bool CheckType(const Token &token, const AutoPtr &type); bool CheckTypeByMode(const Token &token, const AutoPtr &type); void SetAstFileType(); bool CheckIntegrity(); bool CheckInterfaceAst(); bool CheckCallbackAst(); bool CheckPackageName(const std::string &filePath, const std::string &packageName) const; bool CheckImport(const std::string &importName); void ParseInterfaceExtends(AutoPtr &interface); void ParseExtendsInfo(AutoPtr &interfaceType); bool CheckExtendsName(AutoPtr &interfaceType, const std::string &extendsName); bool CheckExtendsVersion( AutoPtr &interfaceType, const std::string &extendsName, AutoPtr extendsAst); bool CheckImportsVersion(AutoPtr extendsAst); void SetInterfaceVersion(AutoPtr &interfaceType); inline static bool IsPrimitiveType(Token token) { return token.kind >= TokenType::BOOLEAN && token.kind <= TokenType::ASHMEM; } bool AddAst(const AutoPtr &ast); void LogError(const std::string &message); void LogError(const Token &token, const std::string &message); void ShowError(); bool PostProcess(); bool CheckExistExtends(); bool GetGenVersion(std::vector &version, std::string &genPackageName); void GetGenNamespace(AutoPtr &ns); void SortAstByName(AstMergeMap &mergeMap, StrAstMap &allAsts); void MergeAsts(AstMergeMap &mergeMap); void MergeAst(AutoPtr &targetAst, AutoPtr sourceAst); void MergeImport(AutoPtr &targetAst, AutoPtr sourceAst); void MergeInterfaceDef(AutoPtr &targetAst, AutoPtr sourceAst); void MergeTypes(AutoPtr &targetAst, AutoPtr sourceAst); void MergeSequenceableDef(AutoPtr &targetAst, AutoPtr sourceAst); void MergeTypeDefinitions(AutoPtr &targetAst, AutoPtr sourceAst); void ModifyImport(StrAstMap &allAsts, std::string &genPackageName); void ModifyPackageNameAndVersion(StrAstMap &allAsts, std::string &genPackageName, std::vector genVersion); void ModifyInterfaceNamespace(AutoPtr &ns); Lexer lexer_; std::vector errors_; AutoPtr ast_; StrAstMap allAsts_; }; } // namespace HDI } // namespace OHOS #endif // OHOS_HDI_PARSER_H