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> ¶m, 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> ¶m, const std::string &parcelName, StringBuilder &sb, 60 const std::string &prefix) const; 61 62 void EmitReadMethodParameter(const AutoPtr<ASTParameter> ¶m, 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 ¶mSb, 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