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