• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  *
4  * HDF is dual licensed: you can use it either under the terms of
5  * the GPL, or the BSD license, at your option.
6  * See the LICENSE file in the root of this repository for complete details.
7  */
8 
9 #ifndef OHOS_HDI_CPP_CODE_EMITTER_H
10 #define OHOS_HDI_CPP_CODE_EMITTER_H
11 
12 #include "ast/ast.h"
13 #include "codegen/code_emitter.h"
14 #include "util/autoptr.h"
15 #include "util/string_builder.h"
16 
17 namespace OHOS {
18 namespace HDI {
19 class CppCodeEmitter : public CodeEmitter {
20 public:
21     ~CppCodeEmitter() override = default;
22 
23     bool OutPut(const AutoPtr<AST> &ast, const std::string &targetDirectory);
24 
25 protected:
26     void GetStdlibInclusions(HeaderFile::HeaderFileSet &headerFiles);
27 
28     void GetImportInclusions(HeaderFile::HeaderFileSet &headerFiles);
29 
30     void EmitInterfaceMethodParameter(
31         const AutoPtr<ASTParameter> &param, StringBuilder &sb, const std::string &prefix) const;
32 
33     void EmitLicense(StringBuilder &sb);
34 
35     void EmitHeadMacro(StringBuilder &sb, const std::string &fullName) const;
36 
37     void EmitTailMacro(StringBuilder &sb, const std::string &fullName) const;
38 
39     void EmitHeadExternC(StringBuilder &sb) const;
40 
41     void EmitTailExternC(StringBuilder &sb) const;
42 
43     bool IsVersion(const std::string &name) const;
44 
45     std::vector<std::string> EmitCppNameSpaceVec(const std::string &namespaceStr) const;
46 
47     std::string EmitPackageToNameSpace(const std::string &packageName) const;
48 
49     virtual void EmitBeginNamespace(StringBuilder &sb);
50 
51     virtual void EmitEndNamespace(StringBuilder &sb);
52 
53     virtual void EmitUsingNamespace(StringBuilder &sb);
54 
55     std::string EmitNamespace(const std::string &packageName) const;
56 
57     void EmitImportUsingNamespace(StringBuilder &sb);
58 
59     void EmitWriteMethodParameter(const AutoPtr<ASTParameter> &param, const std::string &parcelName, StringBuilder &sb,
60         const std::string &prefix) const;
61 
62     void EmitReadMethodParameter(const AutoPtr<ASTParameter> &param, const std::string &parcelName, bool initVariable,
63         StringBuilder &sb, const std::string &prefix) const;
64 
65     std::string MacroName(const std::string &name) const;
66 
67     std::string SpecificationParam(StringBuilder &paramSb, const std::string &prefix) const;
68 
69     std::string EmitHeaderNameByInterface(AutoPtr<ASTInterfaceType> interface, const std::string &name);
70 
71     std::string EmitDefinitionByInterface(AutoPtr<ASTInterfaceType> interface, const std::string &name) const;
72 
73     std::string GetNameSpaceByInterface(AutoPtr<ASTInterfaceType> interface, const std::string &name);
74 };
75 } // namespace HDI
76 } // namespace OHOS
77 
78 #endif // OHOS_HDI_CPP_CODE_EMITTER_H