1 /*
2 * Copyright (c) 2021-2022 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 #include "codegen/code_generator.h"
10 #include "codegen/c_client_proxy_code_emitter.h"
11 #include "codegen/c_custom_types_code_emitter.h"
12 #include "codegen/c_interface_code_emitter.h"
13 #include "codegen/c_service_driver_code_emitter.h"
14 #include "codegen/c_service_impl_code_emitter.h"
15 #include "codegen/c_service_stub_code_emitter.h"
16 #include "codegen/cpp_client_proxy_code_emitter.h"
17 #include "codegen/cpp_custom_types_code_emitter.h"
18 #include "codegen/cpp_interface_code_emitter.h"
19 #include "codegen/cpp_service_driver_code_emitter.h"
20 #include "codegen/cpp_service_impl_code_emitter.h"
21 #include "codegen/cpp_service_stub_code_emitter.h"
22 #include "codegen/java_client_interface_code_emitter.h"
23 #include "codegen/java_client_proxy_code_emitter.h"
24 #include "util/options.h"
25
26 namespace OHOS {
27 namespace HDI {
28 CodeEmitMap CodeGenerator::cCodeEmitters_ = {
29 {"types", new CCustomTypesCodeEmitter() },
30 {"interface", new CInterfaceCodeEmitter() },
31 {"proxy", new CClientProxyCodeEmitter() },
32 {"driver", new CServiceDriverCodeEmitter()},
33 {"stub", new CServiceStubCodeEmitter() },
34 {"impl", new CServiceImplCodeEmitter() },
35 };
36
37 CodeEmitMap CodeGenerator::cppCodeEmitters_ = {
38 {"types", new CppCustomTypesCodeEmitter() },
39 {"interface", new CppInterfaceCodeEmitter() },
40 {"proxy", new CppClientProxyCodeEmitter() },
41 {"driver", new CppServiceDriverCodeEmitter()},
42 {"stub", new CppServiceStubCodeEmitter() },
43 {"impl", new CppServiceImplCodeEmitter() },
44 };
45
46 CodeEmitMap CodeGenerator::javaCodeEmitters_ = {
47 {"clientIface", new JavaClientInterfaceCodeEmitter()},
48 {"proxy", new JavaClientProxyCodeEmitter() },
49 };
50
Generate()51 bool CodeGenerator::Generate()
52 {
53 const Options &options = Options::GetInstance();
54 std::string dir = options.GetGenerationDirectory();
55 Options::Language language = options.GetTargetLanguage();
56 bool isModeKernel = options.DoGenerateKernelCode();
57 std::string codePart = options.GetCodePart();
58
59 for (const auto &astPair : allAst_) {
60 AutoPtr<AST> ast = astPair.second;
61 switch (language) {
62 case Options::Language::C:
63 GenerateCCode(ast, dir, codePart, isModeKernel);
64 break;
65 case Options::Language::CPP:
66 GenerateCppCode(ast, dir, codePart);
67 break;
68 case Options::Language::JAVA:
69 GenerateJavaCode(ast, dir, codePart);
70 break;
71 default:
72 break;
73 }
74 }
75
76 return true;
77 }
78
GenerateCCode(const AutoPtr<AST> & ast,const std::string & outDir,const std::string & codePart,bool isKernel)79 void CodeGenerator::GenerateCCode(
80 const AutoPtr<AST> &ast, const std::string &outDir, const std::string &codePart, bool isKernel)
81 {
82 switch (ast->GetASTFileType()) {
83 case ASTFileType::AST_TYPES: {
84 cCodeEmitters_["types"]->OutPut(ast, outDir, isKernel);
85 break;
86 }
87 case ASTFileType::AST_IFACE: {
88 if (codePart == "client") {
89 cCodeEmitters_["interface"]->OutPut(ast, outDir, isKernel);
90 cCodeEmitters_["proxy"]->OutPut(ast, outDir, isKernel);
91 break;
92 } else if (codePart == "server") {
93 cCodeEmitters_["interface"]->OutPut(ast, outDir, isKernel);
94 cCodeEmitters_["driver"]->OutPut(ast, outDir, isKernel);
95 cCodeEmitters_["stub"]->OutPut(ast, outDir, isKernel);
96 cCodeEmitters_["impl"]->OutPut(ast, outDir, isKernel);
97 break;
98 } else {
99 cCodeEmitters_["interface"]->OutPut(ast, outDir, isKernel);
100 cCodeEmitters_["proxy"]->OutPut(ast, outDir, isKernel);
101 cCodeEmitters_["driver"]->OutPut(ast, outDir, isKernel);
102 cCodeEmitters_["stub"]->OutPut(ast, outDir, isKernel);
103 cCodeEmitters_["impl"]->OutPut(ast, outDir, isKernel);
104 }
105 break;
106 }
107 case ASTFileType::AST_ICALLBACK:
108 // khdf doesn't support callback
109 cCodeEmitters_["interface"]->OutPut(ast, outDir);
110 cCodeEmitters_["proxy"]->OutPut(ast, outDir);
111 cCodeEmitters_["driver"]->OutPut(ast, outDir);
112 cCodeEmitters_["stub"]->OutPut(ast, outDir);
113 cCodeEmitters_["impl"]->OutPut(ast, outDir);
114 break;
115 default:
116 break;
117 }
118 }
119
GenerateCppCode(const AutoPtr<AST> & ast,const std::string & outDir,const std::string & codePart)120 void CodeGenerator::GenerateCppCode(const AutoPtr<AST> &ast, const std::string &outDir, const std::string &codePart)
121 {
122 switch (ast->GetASTFileType()) {
123 case ASTFileType::AST_TYPES:
124 cppCodeEmitters_["types"]->OutPut(ast, outDir);
125 break;
126 case ASTFileType::AST_IFACE: {
127 if (codePart == "client") {
128 cppCodeEmitters_["interface"]->OutPut(ast, outDir);
129 cppCodeEmitters_["proxy"]->OutPut(ast, outDir);
130 } else if (codePart == "server") {
131 cppCodeEmitters_["interface"]->OutPut(ast, outDir);
132 cppCodeEmitters_["driver"]->OutPut(ast, outDir);
133 cppCodeEmitters_["stub"]->OutPut(ast, outDir);
134 cppCodeEmitters_["impl"]->OutPut(ast, outDir);
135 } else {
136 cppCodeEmitters_["interface"]->OutPut(ast, outDir);
137 cppCodeEmitters_["proxy"]->OutPut(ast, outDir);
138 cppCodeEmitters_["driver"]->OutPut(ast, outDir);
139 cppCodeEmitters_["stub"]->OutPut(ast, outDir);
140 cppCodeEmitters_["impl"]->OutPut(ast, outDir);
141 }
142 break;
143 }
144 case ASTFileType::AST_ICALLBACK:
145 cppCodeEmitters_["interface"]->OutPut(ast, outDir);
146 cppCodeEmitters_["proxy"]->OutPut(ast, outDir);
147 cppCodeEmitters_["driver"]->OutPut(ast, outDir);
148 cppCodeEmitters_["stub"]->OutPut(ast, outDir);
149 cppCodeEmitters_["impl"]->OutPut(ast, outDir);
150 break;
151 default:
152 break;
153 }
154 }
155
GenerateJavaCode(const AutoPtr<AST> & ast,const std::string & outDir,const std::string & codePart)156 void CodeGenerator::GenerateJavaCode(const AutoPtr<AST> &ast, const std::string &outDir, const std::string &codePart)
157 {
158 switch (ast->GetASTFileType()) {
159 case ASTFileType::AST_IFACE:
160 javaCodeEmitters_["clientIface"]->OutPut(ast, outDir);
161 javaCodeEmitters_["proxy"]->OutPut(ast, outDir);
162 break;
163 case ASTFileType::AST_ICALLBACK:
164 javaCodeEmitters_["clientIface"]->OutPut(ast, outDir);
165 javaCodeEmitters_["proxy"]->OutPut(ast, outDir);
166 break;
167 default:
168 break;
169 }
170 }
171 } // namespace HDI
172 } // namespace OHOS